[方案相关] 基于中断的UART通信

[复制链接]
 楼主| jkl21 发表于 2024-9-24 07:55 | 显示全部楼层 |阅读模式


  1. #include "ddl.h"
  2. #include "uart.h"
  3. #include "gpio.h"
  4. #include "sysctrl.h"

  5. #define     T1_PORT                 (3)
  6. #define     T1_PIN                  (3)

  7. volatile static uint8_t u8RxData;
  8. volatile static uint8_t u8TxCnt=0;
  9. volatile static uint8_t u8RxCnt=0;

  10. void App_UartCfg(void);
  11. void App_PortInit(void);

  12. int32_t main(void)
  13. {      
  14.     //串口引脚配置
  15.     App_PortInit();
  16.    
  17.     //串口配置
  18.     App_UartCfg();
  19.         
  20.     while(1)
  21.     {
  22.         if(u8RxCnt>=1)
  23.         {
  24.             u8RxCnt = 0;
  25.             Uart_SendDataIt(M0P_UART1, ~u8RxData); //启动UART1发送第一个字节         
  26.         }

  27.     }
  28. }

  29. //UART1中断函数
  30. void Uart1_IRQHandler(void)
  31. {
  32.     if(Uart_GetStatus(M0P_UART1, UartRC))         //UART1数据接收
  33.     {
  34.         Uart_ClrStatus(M0P_UART1, UartRC);        //清中断状态位
  35.         u8RxData = Uart_ReceiveData(M0P_UART1);   //接收数据字节
  36.         u8RxCnt++;
  37.     }
  38.    
  39.     if(Uart_GetStatus(M0P_UART1, UartTC))         //UART1数据发送
  40.     {
  41.         Uart_ClrStatus(M0P_UART1, UartTC);        //清中断状态位
  42.         u8TxCnt++;
  43.     }

  44. }

  45. //串口引脚配置
  46. void App_PortInit(void)
  47. {
  48.     stc_gpio_cfg_t stcGpioCfg;
  49.    
  50.     DDL_ZERO_STRUCT(stcGpioCfg);
  51.    
  52.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
  53.    
  54.     ///<TX
  55.     stcGpioCfg.enDir = GpioDirOut;
  56.     Gpio_Init(GpioPortD, GpioPin7, &stcGpioCfg);
  57.     Gpio_SetAfMode(GpioPortD, GpioPin7, GpioAf1);          //配置PA02 端口为URART1_TX
  58.    
  59.     ///<RX
  60.     stcGpioCfg.enDir = GpioDirIn;
  61.     Gpio_Init(GpioPortD, GpioPin6, &stcGpioCfg);
  62.     Gpio_SetAfMode(GpioPortD, GpioPin6, GpioAf1);          //配置PA03 端口为URART1_RX
  63. }

  64. //串口配置
  65. void App_UartCfg(void)
  66. {
  67.     stc_uart_cfg_t    stcCfg;

  68.     DDL_ZERO_STRUCT(stcCfg);
  69.    
  70.     ///< 开启外设时钟
  71.     Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟
  72.    
  73.     ///<UART Init
  74.     stcCfg.enRunMode        = UartMskMode3;          ///<模式3
  75.     stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
  76.     stcCfg.enMmdorCk        = UartMskEven;           ///<偶检验
  77.     stcCfg.stcBaud.u32Baud  = 9600;                  ///<波特率9600
  78.     stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;       ///<通道采样分频配置
  79.     stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
  80.     Uart_Init(M0P_UART1, &stcCfg);                   ///<串口初始化
  81.    
  82.     ///<UART中断使能
  83.     Uart_ClrStatus(M0P_UART1,UartRC);                ///<清接收请求
  84.     Uart_ClrStatus(M0P_UART1,UartTC);                ///<清接收请求
  85.     Uart_EnableIrq(M0P_UART1,UartRxIrq);             ///<使能串口接收中断
  86.     Uart_EnableIrq(M0P_UART1,UartTxIrq);             ///<使能串口接收中断   
  87.     EnableNvic(UART1_3_IRQn, IrqLevel3, TRUE);       ///<系统中断使能

  88. }
https://blog.csdn.net/heqiunong/article/details/125974396
yangxiaor520 发表于 2024-9-24 13:26 来自手机 | 显示全部楼层
使用中断处理串口收发数据,对CPU的利用率更高。
shenxiaolin 发表于 2024-9-29 10:27 | 显示全部楼层
感觉用起来好复杂
更多更合适ii 发表于 2024-9-30 17:28 来自手机 | 显示全部楼层
你可以使用环形缓冲区来处理接收到的数据,而不是仅依赖u8RxCnt。这样可以支持更高效的数据接收。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

3656

帖子

2

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