你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX串口中断偶校验问题

[复制链接]
yang9397 发布时间:2021-4-16 14:12

      STM32CubeMX是一款非常方便的工具软件。但是在使用时也会存在一些问题。比如,最近调试昆仑通态触摸屏与单片机的串口通讯,波特率为9600,数据位8位,偶校验,1位停止位。使用STM32CubeMx设置参数如下:
3.1.png
     需要注意的是,STM32的数据位是包含校验位的,所以数据位要选择9位。
     生成代码后,添加相关的接收中断程序,参考《STM32CubeMX之串口通信》。但实际测试时,发现接收的第一个字节总是0。经过单步调试跟踪发现,串口接收发生了Over-Run错误,进入了以下程序,导致接收错误。
3.2.png
     之后改为自己写的中断接收程序后,没有出现错误,说明该软件生成的代码还是有一定的局限性的。自己编写的代码如下:
    首先,初始化完成后,打开串口接收中断:
  1. __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//打开接收中断
复制代码

    然后,在串口中断中,屏蔽软件生成的中断函数,添加自己的中断程序:
  1. void USART1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART1_IRQn 0 */

  4.   /* USER CODE END USART1_IRQn 0 */
  5.   //HAL_UART_IRQHandler(&huart1);//屏蔽系统生成的中断函数
  6.   /* USER CODE BEGIN USART1_IRQn 1 */
  7.   uint32_t isrflags = USART1->SR;
  8.   uint32_t cr1its   = USART1->CR1;
  9.   
  10.   if(USART1->SR & UART_IT_RXNE)//串口接收中断
  11.   {
  12.     __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
  13.     if(Uart1.RxFlag!=2)
  14.     {
  15.       Uart1.RxBuf[Uart1.RxCnt]=USART1->DR;
  16.       Uart1.RxCnt++;
  17.       if(Uart1.RxCnt>300)
  18.       {
  19.           Uart1.RxCnt=299;
  20.       }
  21.       Uart1.RxFlag=1;
  22.       Uart1.uart_tick=0;
  23.     }
  24.   }
  25.   if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))//发送中断
  26.   {
  27.     USART1->DR = Uart1.TxBuf[Uart1.TxCnt];
  28.     Uart1.TxCnt++;
  29.     if(Uart1.TxCnt == Uart1.TxNum)
  30.     {
  31.       Uart1.TxCnt=0;
  32.       __HAL_UART_DISABLE_IT(&huart1, UART_IT_TXE);
  33.       __HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);
  34.     }
  35.   }
  36.   if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))//发送完成中断
  37.   {
  38.     __HAL_UART_DISABLE_IT(&huart1, UART_IT_TC);
  39.     Uart1.TxFlag = 0;
  40.     CLR_DE1;
  41.   }
  42.   /* USER CODE END USART1_IRQn 1 */
  43. }
复制代码

    中断函数中包含了发送中断部分,需要中断发送数据时,将数据放在Uart1.TxBuf中,设置发送长度Uart1.TxNum,并使能串口发送中断即可:
  1. Uart1.TxNum = 10;
  2. __HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
复制代码

   STM32CubeMx生成的程序通过牺牲效率而尽可能实现不同系列芯片的通用性,相比而言,自己编写中断程序效率要高很多,当系统资源有限或者需要单片机低速运行时,就需要自己编写相关程序,以实现程序的高效运行。
文章出处: 嵌入式技术开发

收藏 评论0 发布时间:2021-4-16 14:12

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版