单片机学习小组
直播中

张静

7年用户 1434经验值
私信 关注

NUC131的M0芯片UART能用半双工模式吗?

新塘NUC131的M0的芯片,请问各路大神,串口能实现半双工模式吗?软件上怎么实现,底层如何配置?有事例代码否?急求!!!!

回帖(1)

哔哔哔-

2024-4-24 18:08:03
NUC131的M0芯片UART是支持半双工模式的。

在软件上实现半双工模式需要对UART的寄存器进行配置,底层的具体配置方法可以参考NUC131相关的官方文档或者资料手册。一般需要配置数据位、波特率、停止位、校验位等参数,同时也需要配置工作模式等参数以支持半双工模式。

以下是一个示例代码,展示如何使用NUC131的M0芯片UART实现半双工模式:

```c
#include "NUC131.h"

#define BUF_SIZE    16
#define UART_PORT   UART0

volatile char g_buf[BUF_SIZE];
volatile uint32_t g_u32comRbytes = 0;
volatile uint32_t g_u32comRhead = 0;
volatile uint32_t g_u32comRtail = 0;

void UART0_IRQHandler(void)
{
    uint8_t u8InChar = 0xFF;
    uint32_t u32IntSts = UART_PORT->ISR;

    if(u32IntSts & UART_ISR_RDA_IF_Msk)
    {
        /* Get all the input characters */
        while(UART_GET_RX_EMPTY(UART_PORT) != 1)
        {
            /* Get the character from UART Buffer */
            u8InChar = UART_READ(UART_PORT);

            /* Check if buffer full */
            if(g_u32comRbytes < BUF_SIZE)
            {
                /* Enqueue the character */
                g_buf[g_u32comRtail++] = u8InChar;

                if(g_u32comRtail >= BUF_SIZE)
                    g_u32comRtail = 0;

                g_u32comRbytes++;
            }
        }
    }
}

void UART0_Init(void)
{
    /* Enable UART0 module clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Select UART0 module clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_MASK, CLK_CLKDIV_UART(1));

    /* Set PA.0 and PA.1 as UART0 RXD and TXD pins */
    SYS->PA_H_MFP &= ~(SYS_PA_H_MFP_PA14_MFP_Msk | SYS_PA_H_MFP_PA15_MFP_Msk);
    SYS->PA_H_MFP |= SYS_PA_H_MFP_PA14_MFP_UART0_RXD | SYS_PA_H_MFP_PA15_MFP_UART0_TXD;
    SYS->ALT_MFP &= ~(SYS_ALT_MFP_PA14_ALT_Msk | SYS_ALT_MFP_PA15_ALT_Msk);
    SYS->ALT_MFP |= SYS_ALT_MFP_PA14_UART0_RXD | SYS_ALT_MFP_PA15_UART0_TXD;

    /* Configure UART0 as 115200 baudrate, 8-bit data, no parity, 1-stop bit */
    UART_Open(UART_PORT, 115200);

    /* Enable UART0 interrupt and receive interrupt */
    UART_ENABLE_INT(UART_PORT, UART_IER_RDA_IE_Msk);
    NVIC_EnableIRQ(UART0_IRQn);
}

void UART_SendByte(uint8_t u8Data)
{
    while(UART_IS_TX_FULL(UART_PORT));
    UART_WRITE(UART_PORT, u8Data);
}

void UART_SendString(char *s)
{
    while(*s != '')
    {
        while(UART_IS_TX_FULL(UART_PORT));
        UART_WRITE(UART_PORT, *s++);
    }
}

int main(void)
{
    char buffer[32] = {0};

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Initialize system clock and peripherals */
    SystemInit();

    /* Initialize UART */
    UART0_Init();

    /* Lock protected registers */
    SYS_LockReg();

    while(1)
    {
        /* Check if there is any data received */
        if(g_u32comRbytes)
        {
            /* Dequeue the character */
            buffer[0] = g_buf[g_u32comRhead++];

            if(g_u32comRhead >= BUF_SIZE)
                g_u32comRhead = 0;

            g_u32comRbytes--;

            /* Echo the character */
            UART_SendByte(buffer[0]);
        }

        /* Check if there is any incoming data from another device */
        if(UART_IS_RX_READY(UART_PORT))
        {
            /* Dequeue the character */
            buffer[0] = UART_READ(UART_PORT);

            /* Process the incoming data */
            //...

            /* Echo the character */
            UART_SendByte(buffer[0]);
        }
    }
}
```
举报

更多回帖

发帖
×
20
完善资料,
赚取积分