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

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

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


. n; T1 Y8 ~" i) N3 k
在我预留了一个问题:

8 f/ z$ @- x0 ^0 Z1 H# Y+ E1 R
HAL_UART_Transmit的第三个参数,用来指定最大的发送时间。如果超过这个发送时间还没有发送成功,那么就会返回发送超时。更郁闷的是,如果产生了发送超时,那么后面连接收中断都不会触发了(本问题有待深究)。

( a: L) ?. f/ g- g. k$ o; A
那么,这个问题究竟如何解决呢?通过在社区中的求助。得到了一个解决方案。通过运行__HAL_UART_ENABLE_IT方法,来恢复中断的触发。代码比较简单:

1 ^# t; e, f* R* @) ?+ n$ d, |
  while(d5list_length()>0)
* ?. W. g/ c- p; a5 n+ i) W  {8 W" s/ I% a6 ~6 J' r; t: ^9 ~  A
   struct __d5pack * p = d5list_pop();# [( N; O% O8 B; Y2 `4 ^
   uint8_t cmd = p->cmd;
, t- T$ ]! g" [! Q' j/ y   uint8_t back[128]="";2 T6 F$ U/ y9 y8 C2 o$ O, H
   sprintf((char *)back,"got package %d",cmd); // 拼合字符串1 W1 ^; _. F% W7 ]* D  v2 P
   HAL_UART_Transmit(&huart2,back,13,0xffff); // 发送字符串
$ ^% x8 @9 S; p4 V8 S& [; [   __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
9 n5 i* y* R8 ~* c) u6 L  }

' \+ P, F0 z' n* e( z2 w! {* `
如上述代码所示,在一次发送完成之后。通过调用__HAL_UART_ENABLE_IT方法,即可使中断恢复运行,不再出现如笔记五中所述的,发送一次数据后,就无法再次进入中断的问题。
* W( q  f1 G+ k2 r6 W7 d
但是进一步测试发现,如果在一次循环中,连续调用两次HAL_UART_Transmit依然会造成串口锁死,无法触发中断。当然,连续两次调用这种写法本身就不够好。应该把要发送的数据合成在一起,统一发送一次。而不是分开发送多次,增加系统消耗。

  R& y& F5 e$ y% K9 @+ r4 k/ z
因此,到目前为止。我们已经实现了可“维持”的数据包接受和发送。当然还不是最终的解决方案。当发包过于频繁的时候,还是会出现锁死的情况。我猜想是对HAL库不够熟悉的原因。作为一个遗留问题暂且保留。下一篇笔记开始,将回到WIFI模块,开始尝试通过无线连接来收发数据。
! h. Y; x3 u8 p  x# i
赞 收藏 评论0 发布时间:2022-5-27 21:27

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版