[技术问答] m451串口问题

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

我的串口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);
}

这个是中断处理函数,是之前的工程师做的
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:05 | 显示全部楼层
另外楼主可以看看例子和库函数,库函数原型有介绍各个参数,另外配合手册上介绍看看。
dongnanxibei 发表于 2019-9-17 23:55 | 显示全部楼层
通过接收中断实现持续接收吧
dongnanxibei 发表于 2019-9-17 23:55 | 显示全部楼层
另外那个缓存应该可以设置
dongnanxibei 发表于 2019-9-17 23:56 | 显示全部楼层
我没下载451的例子,但是我看051做的挺好的啊
  1. /****************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 10 $
  5. * $Date: 15/05/22 2:52p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Transmit and receive data with auto flow control.
  7. *           This sample code needs to work with UART_Autoflow_Master.
  8. *
  9. * @note
  10. * Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "M051Series.h"


  15. #define PLL_CLOCK           50000000


  16. #define RXBUFSIZE 1024

  17. /*---------------------------------------------------------------------------------------------------------*/
  18. /* Global variables                                                                                        */
  19. /*---------------------------------------------------------------------------------------------------------*/
  20. uint8_t g_u8SendData[12] = {0};
  21. uint8_t g_u8RecData[RXBUFSIZE]  = {0};
  22. volatile int32_t g_i32pointer = 0;

  23. /*---------------------------------------------------------------------------------------------------------*/
  24. /* Define functions prototype                                                                              */
  25. /*---------------------------------------------------------------------------------------------------------*/
  26. extern char GetChar(void);
  27. int32_t main(void);
  28. void AutoFlow_FunctionRxTest(void);


  29. void SYS_Init(void)
  30. {
  31.     /*---------------------------------------------------------------------------------------------------------*/
  32.     /* Init System Clock                                                                                       */
  33.     /*---------------------------------------------------------------------------------------------------------*/

  34.     /* Enable Internal RC 22.1184MHz clock */
  35.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  36.     /* Waiting for Internal RC clock ready */
  37.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  38.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  39.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  40.     /* Enable external XTAL 12MHz clock */
  41.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  42.     /* Waiting for external XTAL clock ready */
  43.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  44.     /* Set core clock as PLL_CLOCK from PLL */
  45.     CLK_SetCoreClock(PLL_CLOCK);

  46.     /* Enable UART module clock */
  47.     CLK_EnableModuleClock(UART0_MODULE);
  48.     CLK_EnableModuleClock(UART1_MODULE);

  49.     /* Select UART module clock source */
  50.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
  51.     CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  52.     /*---------------------------------------------------------------------------------------------------------*/
  53.     /* Init I/O Multi-function                                                                                 */
  54.     /*---------------------------------------------------------------------------------------------------------*/

  55.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  56.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  57.     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

  58.     /* Set P1 multi-function pins for UART1 RXD and TXD */
  59.     SYS->P1_MFP &= ~(SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);
  60.     SYS->P1_MFP |= (SYS_MFP_P12_RXD1 | SYS_MFP_P13_TXD1);

  61.     /* Set P0 multi-function pins for UART1 RTS */
  62.     SYS->P0_MFP = SYS->P0_MFP & (~SYS_MFP_P01_Msk) | SYS_MFP_P01_RTS1;

  63. }

  64. void UART0_Init()
  65. {
  66.     /*---------------------------------------------------------------------------------------------------------*/
  67.     /* Init UART                                                                                               */
  68.     /*---------------------------------------------------------------------------------------------------------*/
  69.     /* Reset UART0 */
  70.     SYS_ResetModule(UART0_RST);

  71.     /* Configure UART0 and set UART0 Baudrate */
  72.     UART_Open(UART0, 115200);
  73. }

  74. void UART1_Init()
  75. {
  76.     /*---------------------------------------------------------------------------------------------------------*/
  77.     /* Init UART                                                                                               */
  78.     /*---------------------------------------------------------------------------------------------------------*/
  79.     /* Reset UART1 */
  80.     SYS_ResetModule(UART1_RST);

  81.     /* Configure UART1 and set UART1 Baudrate */
  82.     UART_Open(UART1, 115200);
  83. }

  84. /*---------------------------------------------------------------------------------------------------------*/
  85. /* MAIN function                                                                                           */
  86. /*---------------------------------------------------------------------------------------------------------*/

  87. int main(void)
  88. {

  89.     /* Unlock protected registers */
  90.     SYS_UnlockReg();

  91.     /* Init System, peripheral clock and multi-function I/O */
  92.     SYS_Init();

  93.     /* Lock protected registers */
  94.     SYS_LockReg();

  95.     /* Init UART0 for printf */
  96.     UART0_Init();

  97.     /* Init UART1 for testing */
  98.     UART1_Init();

  99.     /*---------------------------------------------------------------------------------------------------------*/
  100.     /* SAMPLE CODE                                                                                             */
  101.     /*---------------------------------------------------------------------------------------------------------*/

  102.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

  103.     printf("\n\nUART Sample Program\n");

  104.     /* UART auto flow sample slave function */
  105.     AutoFlow_FunctionRxTest();

  106.     while(1);

  107. }

  108. /*---------------------------------------------------------------------------------------------------------*/
  109. /* ISR to handle UART Channel 1 interrupt event                                                            */
  110. /*---------------------------------------------------------------------------------------------------------*/
  111. void UART1_IRQHandler(void)
  112. {
  113.     volatile uint32_t u32IntSts = UART1->ISR;;

  114.     /* Rx Ready or Time-out INT */
  115.     if(UART_GET_INT_FLAG(UART1, UART_ISR_RDA_INT_Msk) ||  UART_GET_INT_FLAG(UART1, UART_ISR_TOUT_INT_Msk))
  116.     {
  117.         /* Handle received data */
  118.         g_u8RecData[g_i32pointer] = UART_READ(UART1);
  119.         g_i32pointer++;
  120.     }
  121. }
  122. /*---------------------------------------------------------------------------------------------------------*/
  123. /*  AutoFlow Function Test (Slave)                                                                         */
  124. /*---------------------------------------------------------------------------------------------------------*/
  125. void AutoFlow_FunctionRxTest()
  126. {
  127.     uint32_t u32i;

  128.     printf("\n");
  129.     printf("+-----------------------------------------------------------+\n");
  130.     printf("|     Pin Configure                                         |\n");
  131.     printf("+-----------------------------------------------------------+\n");
  132.     printf("|    _______                                    _______     |\n");
  133.     printf("|   |       |                                  |       |    |\n");
  134.     printf("|   |Master |---TXD1(P1.3) <====> RXD1(P1.2)---| Slave |    |\n");
  135.     printf("|   |       |---CTS1(P0.0) <====> RTS1(P0.1)---|       |    |\n");
  136.     printf("|   |_______|                                  |_______|    |\n");
  137.     printf("|                                                           |\n");
  138.     printf("+-----------------------------------------------------------+\n");

  139.     printf("\n");
  140.     printf("+-----------------------------------------------------------+\n");
  141.     printf("|       AutoFlow Function Test (Slave)                      |\n");
  142.     printf("+-----------------------------------------------------------+\n");
  143.     printf("|  Description :                                            |\n");
  144.     printf("|    The sample code needs two boards. One is Master and    |\n");
  145.     printf("|    the other is slave. Master will send 1k bytes data     |\n");
  146.     printf("|    to slave.Slave will check if received data is correct  |\n");
  147.     printf("|    after getting 1k bytes data.                           |\n");
  148.     printf("|    Press any key to start...                              |\n");
  149.     printf("+-----------------------------------------------------------+\n");
  150.     GetChar();

  151.     /* Enable RTS and CTS autoflow control */
  152.     UART_EnableFlowCtrl(UART1);

  153.     /* Set RTS Trigger Level as 8 bytes */
  154.     UART1->FCR &= ~UART_FCR_RTS_TRI_LEV_Msk;
  155.     UART1->FCR |= UART_FCR_RTS_TRI_LEV_8BYTES;

  156.     /* Enable RDA\RLS\RTO Interrupt  */
  157.     UART_ENABLE_INT(UART1, (UART_IER_RDA_IEN_Msk | UART_IER_RLS_IEN_Msk | UART_IER_RTO_IEN_Msk));

  158.     /* Set RX Trigger Level as 8 bytes */
  159.     UART1->FCR &= ~UART_FCR_RFITL_Msk;
  160.     UART1->FCR |= UART_FCR_RFITL_8BYTES;

  161.     /* Set Timeout time 0x3E bit-time and time-out counter enable */
  162.     UART_SetTimeoutCnt(UART1, 0x3E);

  163.     /* Enable UART1 IRQ */
  164.     NVIC_EnableIRQ(UART1_IRQn);

  165.     printf("\n Starting to receive data...\n");

  166.     /* Wait for receive 1k bytes data */
  167.     while(g_i32pointer < RXBUFSIZE);

  168.     /* Compare Data */
  169.     for(u32i = 0; u32i < RXBUFSIZE; u32i++)
  170.     {
  171.         if(g_u8RecData[u32i] != (u32i & 0xFF))
  172.         {
  173.             printf("Compare Data Failed\n");
  174.             while(1);
  175.         }
  176.     }
  177.     printf("\n Receive OK & Check OK\n");

  178.     /* Disable UART1 IRQ */
  179.     NVIC_DisableIRQ(UART1_IRQn);

  180.     /* Disable RDA\RLS\RTO Interrupt */
  181.     UART_DISABLE_INT(UART1, (UART_IER_RDA_IEN_Msk | UART_IER_RLS_IEN_Msk | UART_IER_RTO_IEN_Msk));

  182. }
hawthorn 发表于 2021-1-22 09:44 | 显示全部楼层
难道不是发了16个就break了吗
coshi 发表于 2021-2-6 10:10 | 显示全部楼层
无论什么型号单片机的串口都差不多啊
zljiu 发表于 2021-2-6 10:16 | 显示全部楼层
先试试官方的原版例程吧
wiba 发表于 2021-2-6 10:18 | 显示全部楼层
串口配置无非就是那么几项  但是别忘了配置io口和时钟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

24

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部