UART是最常用的外设了,这里不做过多的解释。但是大家要注意的是,华大的F072 UART 么有空闲中断,所以处理起来需要一路定时器配合。
  1. #include "bsp_uart.h"
  2. /* 以下几个全局变量仅用于测试*/
  3. volatile uint8_t u8TxData[2] = {0xaa,0x55};
  4. volatile uint8_t u8RxData[2] = {0x00};
  5. uint8_t u8TxCnt=0,u8RxCnt=0;
  6. //串口模块配置
  7. // PA9 -- TX
  8. // PA10 -- RX
  9. void BSP_Uart0_Config(void)
  10. {
  11.         stc_uart_cfg_t  stcCfg;       
  12.     stc_uart_baud_t stcBaud;
  13.         stc_gpio_cfg_t stcGpioCfg;
  14.    
  15.         DDL_ZERO_STRUCT(stcCfg);
  16.     DDL_ZERO_STRUCT(stcBaud);
  17.     DDL_ZERO_STRUCT(stcGpioCfg);
  18.          
  19.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);  ///<使能GPIO外设时钟门控开关
  20.    
  21.     stcGpioCfg.enDir = GpioDirOut;
  22.         Gpio_Init(GpioPortA,GpioPin9,&stcGpioCfg);
  23.         Gpio_SetAfMode(GpioPortA,GpioPin9,GpioAf1); //配置PA9 为UART0 TX
  24.         stcGpioCfg.enDir = GpioDirIn;
  25.         Gpio_Init(GpioPortA,GpioPin10,&stcGpioCfg);
  26.         Gpio_SetAfMode(GpioPortA,GpioPin10,GpioAf1);//配置PA10 为UART0 RX
  27.    
  28.     Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE); ///<使能UART2外设时钟门控开关
  29.    
  30.     ///<UART Init
  31.     stcCfg.enRunMode        = UartMskMode1;                 ///<模式1
  32.     stcCfg.enStopBit        = UartMsk1bit;                  ///<1bit停止位
  33.     stcCfg.enMmdorCk        = UartMskNone;                            ///<无校验位
  34.     stcCfg.stcBaud.u32Baud  = 115200;                       ///<波特率 9600 无误差,115200 误差0.16%
  35.                      
  36.     stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;              ///<通道采样分频配置
  37.     stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq();        ///</<获得外设时钟(PCLK)频率值
  38.     Uart_Init(M0P_UART0, &stcCfg);                          ///<串口初始化
  39.    
  40.         ///<UART中断使能
  41.     Uart_EnableIrq(M0P_UART0,UartRxIrq); //使能串口接收中断
  42.         //Uart_EnableIrq(M0P_UART0,UartTxIrq); //使能串口发送中断
  43.        
  44.         ///<系统中断使能
  45.     EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE);   
  46.        
  47.         Uart_ClrStatus(M0P_UART0,UartRC);    //清接收请求
  48.     Uart_ClrStatus(M0P_UART0,UartTC);    //清发送请求
  49. }
  50. //串口模块配置
  51. // PA2 -- TX
  52. // PA3 -- RX
  53. void BSP_Uart1_Config(void)
  54. {
  55.         stc_uart_cfg_t  stcCfg;       
  56.     stc_uart_baud_t stcBaud;
  57.         stc_gpio_cfg_t stcGpioCfg;
  58.    
  59.         DDL_ZERO_STRUCT(stcCfg);
  60.     DDL_ZERO_STRUCT(stcBaud);
  61.     DDL_ZERO_STRUCT(stcGpioCfg);
  62.          
  63.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);  ///<使能GPIO外设时钟门控开关
  64.    
  65.     stcGpioCfg.enDir = GpioDirOut;
  66.     Gpio_Init(GpioPortA,GpioPin2,&stcGpioCfg);
  67.     Gpio_SetAfMode(GpioPortA,GpioPin2,GpioAf1); //配置PA2 为UART1 TX
  68.        
  69.     stcGpioCfg.enDir = GpioDirIn;
  70.     Gpio_Init(GpioPortA,GpioPin3,&stcGpioCfg);
  71.     Gpio_SetAfMode(GpioPortA,GpioPin3,GpioAf1);//配置PA3 为UART1 RX
  72.             
  73.     Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE); ///<使能UART2外设时钟门控开关
  74.    
  75.     ///<UART Init
  76.     stcCfg.enRunMode        = UartMskMode1;                 ///<模式1
  77.     stcCfg.enStopBit        = UartMsk1bit;                  ///<1bit停止位
  78.     stcCfg.enMmdorCk        = UartMskNone;                            ///<无校验位
  79.     stcCfg.stcBaud.u32Baud  = 115200;                       ///<波特率 9600 无误差,115200 误差0.16%
  80.                      
  81.     stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;              ///<通道采样分频配置
  82.     stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq();        ///</<获得外设时钟(PCLK)频率值
  83.     Uart_Init(M0P_UART1, &stcCfg);                          ///<串口初始化
  84.    
  85.         ///<UART中断使能
  86.     Uart_EnableIrq(M0P_UART1,UartRxIrq); //使能串口接收中断
  87.         //Uart_EnableIrq(M0P_UART1,UartTxIrq); //使能串口发送中断
  88.        
  89.         ///<系统中断使能
  90.     EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE);   
  91.        
  92.         Uart_ClrStatus(M0P_UART1,UartRC);    //清接收请求
  93.     Uart_ClrStatus(M0P_UART1,UartTC);    //清发送请求
  94. }
  95. //串口模块配置
  96. void BSP_Uart2_Config(void)
  97. {
  98.     stc_uart_cfg_t  stcCfg;       
  99.     stc_uart_baud_t stcBaud;
  100.         stc_gpio_cfg_t stcGpioCfg;
  101.    
  102.         DDL_ZERO_STRUCT(stcCfg);
  103.     DDL_ZERO_STRUCT(stcBaud);
  104.     DDL_ZERO_STRUCT(stcGpioCfg);
  105.          
  106.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);  ///<使能GPIO外设时钟门控开关
  107.    
  108.     stcGpioCfg.enDir = GpioDirOut;
  109.     Gpio_Init(GpioPortC,GpioPin3,&stcGpioCfg);
  110.     Gpio_SetAfMode(GpioPortC,GpioPin3,GpioAf5); //配置PC03 为UART2 TX
  111.     stcGpioCfg.enDir = GpioDirIn;
  112.     Gpio_Init(GpioPortC,GpioPin2,&stcGpioCfg);
  113.     Gpio_SetAfMode(GpioPortC,GpioPin2,GpioAf4);//配置PC02 为UART2 RX
  114.             
  115.     Sysctrl_SetPeripheralGate(SysctrlPeripheralUart2,TRUE); ///<使能UART2外设时钟门控开关
  116.    
  117.     ///<UART Init
  118.     stcCfg.enRunMode        = UartMskMode1;                 ///<模式1
  119.     stcCfg.enStopBit        = UartMsk1bit;                  ///<1bit停止位
  120.     stcCfg.enMmdorCk        = UartMskNone;                            ///<无校验位
  121.     stcCfg.stcBaud.u32Baud  = 115200;                       ///<波特率9600无误差,115200误差0.16%
  122.                      
  123.     stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;              ///<通道采样分频配置
  124.     stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq();        ///</<获得外设时钟(PCLK)频率值
  125.     Uart_Init(M0P_UART2, &stcCfg);                          ///<串口初始化
  126.    
  127.         ///<UART中断使能
  128.     Uart_EnableIrq(M0P_UART2,UartRxIrq); //使能串口接收中断
  129.         //Uart_EnableIrq(M0P_UART2,UartTxIrq); //使能串口发送中断
  130.        
  131.         ///<系统中断使能
  132.     EnableNvic(UART0_2_IRQn, IrqLevel2, TRUE);   
  133.        
  134.         Uart_ClrStatus(M0P_UART2,UartRC);    //清接收请求
  135.     Uart_ClrStatus(M0P_UART2,UartTC);    //清发送请求
  136.        
  137. }
  138. void Uart2_IRQHandler(void)
  139. {
  140.     if(Uart_GetStatus(M0P_UART2, UartRC))
  141.     {
  142.         Uart_ClrStatus(M0P_UART2, UartRC);              //清除接收中断状态位
  143.         }
  144. }
  145. void Uart0_IRQHandler(void)
  146. {
  147.     if(Uart_GetStatus(M0P_UART0, UartRC))
  148.     {
  149.         Uart_ClrStatus(M0P_UART0, UartRC);              //清除接收中断状态位
  150.                
  151.         //u8RxData[u8RxCnt] = Uart_ReceiveData(M0P_UART0);         
  152.         //u8RxCnt++;
  153. //        if(u8RxCnt>1)                                   //如果已接收两个字节
  154. //        {
  155. //            Uart_DisableIrq(M0P_UART1,UartRxIrq);       //禁止接收中断
  156. //       }       
  157.     }
  158.    
  159.     if(Uart_GetStatus(M0P_UART0, UartTC))
  160.     {
  161.         Uart_ClrStatus(M0P_UART0, UartTC);              //清除发送中断状态位
  162. //        Uart_SendDataIt(M0P_UART1, u8TxData[u8TxCnt++]);//发送数据
  163. //        if(u8TxCnt>1)                                   //如果已发送两个字节
  164. //       {
  165. //            u8TxCnt = 0;
  166. //            u8RxCnt = 0;
  167. //           Uart_DisableIrq(M0P_UART1,UartTxIrq);       //禁止发送中断
  168. //            Uart_EnableIrq(M0P_UART1,UartRxIrq);        //使能接收中断
  169. //        }
  170.     }
  171. }
  172. // how to use:    Uart_SendDataIt(M0P_UART1, ~u8RxData); Uart_SendDataPoll(M0P_UART0, 0x16);     
头文件:
  1. #ifndef __BSP_UART_H__
  2. #define __BSP_UART_H__
  3. #include "uart.h"
  4. #include "gpio.h"
  5. #include <stdio.h>
  6. void BSP_Uart0_Config(void);
  7. void BSP_Uart1_Config(void);
  8. void BSP_Uart2_Config(void);
  9. extern volatile uint8_t u8TxData[2];
  10. extern volatile uint8_t u8RxData[2];
  11. extern uint8_t u8TxCnt,u8RxCnt;
  12. #endif

以上代码都经过了验证,可以放心使用户。