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

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

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

# b4 u) r+ C" h7 e
在我预留了一个问题:
9 L! v' F, O" R% f: H
HAL_UART_Transmit的第三个参数,用来指定最大的发送时间。如果超过这个发送时间还没有发送成功,那么就会返回发送超时。更郁闷的是,如果产生了发送超时,那么后面连接收中断都不会触发了(本问题有待深究)。
+ T1 h7 O) X2 }  O/ ~" r# I
那么,这个问题究竟如何解决呢?通过在社区中的求助。得到了一个解决方案。通过运行__HAL_UART_ENABLE_IT方法,来恢复中断的触发。代码比较简单:
4 O' f: X# y  f$ B# `9 x% B
  while(d5list_length()>0); a, ^: h6 S, S' P* Y! {7 Y9 ~
  {) ]- v3 D! d! |1 n) G
   struct __d5pack * p = d5list_pop();
  E( N5 X3 t0 z1 W! l   uint8_t cmd = p->cmd;$ L8 ]  v4 p8 M9 P0 o
   uint8_t back[128]="";0 y9 \2 C8 J1 E( l/ x
   sprintf((char *)back,"got package %d",cmd); // 拼合字符串3 t1 w  f2 s$ F9 |# \+ Y4 h1 D
   HAL_UART_Transmit(&huart2,back,13,0xffff); // 发送字符串
6 r6 i+ {( }# A0 D7 k1 u   __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
3 R* `* u' H% v8 l6 I$ y/ e0 w$ n  }

  T8 p4 u) o: o. w) w' V, b
如上述代码所示,在一次发送完成之后。通过调用__HAL_UART_ENABLE_IT方法,即可使中断恢复运行,不再出现如笔记五中所述的,发送一次数据后,就无法再次进入中断的问题。
& x- ?7 i) m- b* w% ?" s7 K
但是进一步测试发现,如果在一次循环中,连续调用两次HAL_UART_Transmit依然会造成串口锁死,无法触发中断。当然,连续两次调用这种写法本身就不够好。应该把要发送的数据合成在一起,统一发送一次。而不是分开发送多次,增加系统消耗。

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

& k# H3 ^0 c$ [* w& x4 Z% Y
赞 收藏 评论0 发布时间:2022-5-27 21:27

举报

0个回答

所属标签

相似技术帖

官网相关资源

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