[技术问答] 请问UART5串口超时中断不执行是什么原因?有代码,谢谢。

[复制链接]
1819|2
 楼主| yukshing 发表于 2017-11-1 18:03 | 显示全部楼层 |阅读模式
在新唐的NUC131系列芯片数据手册看到UART5的串口超时中断是要设置超时计数器中断使能位TIME_OUT_EN还有RX超时中断使能位TOUT_IEN,还要把定时溢出中断比较器TOIC设值,值设为0x32;
因为数据是隔50ms来24位,所以打算用串口超时中断确定那50ms,虽然用定时器也可以,但是为什么不可以,请求大神们看看!
串口初始化都在UART5_INT()函数那里,程序执行了PB12会闪烁,如果超时函数执行了那么PF5也应该要亮暗,但是PF5就是没有亮,跟公司的大佬想了两个一直没想出个所以然。

  1. #include <stdio.h>
  2. #include "NUC131.h"

  3. #define  PLL_CLOCK   50000000
  4. #define  RXBUFSIZE   1024

  5. int32_t        main(void);

  6. void                UART5_HANDLE(void);

  7. void        SYS_Init(void)
  8. {
  9.     /* Enable Internal RC 22.1184MHz clock */
  10.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  11.     /* Waiting for Internal RC clock ready */
  12.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

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

  15.     /* Enable external XTAL 12MHz clock */
  16.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  17.     /* Waiting for external XTAL clock ready */
  18.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  19.     /* Set core clock as PLL_CLOCK from PLL */
  20.     CLK_SetCoreClock(PLL_CLOCK);

  21.     /* Enable UART module clock */
  22.     CLK_EnableModuleClock(UART2_MODULE);
  23.         CLK_EnableModuleClock(UART5_MODULE);
  24.                
  25.         /* Enable peripheral clock */
  26.     CLK_EnableModuleClock(TMR0_MODULE);
  27.                
  28.     /* Peripheral clock source */
  29.     CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HCLK, 0);


  30.     /* Select UART module clock source */
  31.     CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
  32.         CLK_SetModuleClock(UART5_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  33.     /* Init I/O Multi-function */
  34.     SYS->GPA_MFP  &= ~(SYS_GPA_MFP_PA12_Msk);
  35.     SYS->GPA_MFP  |=  (SYS_GPA_MFP_PA12_UART5_RXD);
  36.         SYS->ALT_MFP4 |=  (SYS_ALT_MFP4_PA12_UART5_RXD);
  37.         SYS->GPD_MFP  &= ~(SYS_GPD_MFP_PD15_Msk);
  38.     SYS->GPD_MFP  |=  (SYS_GPD_MFP_PD15_UART2_TXD);
  39. }

  40. void        UART5_Init()
  41. {
  42.     /* Reset UART5 module */
  43.     SYS_ResetModule(UART5_RST);
  44.                
  45.     /* Configure UART5 and set UART5 Baudrate */
  46.         UART_SetLine_Config(UART5, 4800, UART_WORD_LEN_8, UART_PARITY_EVEN, UART_STOP_BIT_1);

  47.         //UART_EnableInt(UART5, UART_IER_RDA_IEN_Msk);
  48.         UART_EnableInt(UART5, UART_IER_RDA_IEN_Msk);
  49.        
  50.         UART5->IER |= (UART_IER_TOUT_IEN_Msk);
  51.         UART5->IER |= (UART_IER_TIME_OUT_EN_Msk);
  52.        
  53.         UART5->TOR = (UART5->TOR & ~UART_TOR_TOIC_Msk) | (0x32);
  54. }



  55. void        UART2_Init()//Init UART2 for RS232
  56. {                                                   
  57.     /* Reset UART1 module */
  58.     SYS_ResetModule(UART2_RST);

  59.     /* Configure UART1 and set UART1 Baudrate */
  60.     UART_Open(UART2, 4800);
  61. }

  62. int        main(void)
  63. {               
  64.         /* Unlock protected registers */
  65.     SYS_UnlockReg();

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

  68.     /* Lock protected registers */
  69.     SYS_LockReg();

  70.         UART5_Init();
  71.         UART2_Init();
  72.                
  73.     /* CODE */
  74.         GPIO_SetMode(PB, BIT12, GPIO_PMD_OUTPUT);
  75.         GPIO_SetMode(PF, BIT5,  GPIO_PMD_OUTPUT);
  76.         GPIO_SetMode(PC, BIT0,  GPIO_PMD_OUTPUT);
  77.        
  78.         PF5  = 1;
  79.         PC0  = 1;
  80.         PB12 = 1;               
  81.                
  82.     while(1)
  83.         {               
  84.                 PB12= ~PB12;
  85.                 TIMER_Delay(TIMER0, 500000);
  86.         }       
  87. }

  88. void UART5_IRQHandler()
  89. {       
  90.         UART5_HANDLE();
  91. }

  92. void UART5_HANDLE()
  93. {
  94.         uint8_t  u8InChar   = 0xFF;
  95.         uint32_t u32IntSts  = UART5->ISR;
  96.        
  97.         u8InChar=(u32IntSts & UART_ISR_TOUT_IF_Msk);
  98.        
  99.         if(u32IntSts & UART_ISR_TOUT_INT_Msk)
  100.                 {
  101.                         PF5 = ~PF5;
  102.                         TIMER_Delay(TIMER0, 500000);
  103.                 }       
  104.                 else if(u32IntSts & UART_ISR_RDA_INT_Msk)
  105.                 {
  106.                         while(UART_IS_RX_READY(UART5))
  107.                         {
  108.                                 u8InChar = UART_READ(UART5);
  109.                         }
  110.                 }
  111. }

heisexingqisi 发表于 2017-11-1 20:43 | 显示全部楼层
如果这个思路不行,就用那个可行的啊。
Harvard 发表于 2017-11-2 09:12 | 显示全部楼层
有串口超时就足够了  再用定时多此一举. 另外 用超时的 你的fifo设置低了没有  还有一般超时适合 RDA中断一起用的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

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