当前位置: 首页 > news >正文

关于STM32 UART4串口通信出现的N个问题的解决

1.CubeMX生成的代码工程结构是比较合理的,但需要注意HAL库代码中初始化函数的调用顺序。

以串口初始化为例,勾选生成.c/.h文件后,CubeMX会把所有的串口外设放在usart.c中进行初始化,不同的串口间,使用不同的MX_U(S)ARTx_Init对串口外设进行配置,共用弱定义HAL_UART_MspInit进行引脚和中断的底层配置。

调用关系是,MX_UART4_Init-->HAL_RS485Ex_Init-->HAL_UART_MspInit,相当于底层配置和开启中断的操作是在外设初始化进行了一半时开始的。若需要自己实现每个串口一个私有的MspInit,那么初始化的顺序应该是,要把中断的配置和使能,放在最后的部分。

下面只有第一个函数正确。

/*正确的操作:先配置底层IO,再配置外设,最后配置中断*/
void BSP_RS232_Init(void)
{MX_RS232_MspInit();MX_UART4_Init();/* UART4 interrupt Init */HAL_NVIC_SetPriority(UART4_IRQn, 0, 0);HAL_NVIC_EnableIRQ(UART4_IRQn);__HAL_UART_ENABLE_IT(&huart4,UART_IT_RXNE);//接收中断
}/*错误的操作1:*/
void BSP_RS232_Init(void)
{MX_RS232_MspInit();//在此开启了中断MX_UART4_Init();
}/*错误的操作2:*/
void BSP_RS232_Init(void)
{MX_UART4_Init();MX_RS232_MspInit();//在此开启了中断
}

 2.串口RXNE中断里一定不要打印(400M主频,波特率4800时打印才不会影响通信),不然就ORE溢出了,触发ORE中断后也要处理

/*** 串口4中断服务函数*/
void UART4_IRQHandler(void)
{if(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_RXNE)!=RESET)//接收到数据{RS232_Receive(UART4->RDR);}else{__HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_OREF);}
}

3.若串口中断里进行上传OS队列等OS相关操作,一定要将串口中断优先级降至可受OS管理的级别,不然会出现不上传队列、丢包的现象

void BSP_RS232_Init(void)
{MX_RS232_MspInit();MX_UART4_Init();__HAL_UART_ENABLE_IT(&huart4,UART_IT_RXNE);//接收中断/* UART4 interrupt Init */HAL_NVIC_SetPriority(UART4_IRQn, 0x05, 0);//因为会在中断中调用OS相关API,优先级不能高于OS管理的范围HAL_NVIC_EnableIRQ(UART4_IRQn);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 科技与占星的融合:AI 智能占星师
  • mac下通过brew安装mysql的环境调试
  • Vue3计算属性终极实战:可媲美Element Plus Tree组件研发之节点勾选
  • 文件上传漏洞(ctfshow web151-161)
  • 16现代循环神经网络—深度循环与双向循环
  • 52、PHP 实现选择排序
  • 点脂成金携手北京新颜兴医疗美容医院,共启战略合作新篇章
  • Android 10.0 Launcher 启动流程
  • 开源消息队列比较
  • 【前端 15】Vue生命周期
  • 数据库实验:SQL Server基本表单表查询
  • SpringBoot集成Sharding-JDBC实现分库分表
  • 【计算机网络】TCP协议详解
  • linux环境下重新编译opencv的安卓动态链接库opencv_java4.so文件
  • TransmittableThreadLocal跟InheritableThreadLocal使用
  • [NodeJS] 关于Buffer
  • 【前端学习】-粗谈选择器
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js
  • Next.js之基础概念(二)
  • PHP的Ev教程三(Periodic watcher)
  • 关于for循环的简单归纳
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 探索 JS 中的模块化
  • ​渐进式Web应用PWA的未来
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 飞书APP集成平台-数字化落地
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (1)无线电失控保护(二)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C)一些题4
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (算法)N皇后问题
  • (五)c52学习之旅-静态数码管
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .net 受管制代码
  • .sh
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [30期] 我的学习方法
  • [AIGC] 深入浅出 Python中的`enumerate`函数
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [CSS]中子元素在父元素中居中
  • [daily][archlinux][game] 几个linux下还不错的游戏
  • [FBCTF2019]RCEService1
  • [FlareOn5]Ultimate Minesweeper
  • [GXYCTF2019]BabySQli1
  • [jQuery]div滚动条回到最底部
  • [LeetCode] Max Points on a Line
  • [Linux] day07——查看及过滤文本
  • [Lua实战]整理Lua中忽略的问题