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

STM32 串口接收中断与外部中断的优先级问题

[复制链接]
pkoko 提问时间:2019-12-18 11:37 /
阅读主题, 点击返回1楼
收藏 评论19 发布时间:2019-12-18 11:37
19个回答
爱电子辉辉 回答时间:2019-12-19 18:38:49
TIM图片20191219183612.png
楼主,你看,是不是这个原因,选择PA4的时候,串口2哪里出现了警告。。
pkoko 回答时间:2019-12-20 00:14:46
爱电子辉辉 发表于 2019-12-19 18:38
楼主,你看,是不是这个原因,选择PA4的时候,串口2哪里出现了警告。。
...

选择UART2,实际只使用了 PA2(USART2_TX)、PA3(USART2_RX)两个引脚。PA4引脚的功能之一是UART2_CK,当将PA4的功能设置为UART2_CK时,不会出现“黄色三角感叹号”。
而当将PA4重映射为其它功能时,比如GPIO_EXIT4 或 GPIO_input 都会出现这个提示。应该是正常的。
pkoko 回答时间:2019-12-20 00:32:11
mylovemcu 发表于 2019-12-19 08:31
你检查一下  是不是抢占优先级和响应优先级设置反了  现在实际设置的是响应优先级??
最好把响应优先级也 ...

1、抢占优先级,子优先级都是通过下面HAL_NVIC_SetPriority()这个函数设置的。该函数的代码如下(ST的原版代码),其中第2个参数就是抢占优先级,第3个参数是子优先级。CubeMX自动生成的代码就是这个函数设置,应该没有有错。
2、同时,也尝试了把UART2的优先级设置为 HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);  把外部中断4优先级设置为 HAL_NVIC_SetPriority(EXTI4_IRQn, 3, 1);  这样无论如何,UART2的优先级都是高于外部中断4的。但是现象仍然依旧。
3、我使用的是STM32F103C8T6最小系统。为排除芯片问题,换了另一个最小系统模块。表现完全相同。应该不是芯片的问题。4、接下来考虑换一个UART试试,待测试后报告结果。

  1. void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
  2. {
  3.   uint32_t prioritygroup = 0x00U;
  4.   
  5.   /* Check the parameters */
  6.   assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
  7.   assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
  8.   
  9.   prioritygroup = NVIC_GetPriorityGrouping();
  10.   
  11.   NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
  12. }
复制代码

pkoko 回答时间:2019-12-22 12:27:30
pkoko 发表于 2019-12-20 00:32
1、抢占优先级,子优先级都是通过下面HAL_NVIC_SetPriority()这个函数设置的。该函数的代码如下(ST的原版 ...

将UART2接收中断改为UART3接收中断,问题依旧。
看来还是中断的问题。还要进一步找原因
radio2radio 回答时间:2019-12-22 15:16:51
我估计是,你MPU6050每5ms触发一次+传送大量数据(不知道你的I2C速度是多少?硬件I2C?),已经搞到CPU很繁忙,可以用示波器看一看你到底还有多少CPU的空闲时间。
可以试一试,把UART Rx 的缓存搞大一些,在每一次5ms的间隙里面检查一下UART缓存有没有收到的指令。
pkoko 回答时间:2019-12-23 00:02:11
radio2radio 发表于 2019-12-22 15:16
我估计是,你MPU6050每5ms触发一次+传送大量数据(不知道你的I2C速度是多少?硬件I2C?),已经搞到CPU很繁 ...

采用的HAL硬件I2C,不是模拟I2C,速率是4M。
尝试降低了MPU6050的中断频率,MPU6050产生中断频率从200Hz(5ms),直到降低到16Hz(62.5ms)时,串口中断可以接收到数据(MPU6050中断频率16Hz以上时,串口中断无法正常接收数据)。但是串口中断接收一定数据后,不再持续中断接收。“一定”数据的个数似乎是随机的,目前测试与MPU6050的中断频率有关:当频率为16Hz时,大约能正常接收4组字节的数据(51个字节为一组,分组发送,每组之间有1秒以上时间间隔);当MPU6050中断频率为5Hz时,大约能正常接收30组字节数据。
baobo 回答时间:2019-12-23 07:26:44
谢谢分享
pkoko 回答时间:2019-12-27 14:57:14
     参考各位的提醒和建议,分析了我的应用场景:MPU6050每隔20ms产生中断,在EXIT4回调函数中,I2C读取MPU6050数据,并打包发送到上位机;上位机的控制信息通过UART2 接收中断接收,并解析协议数据。
    这个方案选择是有问题的:20ms外部中断比较频繁,而UART2的发送速度较低。同时UART2中断接收,每收到一个字节中断一次,并尝试处理协议解析。CPU很繁忙。
    改进方案:1)将UART2向上位机发送MPU6050数据从EXIT4回调函数中移到main()中 ;  2)将UART2接收改为DMA IDLE模式。DMA接收到数据后,协议处理放到main()中进行。
   上述改进方案后,UART2可正常接收到上位机的控制命令,同时MPU6050每20ms中断读取也可正常进行。达到目标要求。

   当前在EXIT4的回调函数中,还要一部分进行数据处理,协议解析的的函数。后续也可考虑移到main()中,进一步降低中断占用时间。

    再次感谢各位的建议。
奏奏奏 回答时间:2019-12-27 19:15:34
pkoko 发表于 2019-12-27 14:57
参考各位的提醒和建议,分析了我的应用场景:MPU6050每隔20ms产生中断,在EXIT4回调函数中,I2C读取MP ...

基本原则上中断中只进行赋值与将标记位置位,然后在循环体中解析协议。
如果中断会在某一段短时间内集中更新数据的话,还需要用到消息队列,然后在循环体中将消息队列中的数据读取出来,一条一条按协议解析出来。
pkoko 回答时间:2019-12-27 21:23:40
奏奏奏 发表于 2019-12-27 19:15
基本原则上中断中只进行赋值与将标记位置位,然后在循环体中解析协议。
如果中断会在某一段短时间内集中 ...

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