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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版