打印
[技术问答]

关于M451的串口接收问题

[复制链接]
1018|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerwang921|  楼主 | 2019-9-17 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,现在有个问题向想大家请教下,大概是这样的情况:
由于新项目使用了新唐的M451,由于对款MCU不熟悉,今天碰到一个串口接收的问题,弄了很久没有搞定,可否麻烦大家说下串口接收的用法,就以串口0为例,我不是很明白这个串口中断函数里会有一个UART_INTSTS_RDAINT_Msk和一个UART_INTSTS_RXTOINT_Msk,一个数据接收中断和一个接收超时中断,怎么样区分,为什么两个一起用?还有个问题,我老是一次只能收到16个字节的数据,反复测试了都不行,麻烦大家帮忙详细说明M451串口的使用方法和配置代码,比如,我现在要接收长度大于16字节的数据,该如何配置,总这对个串口实在头大,之前使用STM32的串口简单明了,在此先谢谢大家了!

使用特权

评论回复
沙发
powerwang921|  楼主 | 2019-9-17 15:53 | 只看该作者
我的串口0初始配置代码如下,也不是很懂:
void UART0_Init(void)//visual data process
{
        memset(Uart0_rx_buf,0,sizeof(Uart0_rx_buf));
        memset(Uart0_tx_buf,0,sizeof(Uart0_tx_buf));
        Uart0_rx_Count = 0;                        //接收字节个数       
      Uart0_tx_Count = 0;                        //发送字节个数
        Uart0_rx_P = 0;                                //接收指针
        Uart0_tx_P = 0;                                //发送指针
        Uart0_rx_Finish = 0;                //接收完成标志
        Uart0_tx_Finish = 0;                //发送完成标志
       
        SYS->GPD_MFPL = SYS_GPD_MFPL_PD1MFP_UART0_TXD | SYS_GPD_MFPL_PD0MFP_UART0_RXD;
       
    SYS_ResetModule(UART0_RST);
    UART_Open(UART0, 115200);
       
        UART0->FIFO &= ~UART_FIFO_RFITL_Msk;
        UART0->FIFO |= UART_FIFO_RFITL_14BYTES;
    //UART0->FIFO|=UART_FIFO_RFITL_1BYTE;
       
        UART_SetTimeoutCnt(UART0, 40);
       
    UART_EnableInt(UART0, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk));
//        NVIC_EnableIRQ(UART0_IRQn);
}

使用特权

评论回复
板凳
powerwang921|  楼主 | 2019-9-17 16:02 | 只看该作者
这个是中断处理函数,是之前的工程师做的
void UART0_TEST_HANDLE(void)//for visual data process
{
    uint8_t u8InChar = 0xFF;
        uint8_t i;
   
    uint32_t u32IntSts = UART0->INTSTS;
    //接收有效数据
    if(u32IntSts & UART_INTSTS_RDAINT_Msk)
    {      
        while(UART_GET_RX_EMPTY(UART0)==0)
        {
            //read data
            u8InChar = UART_READ(UART0);
            Uart0_rx_buf[Uart0_rx_P]=u8InChar;
                        Uart0_rx_P
    }
   
        //接收超时中断
        if(u32IntSts & UART_INTSTS_RXTOINT_Msk)
    {
        //Uart0_tx_Finish = 0;
        //Uart0_rx_P = 0;
                /*i=0;
        while(UART_GET_RX_EMPTY(UART0)==0)
        {
            u8InChar = UART_READ(UART0);
            Uart0_rx_buf[Uart0_rx_P]=u8InChar;
                        Uart0_rx_P ++;      
            
               
                If (Uart0_rx_P==32)      
                           {
                                Uart0_rx_Finish = 1;
                Uart0_rx_Count = Uart0_rx_P;
                Uart0_rx_P = 0;
                             }

               

        
   
        //发送完成中断
    if(u32IntSts & UART_INTSTS_THREINT_Msk)
    {
                if(Uart0_tx_P<Uart0_tx_Count)
                {
                        i=0;
                        while(UART_GET_TX_FULL(UART0)==0)
                        {
                                u8InChar=Uart0_tx_buf[Uart0_tx_P];
                                UART_WRITE(UART0,u8InChar);
                                Uart0_tx_P ++;
                                i++;
                                if(Uart0_tx_P>=Uart0_tx_Count)
                                {                                        UART_DISABLE_INT(UART0, UART_INTEN_THREIEN_Msk);
                                        Uart0_tx_Finish = 0;
                                        Uart0_tx_P = 0;
                                        break;
                                }
                                if(i>=16)break;
                        }
                }
                else
                {
                        UART_DISABLE_INT(UART0, UART_INTEN_THREIEN_Msk);
                        Uart0_tx_Finish = 0;
                        Uart0_tx_P = 0;
                }
    }
}

使用特权

评论回复
地板
wahahaheihei| | 2019-9-17 23:03 | 只看该作者
16个字节是不是串口的接收缓存就这么大啊,接收完16个后读取出来应该就可以继续接收了。

使用特权

评论回复
5
wahahaheihei| | 2019-9-17 23:04 | 只看该作者
同时使能两种中断,接收完成中断,和接收超时中断,完成中断用于处理正常的接收事件,超时中断用于处理异常的接收事件。

使用特权

评论回复
6
wahahaheihei| | 2019-9-17 23:04 | 只看该作者
以上纯属个人猜测

使用特权

评论回复
7
wanduzi| | 2019-9-17 23:48 | 只看该作者
能用就行了,库函数不用纠结具体怎么回事吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

24

帖子

0

粉丝