[应用方案] M0的串口问题

[复制链接]
3398|22
 楼主| Mancherstun 发表于 2015-12-16 20:20 | 显示全部楼层 |阅读模式
前天拿到的芯片,端口驱动没有问题,偏偏是串口出了问题,刚开始是没有开始端口复用,而昨天一整天我都在研究为什么可以接受到数据,但是数据是错误的,一整天,就是找不到程序中哪里出了问题,昨晚上睡觉之前就在思考,终究不能知道为什么,因为他的寄存器什么的我都没时间仔细研究,心想着今天来一个一个的研究,今早却**一现,今天起得特别早,因为还惦记这个问题,睡不着,为什么不看看硬件呢?我就来到加了一块串口驱动板,哈哈令人兴奋。电脑瞑目上闪现的数字和我期待的是一样的,嘎嘎,证明软件的配置昨天一天都是对的,只是没想到硬件出问题!哎!加油吧,总算是搞定串口发送了。虽然微不足道,但是也足以令我兴奋十天半月!
 楼主| Mancherstun 发表于 2015-12-16 20:22 | 显示全部楼层
下面是APP和部分程序
  1. E_DRVGPIO_PIN sPinNumber; //枚举引脚
  2. STR_UART_T config;
  3. uint32_t start[10];
  4. /*---------------------------------------------------------------------------------------------------------*/
  5. /* MAIN function                                                                                          */
  6. /*---------------------------------------------------------------------------------------------------------*/   
  7. int main (void)
  8. {
  9. uint8_t tab[12]={6,5,6,7,8,9};
  10. uint8_t tab1[10];


  11. while(DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1)!=0);//使能外部12MHZ晶振
  12.     while( DrvSYS_SelectHCLKSource(0) !=0);//HCLK选择外部12MHZ晶振
  13. while(DrvSYS_SelectSysTickSource(0)!=0);//选择系统嘀嗒时钟源为外部12MHZ晶振
  14.     DrvSYS_SetIPClock(E_SYS_UART0_CLK,1);//使能UART0时钟

  15.      while(DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0)!=0); //1分频UART&HCLK
  16.      while(DrvSYS_SetClockDivider(E_SYS_UART_DIV, 0)!=0); //1分频UART&HCLK
  17.    DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);//UART选择外部12Mhz的时钟源
  18.    DrvGPIO_InitFunction(E_FUNC_UART0);//复用IO编程UART模式
  19.      /*关闭所有串口中断*/
  20.    DrvUART_DisableInt(UART_PORT0,DRVUART_WAKEUPINT|DRVUART_RLSINT|DRVUART_BUFERRINT|DRVUART_MOSINT|DRVUART_THREINT|DRVUART_RDAINT|DRVUART_TOUTINT);

  21.     /*设置串口参数*/
  22.   config.u32BaudRate=9600;  //波特率9600
  23.   config.u8cDataBits=DRVUART_DATABITS_8 ;//数据位8位
  24.   config.u8cStopBits=DRVUART_STOPBITS_1; //停止位1位
  25.   config.u8cParity=DRVUART_PARITY_NONE ; //NONE校验
  26.   config.u8cRxTriggerLevel=DRVUART_FIFO_8BYTES;//接受FIFO 8字节
  27.         DrvUART_Open(UART_PORT0, &config);//开启UART端口
  28.        /*端口模式*/
  29.     DrvGPIO_Open(E_PORT3,E_PIN6, E_IO_OUTPUT);
  30. DrvGPIO_Open(E_PORT0,E_PIN0, E_IO_INPUT);//input


  31. sPinNumber=E_PIN6;
 楼主| Mancherstun 发表于 2015-12-16 20:23 | 显示全部楼层
  1. while(1)
  2. {
  3. // _DRVUART_SENDBYTE(UART_PORT0,2);  

  4.    if(DrvGPIO_GetBit(E_PORT0,E_PIN0 )==0)
  5.    {
  6. DrvUART_Write(UART_PORT0,tab,3);
  7.    
  8.     DrvGPIO_ClrBit(E_PORT3,sPinNumber);
  9.   DrvSYS_Delay(500000);
  10. DrvGPIO_SetBit(E_PORT3, E_PIN6);
  11.         DrvSYS_Delay(500000);
  12.       
  13.       
  14.       }
  15. }

  16. }

 楼主| Mancherstun 发表于 2015-12-16 20:27 | 显示全部楼层
  1. static void BaudRateCalculator(uint32_t clk, uint32_t baudRate, E_UART_PORT u32Port)
  2. {
  3.    int32_t tmp;
  4. int32_t div;
  5.    UART_T * tUART;
  6. tUART = (UART_T *)((uint32_t)UART0 + u32Port);
  7.     if ((((clk / baudRate)%16) < 2)  &&  (clk>(baudRate*16*2)))  /* Source Clock mod 16 < 2 => Using Divider X =16 (MODE#0) */
  8. {         
  9.   tUART->BAUD.DIV_X_EN = 0;
  10.      tUART->BAUD.DIV_X_ONE   = 0;
  11.   tmp = clk / baudRate/16  -2;
  12. }
  13. else         /* Source Clock mod 16 >2 => Up 5% Error BaudRate */
  14. {   
  15.      tUART->BAUD.DIV_X_EN = 1;     /* Try to Set Divider X = 1 (MODE#2)*/
  16.      tUART->BAUD.DIV_X_ONE   = 1;
  17.   tmp = clk / baudRate  -2;
  18.   if(tmp > 0xFFFF)     /* If Divider > Range  */
  19.   {
  20.    tUART->BAUD.DIV_X_EN = 1;    /* Try to Set Divider X up 10 (MODE#1) */
  21.    tUART->BAUD.DIV_X_ONE   = 0;
  22.    for(div = 8; div <16;div++)
  23.    {
  24.     if(((clk / baudRate)%(div+1))<3)
  25.     {
  26.      tUART->BAUD.DIVIDER_X   = div;
  27.      tmp = clk / baudRate / (div+1) -2;
  28.      break;
  29.     }
  30.    }
  31.   }
  32. }
  33. tUART->BAUD.BRD = tmp;
  34. }
 楼主| Mancherstun 发表于 2015-12-16 20:29 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     GetUartClk                                                                            */
  3. /*                                                                                                         */
  4. /* Parameter:                                */
  5. /*              clk            -[in] Uart Source Clock                                                */
  6. /*              baudRate       -[in] User seting BaudRate                                             */
  7. /*              UART_BAUD_T *baud  -[in] Get User Settings                                                */
  8. /* Returns:                                                                                                */
  9. /*               Current Uart Clock  (Hz)                                                                  */
  10. /* Description:                                                                                            */
  11. /*               The function is used to get Uart clock                                                    */
  12. /*---------------------------------------------------------------------------------------------------------*/
  13. static uint32_t GetUartClock(void)
  14. {
  15.     uint32_t clk =0 , div;
  16.     div = SYSCLK->CLKDIV.UART_N;                    /* According PLL Clock and UART_Divider to get clock */                                                
  17.                                                    
  18.                                                     /* Check UART Clock Source Setting */
  19.     if(SYSCLK->CLKSEL1.UART_S == 0)        
  20.     {
  21.         clk = DrvSYS_GetExtClockFreq()/ (div+1);;   /* Get External Clock From DrvSYS Setting */
  22.     }
  23.     else if(SYSCLK->CLKSEL1.UART_S == 1)
  24.     {
  25.         clk = DrvSYS_GetPLLClockFreq()/ (div+1);
  26.     }
  27.     else
  28.         clk = __IRC22M/ (div+1);                    /* Clock 22Mhz  */
  29.     return clk;
  30. }
 楼主| Mancherstun 发表于 2015-12-16 20:30 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_SetRTS                                                                   */
  3. /*                                                                                                         */
  4. /* Parameter:                                */
  5. /*     u32Port   -[in]   UART Channel:  UART_PORT0 / UART_PORT1                             */
  6. /*               uint8_t     -[in]   RTS Value                                 */
  7. /*                           Set 0: Drive RTS pin to logic 1 (If the LEV_RTS set to low level triggered).  */
  8. /*                                  Drive RTS pin to logic 0 (If the LEV_RTS set to high level triggered)  */
  9. /*                           Set 1: Drive RTS pin to logic 0 (If the LEV_RTS set to low level triggered)   */
  10. /*                                   Drive RTS pin to logic 1 (If the LEV_RTS set to high level triggered) */
  11. /*                           Note. Lev_RTS is RTS Trigger Level. 0 is low level and 1 is high level        */
  12. /*                                                                                                         */
  13. /*               u16TriggerLevel - [in]   RTS Trigger Level :DRVUART_FIFO_1BYTES to DRVUART_FIFO_62BYTES   */
  14. /* Returns:                                                                                                */
  15. /*               None                                                                                      */
  16. /*                                                                                                         */
  17. /* Description:                                                                                            */
  18. /*               The function is used to set RTS information                                            */
  19. /*---------------------------------------------------------------------------------------------------------*/
 楼主| Mancherstun 发表于 2015-12-16 20:30 | 显示全部楼层
  1. void DrvUART_SetRTS(E_UART_PORT u32Port,uint8_t u8Value,uint16_t u16TriggerLevel)
  2. {

  3. UART_T * tUART;
  4. tUART = (UART_T *)((uint32_t)UART0 + u32Port);
  5. tUART->MCR.RTS = u8Value;
  6. tUART->FCR.RTS_TRI_LEV = u16TriggerLevel;
  7. }


  8. /*---------------------------------------------------------------------------------------------------------*/
  9. /* Function:     DrvUART_Open                                                                            */
  10. /*                                                                                                         */
  11. /* Parameter:                                */
  12. /*     u32Port -[in] UART Channel:  UART_PORT0 / UART_PORT1                                */
  13. /*               sParam  -[in] the struct parameter to configure UART                                      */
  14. /*                         include of                                                                      */
  15. /*                           * u32BaudRate - Baud rate                 */               
  16. /*                           * u8cParity   - DRVUART_PARITY_NONE / DRVUART_PARITY_EVEN / DRVUART_PARITY_ODD*/
  17. /*                           * u8cDataBits - DRVUART_DATA_BITS_5 / DRVUART_DATA_BITS_6         */
  18. /*               DRVUART_DATA_BITS_7 / DRVUART_DATA_BITS_8              */
  19. /*                           * u8cStopBits - DRVUART_STOPBITS_1 / STOPBITS_1_5 / STOPBITS_2         */
  20. /*                           * u8cRxTriggerLevel   - LEVEL_1_BYTE to LEVEL_62_BYTES                        */
  21. /*                           * u8TimeOut - Time out value                                           */
  22. /*                                                                                                         */
  23. /*                                                                                                         */
  24. /* Returns:                                                                                                */
  25. /*               E_DRVUART_ERR_PORT_INVALID                            */
  26. /*               E_DRVUART_ERR_PARITY_INVALID                                 */
  27. /*               E_DRVUART_ERR_DATA_BITS_INVALID                             */
  28. /*               E_DRVUART_ERR_STOP_BITS_INVALID                             */
  29. /*               E_DRVUART_ERR_TRIGGERLEVEL_INVALID                     */
  30. /*               E_DRVUART_ERR_ALLOC_MEMORY_FAIL                              */
  31. /*               E_SUCCESS                                                                              */
  32. /*                                                                                                         */
  33. /* Description:                                                                                            */
  34. /*               The function is used to initialize UART. It consists of baud-rate, parity, data-bits,     */
  35. /*               stop-bits, rx-trigger-level and timeout interval settings.                                */
  36. /*                                                                                                         */
  37. /*---------------------------------------------------------------------------------------------------------*/
 楼主| Mancherstun 发表于 2015-12-16 20:31 | 显示全部楼层
  1. int32_t DrvUART_Open(E_UART_PORT u32Port, STR_UART_T *sParam)
  2. {
  3. UART_T * tUART;
  4.   
  5.     /*-----------------------------------------------------------------------------------------------------*/
  6.     /* Check UART port                                                                                     */
  7.     /*-----------------------------------------------------------------------------------------------------*/
  8.     if ((u32Port != UART_PORT0) &&
  9.         (u32Port != UART_PORT1))
  10.     {
  11.   return E_DRVUART_ERR_PORT_INVALID;
  12.     }

  13.     /*-----------------------------------------------------------------------------------------------------*/
  14.     /* Check the supplied parity                                                                           */
  15.     /*-----------------------------------------------------------------------------------------------------*/
  16.     if ((sParam->u8cParity != DRVUART_PARITY_NONE) &&
  17.         (sParam->u8cParity != DRVUART_PARITY_EVEN) &&
  18.         (sParam->u8cParity != DRVUART_PARITY_ODD)  &&
  19.         (sParam->u8cParity != DRVUART_PARITY_MARK) &&
  20.         (sParam->u8cParity != DRVUART_PARITY_SPACE))
  21.     {
  22.    return E_DRVUART_ERR_PARITY_INVALID;  
  23.     }
  24.    
 楼主| Mancherstun 发表于 2015-12-16 20:31 | 显示全部楼层
  1. /*-----------------------------------------------------------------------------------------------------*/
  2.     /* Check the supplied number of data bits                                                              */
  3.     /*-----------------------------------------------------------------------------------------------------*/
  4.     else if ((sParam->u8cDataBits != DRVUART_DATABITS_5) &&
  5.              (sParam->u8cDataBits != DRVUART_DATABITS_6) &&
  6.              (sParam->u8cDataBits != DRVUART_DATABITS_7) &&
  7.              (sParam->u8cDataBits != DRVUART_DATABITS_8))
  8.     {
  9.    return E_DRVUART_ERR_DATA_BITS_INVALID;
  10.     }
  11.     /*-----------------------------------------------------------------------------------------------------*/
  12.     /* Check the supplied number of stop bits                                                              */
  13.     /*-----------------------------------------------------------------------------------------------------*/
  14.     else if ((sParam->u8cStopBits != DRVUART_STOPBITS_1) &&
  15.              (sParam->u8cStopBits != DRVUART_STOPBITS_2) &&
  16.              (sParam->u8cStopBits != DRVUART_STOPBITS_1_5)
  17.              )
  18.     {
  19.        return E_DRVUART_ERR_STOP_BITS_INVALID;
  20.     }
 楼主| Mancherstun 发表于 2015-12-16 20:32 | 显示全部楼层
  1. /*-----------------------------------------------------------------------------------------------------*/
  2.     /* Check the supplied nember of trigger level bytes                                                    */
  3.     /*-----------------------------------------------------------------------------------------------------*/
  4.     else if ((sParam->u8cRxTriggerLevel != DRVUART_FIFO_1BYTES) &&
  5.              (sParam->u8cRxTriggerLevel != DRVUART_FIFO_4BYTES) &&
  6.              (sParam->u8cRxTriggerLevel != DRVUART_FIFO_8BYTES) &&
  7.              (sParam->u8cRxTriggerLevel != DRVUART_FIFO_14BYTES)&&
  8.              (sParam->u8cRxTriggerLevel != DRVUART_FIFO_30BYTES)&&
  9.              (sParam->u8cRxTriggerLevel != DRVUART_FIFO_46BYTES)&&
  10.              (sParam->u8cRxTriggerLevel != DRVUART_FIFO_62BYTES))
  11.     {
  12.   return E_DRVUART_ERR_TRIGGERLEVEL_INVALID;  
  13.     }   
  14. if(u32Port == UART_PORT0)
  15. {
  16.   /* Reset IP */
  17.   SYS->IPRSTC2.UART0_RST = 1;
  18.   SYS->IPRSTC2.UART0_RST = 0;
  19.   
  20.   /* Enable UART clock */
  21.      SYSCLK->APBCLK.UART0_EN = 1;
  22. }
  23. else
  24. {
  25.   /* Reset IP */
  26.   SYS->IPRSTC2.UART1_RST = 1;
  27.   SYS->IPRSTC2.UART1_RST = 0;
  28.   
  29.   /* Enable UART clock */
  30.      SYSCLK->APBCLK.UART1_EN = 1;
  31. }
  32. tUART = (UART_T *)((uint32_t)UART0 + u32Port);

  33. /* Tx FIFO Reset & Rx FIFO Reset & FIFO Mode Enable */
  34.    tUART->FCR.TFR =1;
  35.    tUART->FCR.RFR =1;
  36. /* Set Rx Trigger Level */
  37. tUART->FCR.RFITL = sParam->u8cRxTriggerLevel;

  38. /* Set Parity & Data bits & Stop bits */
  39. tUART->LCR.SPE =((sParam->u8cParity)&0x4)?1:0;
  40. tUART->LCR.EPE =((sParam->u8cParity)&0x2)?1:0;
  41. tUART->LCR.PBE =((sParam->u8cParity)&0x1)?1:0;
  42.   
  43. tUART->LCR.WLS =sParam->u8cDataBits;
  44. tUART->LCR.NSB =sParam->u8cStopBits;
  45.   
  46. /* Set Time-Out */
  47. tUART->TOR.TOIC =sParam->u8TimeOut;
  48.     /* Check Clock Source */
  49.     if(SYSCLK->PWRCON.XTL12M_EN)
  50.         SYSCLK->CLKSEL1.UART_S = 0;
  51.     else
  52.     {
  53.         if(SYSCLK->PLLCON.PD==0)
  54.             SYSCLK->CLKSEL1.UART_S = 1;
  55.         else
  56.             if(SYSCLK->PWRCON.OSC22M_EN)
  57.                 SYSCLK->CLKSEL1.UART_S = 3;
  58.             else
  59.                 return E_DRVUART_ERR_OPEN;
  60.     }
  61. /* Set BaudRate */
  62. BaudRateCalculator(GetUartClock(), sParam->u32BaudRate, u32Port);
  63. return E_SUCCESS;
  64. }
 楼主| Mancherstun 发表于 2015-12-16 20:33 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:        DrvUART_Close                                                                          */
  3. /*                                                                                                         */
  4. /* Parameters:                                                                                             */
  5. /*      u32Port   -[in] UART Channel:  UART_PORT0 / UART_PORT1                              */
  6. /* RETURN                                                                                                  */
  7. /*                  None                                                                                   */
  8. /* Description:                                                                                            */
  9. /*                  The function is used to disable UART clock, disable ISR and clear callback       */
  10. /*                  function pointer after checking the TX empty.                                          */
  11. /*---------------------------------------------------------------------------------------------------------*/
  12. void DrvUART_Close(E_UART_PORT u32Port)
  13. {
  14. if(u32Port == UART_PORT1)
  15. {
  16.   while(!UART1->FSR.TE_FLAG);
  17.   SYSCLK->APBCLK.UART1_EN = 0;
  18.   g_pfnUART1callback = NULL;
  19.          NVIC_DisableIRQ (UART1_IRQn);
  20. }
  21. else
  22. {
  23.   while(!UART0->FSR.TE_FLAG);
  24.   SYSCLK->APBCLK.UART0_EN = 0;
  25.   g_pfnUART0callback = NULL;
  26.         NVIC_DisableIRQ(UART0_IRQn);     
  27. }
  28. }

 楼主| Mancherstun 发表于 2015-12-16 20:33 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_EnableInt                                                                         */
  3. /*                                                                                                         */
  4. /* Parameter:                                                                                              */
  5. /*     u32Port    -[in] UART Channel:  UART_PORT0 / UART_PORT1                             */
  6. /*               u32InterruptFlag -[in] DRVUART_WAKEUPINT/DRVUART_RLSINT/DRVUART_BUFERRINT                 */
  7. /*          DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT      */
  8. /*               pfncallback      -[in] A function pointer for callback function                           */
  9. /* Returns:                                                                                                */
  10. /*               None                                                                                      */
  11. /* Description:                                                                                            */
  12. /*               The function is used to enable specified UART interrupt, install the callback             */
  13. /*               function and enable NVIC UART IRQ                                                         */
  14. /* Remark:                                                                                                 */
  15. /*               When enable DRVUART_THREINT interrupt source, the interrup will happen continouly if      */
  16. /*               TX_FIFO is empty. Remind you thant be careful to use it.                                  */
  17. /*               Please reference TRM to get more information.                                             */
  18. /*---------------------------------------------------------------------------------------------------------*/
 楼主| Mancherstun 发表于 2015-12-16 20:34 | 显示全部楼层
  1. void
  2. DrvUART_EnableInt(
  3. E_UART_PORT   u32Port,
  4. uint32_t  u32InterruptFlag,
  5. PFN_DRVUART_CALLBACK pfncallback
  6. )
  7. {
  8. UART_T * tUART;
  9.    
  10. tUART = (UART_T *)((uint32_t)UART0 + u32Port);
  11. tUART->IER.RDA_IEN  =(u32InterruptFlag & DRVUART_RDAINT)?1:0 ;
  12. tUART->IER.THRE_IEN  =(u32InterruptFlag & DRVUART_THREINT)?1:0;
  13. tUART->IER.RLS_IEN  =(u32InterruptFlag & DRVUART_RLSINT)?1:0;
  14. tUART->IER.MODEM_IEN =(u32InterruptFlag & DRVUART_MOSINT)?1:0;
  15.   
  16. tUART->IER.TIME_OUT_EN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0;    /* Time-out count enable */
  17. tUART->IER.RTO_IEN  =(u32InterruptFlag & DRVUART_TOUTINT)?1:0;  /* Time-out INT enable */
  18. tUART->IER.BUF_ERR_IEN =(u32InterruptFlag & DRVUART_BUFERRINT)?1:0;
  19. tUART->IER.WAKE_EN  =(u32InterruptFlag & DRVUART_WAKEUPINT)?1:0;
  20.     if(u32Port == UART_PORT0)               /* Install Callback function */
  21.     {
  22.   g_pfnUART0callback = pfncallback;      
  23.   NVIC_SetPriority(UART0_IRQn, (1<<__NVIC_PRIO_BITS) - 2);
  24.   NVIC_EnableIRQ(UART0_IRQn);
  25.     }
  26. else
  27. {
  28.   g_pfnUART1callback = pfncallback;
  29.   NVIC_SetPriority(UART1_IRQn, (1<<__NVIC_PRIO_BITS) - 2);
  30.   NVIC_EnableIRQ(UART1_IRQn);
  31. }
  32. }
 楼主| Mancherstun 发表于 2015-12-16 20:35 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_IsIntEnabled                                                                     */
  3. /*                                                                                                         */
  4. /* Parameter:                                                                                              */
  5. /*     u32Port       -[in] UART Channel:  UART_PORT0 / UART_PORT1                             */
  6. /*               u32InterruptFlag -[in] DRVUART_WAKEUPINT/DRVUART_RLSINT/DRVUART_BUFERRINT                 */
  7. /*          DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT      */
  8. /* Returns:                                                                                                */
  9. /*               Specified Interrupt Flag Set or clear                                                     */
  10. /* Description:                                                                                            */
  11. /*               The function is used to get the "interrupt enable" status           */
  12. /*---------------------------------------------------------------------------------------------------------*/
  13. uint32_t DrvUART_IsIntEnabled(E_UART_PORT u32Port,uint32_t u32InterruptFlag)
  14. {
  15. if(u32Port == UART_PORT0)     /* Read IER Register and check specified flag is enable */
  16.   return ((inpw(&UART0->IER) &
  17.    (u32InterruptFlag & (DRVUART_WAKEUPINT |DRVUART_BUFERRINT|
  18.      DRVUART_TOUTINT | DRVUART_MOSINT | DRVUART_RLSINT| DRVUART_THREINT | DRVUART_RDAINT))))?1:0;
  19. else
  20.   return ((inpw(&UART1->IER) &
  21.   (u32InterruptFlag & ( DRVUART_WAKEUPINT |DRVUART_BUFERRINT|
  22.      DRVUART_TOUTINT | DRVUART_MOSINT | DRVUART_RLSINT | DRVUART_THREINT | DRVUART_RDAINT))))?1:0;
  23. }
 楼主| Mancherstun 发表于 2015-12-16 20:35 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_DisableInt                                                                       */
  3. /*                                                                                                         */
  4. /* Parameter:                                                                                              */
  5. /*     u32Port       -[in] UART Channel:  UART_PORT0 / UART_PORT1                             */
  6. /*               u32InterruptFlag -[in] DRVUART_WAKEUPINT/DRVUART_RLSINT/DRVUART_BUFERRINT                 */
  7. /*          DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT      */
  8. /* Returns:                                                                                                */
  9. /*               None                                                                                      */
  10. /* Description:                                                                                            */
  11. /*               The function is used to disable UART specified interrupt, uninstall the call back         */
  12. /*               function and disable NVIC UART IRQ                                                        */
  13. /*---------------------------------------------------------------------------------------------------------*/
  14. void DrvUART_DisableInt(E_UART_PORT u32Port,uint32_t u32InterruptFlag)
  15. {
  16. if(u32Port == UART_PORT0)     
  17. {
  18.   outpw(&UART0->IER + u32Port,inpw(&UART0->IER + u32Port) &~u32InterruptFlag);    /* Disable INT  */
  19. }

  20. if(u32InterruptFlag & DRVUART_TOUTINT)             /* Disable Counter Enable */
  21. {
  22.   if(u32Port == UART_PORT0)
  23.    UART0->IER.RTO_IEN = 0;
  24.   else
  25.    UART1->IER.RTO_IEN = 0;
  26. }

  27. switch (u32Port)                /* Disable Callback function and NVIC */
  28.     {
  29.         case UART_PORT0:
  30.    g_pfnUART0callback = NULL;
  31.             NVIC_DisableIRQ(UART0_IRQn);  
  32.             break;
  33.         case UART_PORT1:
  34.    g_pfnUART1callback = NULL;
  35.             NVIC_DisableIRQ(UART1_IRQn);   
  36.             break;
  37.       
  38.         default:
  39.             break;
  40.     }
  41. }
 楼主| Mancherstun 发表于 2015-12-16 20:36 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_ClearIntFlag                                                                      */
  3. /*                                                                                                         */
  4. /* Parameter:                                                                                              */
  5. /*               u32Port              -[in]   UART Channel:  UART_PORT0 / UART_PORT1                       */
  6. /*               u32InterruptFlag     -[in]   Interrupt Flag : DRVUART_RLSINT_FLAG/DRVUART_MOSINT_FLAG     */
  7. /*                                                             DRVUART_BUFERRINT_FLAG                      */
  8. /* Returns:                                                                                                */
  9. /*               E_SUCCESS      Successful                                                                 */
  10. /* Description:                                                                                            */
  11. /*               The function is used to clear UART specified interrupt flag                               */
  12. /*                                                                                                         */
  13. /*---------------------------------------------------------------------------------------------------------*/
  14. uint32_t DrvUART_ClearIntFlag(E_UART_PORT u32Port,uint32_t u32InterruptFlag)
  15. {
  16.     UART_T * tUART;
  17.     tUART = (UART_T *)((uint32_t)UART0 + u32Port);
  18.     if((u32InterruptFlag & DRVUART_RDAINT_FLAG)  ||
  19.        (u32InterruptFlag & DRVUART_THREINT_FLAG) ||
  20.        (u32InterruptFlag & DRVUART_TOUTINT_FLAG) )
  21.     {
  22.         return E_DRVUART_ARGUMENT;
  23.     }
  24.     if(u32InterruptFlag & DRVUART_RLSINT_FLAG)          /* clear Receive Line Status Interrupt */     
  25.     {
  26.         tUART->FSR.BIF = 1;
  27.         tUART->FSR.FEF = 1;
  28.         tUART->FSR.PEF = 1;
  29.     }
  30.     if(u32InterruptFlag & DRVUART_MOSINT_FLAG)          /* clear Modem Interrupt */   
  31.         tUART->MSR.DCTSF = 1;

  32.     if(u32InterruptFlag & DRVUART_BUFERRINT_FLAG)       /* clear Buffer ErrorInterrupt */     
  33.     {
  34.         tUART->FSR.TX_OVER_IF = 1;
  35.         tUART->FSR.RX_OVER_IF = 1;
  36.     }
  37.     return E_SUCCESS;
  38. }

 楼主| Mancherstun 发表于 2015-12-16 20:36 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_GetIntStatus                                                                     */
  3. /*                                                                                                         */
  4. /* Parameter:                                                                                              */
  5. /*     u32Port          -[in]   UART Channel:  UART_PORT0 / UART_PORT1                       */
  6. /*               u32InterruptFlag     -[in]   DRVUART_LININT_FLAG / DRVUART_BUFERRINT_FLAG           */
  7. /*             DRVUART_TOUTINT_FLAG/DRVUART_MOSINT_FLAG                     */
  8. /*                                            DRVUART_RLSINT_FLAG/DRVUART_THREINT_FLAG/DRVUART_RDAINT_FLAG */
  9. /*                                                                                                         */
  10. /* Returns:                                                                                                */
  11. /*               0: The specified interrupt is not happened.                                               */
  12. /*               1: The specified interrupt is happened.                                                   */
  13. /*               E_DRVUART_ARGUMENT: Error Parameter                                                       */
  14. /* Description:                                                                                            */
  15. /*               The function is used to get the interrupt status             */
  16. /*---------------------------------------------------------------------------------------------------------*/
  17. int32_t DrvUART_GetIntStatus(E_UART_PORT u32Port,uint32_t u32InterruptFlag)
  18. {
  19. UART_T * tUART;
  20. tUART = (UART_T *)((uint32_t)UART0 + u32Port);
  21.   
  22.     return (tUART->u32ISR & u32InterruptFlag)>>u32InterruptFlag ;
  23. }
 楼主| Mancherstun 发表于 2015-12-16 20:39 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_GetCTSInfo                                                               */
  3. /*                                                                                                         */
  4. /* Parameter:                                */
  5. /*     u32Port          -[in]   UART Channel:  UART_PORT0 / UART_PORT1                       */
  6. /*               pu8CTSValue       -[out]   Buffer to store the CTS Value                          */
  7. /*                                             return current CTS pin state                                */
  8. /*     pu8CTSChangeState   -[out]   Buffer to store the CTS Change State                        */
  9. /*                                             return CTS pin status is changed or not 1:Changed 0:Not yet */
  10. /* Returns:                                                                                                */
  11. /*               None                                                                                      */
  12. /* Description:                                                                                            */
  13. /*               The function is used to get CTS pin value and detect CTS change state                     */
  14. /*---------------------------------------------------------------------------------------------------------*/
  15. void DrvUART_GetCTS(E_UART_PORT u32Port,uint8_t *pu8CTSValue, uint8_t *pu8CTSChangeState)
  16. {
  17. UART_T * tUART;
  18. tUART = (UART_T *)((uint32_t)UART0 + u32Port);
  19.   *pu8CTSValue   = tUART->MSR.CTS_ST;
  20. *pu8CTSChangeState  = tUART->MSR.DCTSF;
  21. }
 楼主| Mancherstun 发表于 2015-12-16 20:40 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_Read                                                                              */
  3. /*                                                                                                         */
  4. /* Parameter:                                                                                              */
  5. /*     u32Port             -[in]   UART Channel:  UART_PORT0 / UART_PORT1                       */
  6. /*               pu8RxBuf       -[in]   Specify the buffer to receive the data of receive FIFO       */
  7. /*               u32ReadBytes      -[in]   Specify the bytes number of data.                      */
  8. /* Returns:                                                                                                */
  9. /*               E_SUCCESS                                                                              */
  10. /* Description:                                                                                            */
  11. /*               The function is used to read Rx data from RX FIFO and the data will be stored in pu8RxBuf */
  12. /*---------------------------------------------------------------------------------------------------------*/
  13. int32_t DrvUART_Read(E_UART_PORT u32Port,uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
  14. {
  15.     uint32_t  u32Count, u32delayno;
  16. UART_T * tUART;
  17. tUART = (UART_T *)((uint32_t)UART0 + u32Port);
  18.     for (u32Count=0; u32Count < u32ReadBytes; u32Count++)
  19.     {
  20.    u32delayno = 0;
  21.       while (tUART->FSR.RX_EMPTY ==1)         /* Check RX empty => failed */   
  22.       {
  23.        u32delayno++;      
  24.          if ( u32delayno >= 0x40000000 )      
  25.           return E_DRVUART_ERR_TIMEOUT;              
  26.          }
  27.          pu8RxBuf[u32Count] = tUART->DATA;         /* Get Data from UART RX  */
  28.     }
  29.     return E_SUCCESS;

  30. }
 楼主| Mancherstun 发表于 2015-12-16 20:40 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* Function:     DrvUART_Write                                                                            */
  3. /*                                                                                                         */
  4. /* Parameter:                                                                                              */
  5. /*     u32Port             -[in]   UART Channel:  UART_PORT0 / UART_PORT1                       */
  6. /*               pu8RxBuf       -[in]   Specify the buffer to send the data to transmission FIFO.    */
  7. /*               u32ReadBytes      -[in]   Specify the byte number of data.                          */
  8. /* Returns:                                                                                                */
  9. /*               E_SUCCESS                                                                              */
  10. /*                                                                                                         */
  11. /* Description:                                                                                            */
  12. /*               TThe function is to write data to TX buffer to transmit data by UART                      */
  13. /* Note:                                                                                                   */
  14. /*               In IrDA Mode, the BAUD RATE configure MUST to use MODE # 0                                */
  15. /*---------------------------------------------------------------------------------------------------------*/
  16. int32_t DrvUART_Write(E_UART_PORT u32Port,uint8_t *pu8TxBuf,  uint32_t u32WriteBytes)
  17. {
  18.     uint32_t  u32Count, u32delayno;
  19. UART_T * tUART;
  20. tUART = (UART_T *)((uint32_t)UART0 + u32Port);
  21.     for (u32Count=0; u32Count<u32WriteBytes; u32Count++)
  22.     {
  23.        u32delayno = 0;
  24.     while (tUART->FSR.TE_FLAG !=1)           /* Wait Tx empty and Time-out manner */
  25.        {
  26.             u32delayno++;
  27.             if ( u32delayno >= 0x40000000 )         
  28.                return E_DRVUART_ERR_TIMEOUT;            
  29.       
  30.        }
  31.     tUART->DATA =pu8TxBuf[u32Count];      /* Send UART Data from buffer */
  32.     }
  33.     return E_SUCCESS;


  34. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

294

帖子

2

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