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

stm32CUBE之串口通讯

[复制链接]
STMCU小助手 发布时间:2023-3-7 15:00
1、使用cube配置NIVC中断,配置一下串口的中断
' t7 f9 {( a  T6 R
' l3 s3 x* o; A* [2 B: |9 \
20190826143424611.png
  T. n  o' n+ C& m

% y1 K; w% n! n6 c% J2、配置串口
+ X) f/ D2 a2 |4 C6 ?& l+ ^8 L9 y8 F% v$ M5 l
20190826143458550.png ( S8 O5 j3 Y1 Q
5 d4 b" J. Z# @, T4 c
3、如果要在线仿真,要记得配置SYS
/ |/ D3 P% I3 U# @. r2 X' ]3 c  k
20190826143537693.png
+ ?5 P- T: u6 a2 Z

9 O& d, H5 ^8 q8 [8 ~- y& p4、使用函数: HAL_UART_Transmit(&huart1,testbuff,10,0xFFFF);进行串口发送5 _: P* D) j. |7 n' x% A) H" z
5、过程中发现直接配置好的串口无法进入中断
; R0 U9 p; @8 p: _& T在主函数加上 下面这两句就可以了$ \. n* ~! h3 B: k* M9 t) @& @
__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
( E4 x+ |0 ?9 m* ?__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);) H0 j* T; S+ Q) m2 H! [: V1 s' g
6、最后注意,主控程序加了以后,只能进去一次中断
0 b+ E, v. `. m在中断程序最后也要加上。完成了
* v* D. S# {) f& n" N7 _# R__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);2 `. u6 m  x( i. E9 ?
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);; f( U8 i& [, P  A' L" M* \1 d

! m+ u( [) m8 |- O# {

- P! X2 |( X* i0 ]! h" s6 ~DMA传输的串口通讯5 ?8 a: b3 h* ^2 x5 d" }5 R
1、配置基础上加DMA。DMA设置—ADD–选择–添加即可。把接受和发送都加上
# D% p- U; m9 @, ?
% a: f1 n" L8 J
20190827163420154.png
( ~1 c5 k( |& T; [
5 G3 S6 A9 V5 ]% o1 P! j- O# D
2、发送使用函数:HAL_UART_Transmit_DMA(&huart1,TxBuffer1,sizeof(TxBuffer1));, R% h" v- {; b7 Y0 ^6 ~) u* y
接收使用函数:
: }. _1 h% M" i3 avoid USART1_IRQHandler(void)& |1 w# V" F8 I2 Q8 l8 x2 V
{
; y  O9 j& `: R5 B" o8 n% f7 e/ zHAL_UART_Receive_DMA(&huart1,RxBuffer1,10);1 }/ A$ Z& i' U" G" Q  ~
HAL_UART_IRQHandler(&huart1);  [" o1 r3 ~4 X/ G, Z
}8 P$ _8 s2 V  W5 N$ U
' H7 g( c* p# c) l( j

9 ^9 I4 n# d0 f4 f3、使用注意事项
% A) e3 ~1 w: ]+ gHAL_UART_Receive_DMA(&huart1,RxBuffer1,10);这个函数应该在串口初始化就定义一次,告知我们中断接收长度,之前理解错误,放在串口中断里边才第一次定义,结果每次都收不到第一个字节。
5 h+ P) J, x# l7 C; C) I另外:使用DMA传输中发现,串口发送时候会进入void USART1_IRQHandler(void)这个函数,如果不进行是否是接收中断判断,会造成错误。后来把串口接收数据部分放入DMA的IRQHandler里边,也就是DMA的接收中断里边,就什么也不需要判断了,非常简单。% q+ q! F. H8 X0 s/ N1 H

  i1 |& e$ K- @) P3 F; f4 y
4、另外在使用cube配置完成可能会出现串口只能发一次的情况+ R& O0 F& k5 |8 u) r! y2 U; o
stm32f4xx_it.c(我这里以f4位例,其余系列按照芯片进入对应文件)中找到对应TX DMA的中断函数,我这里是DMA2_Stream7_IRQHandler函数,在代码中加入对串口的重新初始化 HAL_DMA_IRQHandler(&hdma_usart1_tx); HAL_UART_Init(&huart1); ,(使用串口几选择串口几,我这里是串口1)如下:
! }9 j0 u7 K3 c, h4 ^" C4 _8 Y' k6 t" K  F+ i3 b; ]' A: C5 P3 |- B
20210121163232851.png
; `4 p2 W$ y8 v

" r1 p3 s- z) m解决只能发一次的问题( f" s, @  X" A

  c9 d' h5 f7 E5、不能进入接收DMA中断DMA2_Stream2_IRQHandler(void),需要在主函数里边加入这两句话。) u! e( [# n, D( b
HAL_UART_Receive_DMA(&huart1, Usart_Rx_Buf, 20);7 z8 h* U) E0 e7 c4 o; D2 e
6、关于中断函数,如果这个里边不加入画线那句,能进入这个函数,但是自己不会跳到回调函数,具体为啥不知道,不知道哪里问题。
* ]- @4 r0 B# c" N后来又发现不放进来回调函数,回调函数也能进去了,不着调是cube哪里配置的问题,已经懵掉
/ o/ {1 v. N+ a& U( w/ u* f" |/ M4 N% i9 A. R
2021012215391417.png 8 C9 R; s6 T3 d

+ c2 r6 A$ J' h) i- v8 S; D
7、上操作系统,调试中还出现过奇葩的,串口在一个线程里边发送数据,延时600ms。结果出现1次执行发送两次的情况。后发现是由于该线程的栈大小设置过小造成的, L7 }, _" c8 s! B

0 ]# Q; h9 N+ l% _" M8、使用回调函数的一点自我感受。使用cube配置的,DMA传输功能的。如果要使用空闲总线中断,使用前加入这两句话。2 k9 s% ]8 x5 u' @9 B" W
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);& L% h  V1 W6 F( G4 X% B5 d8 h
HAL_UART_Receive_DMA(&huart1, Usart_Rx_Buf, 10);" y6 m7 ^- o2 d( K) R8 W; w
串口中断里边加入这些。因为我们进入HAL_UART_AbortReceive_IT(&huart1);会发现里边调用了回调函数HAL_UART_AbortReceiveCpltCallback。所以我们加入下面的以后,我们只需要在我们的文件中加入此回调函数,做串口数据处理。这样就完成了串口接收。+ q, m4 y3 ?2 t: b& I
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)3 @# X  P$ z6 z9 V6 h1 L
{# k. p1 }) H) Y
HAL_UART_AbortReceive_IT(&huart1);
1 o$ [% ~7 Y- o+ X! K% J__HAL_UART_CLEAR_IDLEFLAG(&huart1);
& |6 F  P& R! w6 U}7 z; k( H8 I  K
' C" i1 T" E+ n2 I+ L
串口回调函数的一个数据处理举例如下# Z  Y4 [" a  D9 e2 f

1 q$ K$ a, b/ T# { 20210126085305756.png 6 W$ d% E7 F& F
4 f; S, I. r4 ?, x
————————————————
5 M; g+ I' A8 _版权声明:冬麻麻
( L' \, ~/ ~& x0 Q( e
2 X% Q, ]% d! ~! O
  T! O" a$ Y! x! O3 ?* p
收藏 评论0 发布时间:2023-3-7 15:00

举报

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