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

【经验分享】STM32L476G-Discovery笔记七

[复制链接]
STMCU小助手 发布时间:2022-5-27 21:27
本篇笔记用来记录HAL_UART_Receive_IT(串口中断接收)和HAL_UART_Transmit(串口发送)共同使用时,出现中断无法再次进入的情况,以及对应的解决过程和方案。


1 W9 j* S: k% m# B
在我预留了一个问题:
4 N+ U# I1 s' I1 \
HAL_UART_Transmit的第三个参数,用来指定最大的发送时间。如果超过这个发送时间还没有发送成功,那么就会返回发送超时。更郁闷的是,如果产生了发送超时,那么后面连接收中断都不会触发了(本问题有待深究)。
3 g/ v2 O9 [* Z5 M2 F# G( i
那么,这个问题究竟如何解决呢?通过在社区中的求助。得到了一个解决方案。通过运行__HAL_UART_ENABLE_IT方法,来恢复中断的触发。代码比较简单:

) U1 t( Y) {1 ?! S: F
  while(d5list_length()>0)- m9 D+ w: s, x9 |7 ]- E
  {
: D3 q% C' S6 ?: ]- v' y, K   struct __d5pack * p = d5list_pop();& f3 A! D  w, A7 X9 J3 V
   uint8_t cmd = p->cmd;
& o; v- R. z8 I$ n" }5 {- j6 g- u& y   uint8_t back[128]="";: L$ H- Y& M* {
   sprintf((char *)back,"got package %d",cmd); // 拼合字符串: Z) [. B* p0 E
   HAL_UART_Transmit(&huart2,back,13,0xffff); // 发送字符串
9 `6 ]3 c1 {/ i: J5 j   __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
1 P# L, @  P& x  }

- y: w3 M; }" I6 T) c$ Y
如上述代码所示,在一次发送完成之后。通过调用__HAL_UART_ENABLE_IT方法,即可使中断恢复运行,不再出现如笔记五中所述的,发送一次数据后,就无法再次进入中断的问题。

# b  ^; ^7 T: _: [: A0 [& a& g4 |* e
但是进一步测试发现,如果在一次循环中,连续调用两次HAL_UART_Transmit依然会造成串口锁死,无法触发中断。当然,连续两次调用这种写法本身就不够好。应该把要发送的数据合成在一起,统一发送一次。而不是分开发送多次,增加系统消耗。

. J1 F$ ]6 A+ R
因此,到目前为止。我们已经实现了可“维持”的数据包接受和发送。当然还不是最终的解决方案。当发包过于频繁的时候,还是会出现锁死的情况。我猜想是对HAL库不够熟悉的原因。作为一个遗留问题暂且保留。下一篇笔记开始,将回到WIFI模块,开始尝试通过无线连接来收发数据。

6 ~$ c2 ^. f- c! |) W
收藏 评论0 发布时间:2022-5-27 21:27

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版