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

stm32CUBE之串口通讯

[复制链接]
STMCU小助手 发布时间:2023-3-7 15:00
1、使用cube配置NIVC中断,配置一下串口的中断
8 I0 Q- @" F0 \7 O  v) p% X+ W  k1 Z  e( I% d
20190826143424611.png - w% ]5 |" R1 }' z6 S2 S+ N5 S
, ^) v0 q- D% T" `# O
2、配置串口$ c0 \# R( g/ w3 x/ d  E% v9 j) c

, U+ ^% b5 z6 q9 m# }: d5 P
20190826143458550.png
% h, r9 }4 Q$ s
1 V6 ?! i& B' x" P1 I+ a; B1 y, i
3、如果要在线仿真,要记得配置SYS- z" P+ s3 u% Y5 {

; ]. F2 H3 Z5 f7 N4 M
20190826143537693.png ; j% j4 \5 M/ T6 \( f! ~( C

5 V8 e% F0 E& W& G4、使用函数: HAL_UART_Transmit(&huart1,testbuff,10,0xFFFF);进行串口发送
2 U4 A- W+ I* Q" |8 `' a0 t& m5、过程中发现直接配置好的串口无法进入中断0 V& \% F0 f, B4 l- f  [
在主函数加上 下面这两句就可以了  s! K! K! o7 C# w! e' p' b# B% X
__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
; T( V/ S/ U- z8 X! u# l__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);" X! V) t, n1 t  _
6、最后注意,主控程序加了以后,只能进去一次中断
0 f( O6 _, @/ E6 _% b3 S在中断程序最后也要加上。完成了
5 w2 q9 w' [& e5 y0 e" c__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
* w5 a3 Z2 h0 x! a+ A0 ~__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);0 x- W/ N. b0 K9 z* I4 o, c
( X6 Y: d2 i& I8 ^

5 E7 T) }1 w$ n; {0 E* eDMA传输的串口通讯
, t: H! |: t+ J- |* }* q1、配置基础上加DMA。DMA设置—ADD–选择–添加即可。把接受和发送都加上
5 m9 F4 z. E5 q8 p# g$ q1 {5 Y. H5 d2 V/ C- G! u4 }
20190827163420154.png
( }6 b. {# @; n9 R6 n% L2 k2 i1 b6 d5 t. s. C1 x2 Z
2、发送使用函数:HAL_UART_Transmit_DMA(&huart1,TxBuffer1,sizeof(TxBuffer1));
& I! i  _4 |6 L4 t& @& M9 j接收使用函数:
7 v6 p+ O/ L) U9 nvoid USART1_IRQHandler(void)& ?1 p! O% ]1 H8 O3 M( I6 |
{: I# {7 O) `* y: f% `/ @% c$ |- b- ~8 c
HAL_UART_Receive_DMA(&huart1,RxBuffer1,10);( p8 w1 I1 K! C& B- x( I% i
HAL_UART_IRQHandler(&huart1);
: K- O& E. J, ~4 ?8 h: k3 ~}
, s2 G/ A9 d- ?6 H8 m/ U
. N) X/ j8 I9 Y/ r$ g( H& D( {9 }0 _2 \% u
6 B5 V0 S5 i* }& ?- R2 M
3、使用注意事项2 v' n# g- d6 ~) ]2 Q" ~: r8 ~
HAL_UART_Receive_DMA(&huart1,RxBuffer1,10);这个函数应该在串口初始化就定义一次,告知我们中断接收长度,之前理解错误,放在串口中断里边才第一次定义,结果每次都收不到第一个字节。2 f) z  M6 R& _  f( T1 L( q
另外:使用DMA传输中发现,串口发送时候会进入void USART1_IRQHandler(void)这个函数,如果不进行是否是接收中断判断,会造成错误。后来把串口接收数据部分放入DMA的IRQHandler里边,也就是DMA的接收中断里边,就什么也不需要判断了,非常简单。0 r& m) h6 s' I: Q

; s5 ?) a1 C3 m. b! I: }
4、另外在使用cube配置完成可能会出现串口只能发一次的情况# j! m/ ]$ l. p
stm32f4xx_it.c(我这里以f4位例,其余系列按照芯片进入对应文件)中找到对应TX DMA的中断函数,我这里是DMA2_Stream7_IRQHandler函数,在代码中加入对串口的重新初始化 HAL_DMA_IRQHandler(&hdma_usart1_tx); HAL_UART_Init(&huart1); ,(使用串口几选择串口几,我这里是串口1)如下:# R/ z, W! f9 N2 ]( R/ h  `, m) r
' T, b3 K& r& Q, k8 w" P2 C
20210121163232851.png
& S& Z+ ~/ p* S. W+ A; _# g
2 K) v& s. N" F9 J+ g( q
解决只能发一次的问题
5 g1 ^& ~: n2 r6 [" P5 F9 h. R
  D3 U% h! t% D
5、不能进入接收DMA中断DMA2_Stream2_IRQHandler(void),需要在主函数里边加入这两句话。( n# P& i- V) i% ?, _7 O: ?
HAL_UART_Receive_DMA(&huart1, Usart_Rx_Buf, 20);
6 S. y& r2 [4 N: Q* k3 D' x- O. m6、关于中断函数,如果这个里边不加入画线那句,能进入这个函数,但是自己不会跳到回调函数,具体为啥不知道,不知道哪里问题。
; A; m$ R! K7 L后来又发现不放进来回调函数,回调函数也能进去了,不着调是cube哪里配置的问题,已经懵掉. S" j8 @9 S; J5 v

, I* w8 Z+ Y# C( y
2021012215391417.png
! ]0 b1 h+ M& i  \# |
/ l9 _$ f/ b$ `# {2 P5 C  _
7、上操作系统,调试中还出现过奇葩的,串口在一个线程里边发送数据,延时600ms。结果出现1次执行发送两次的情况。后发现是由于该线程的栈大小设置过小造成的
. |9 n) p& y' s) A1 [9 f; v$ T& {
# E: u2 y7 m4 E' y, |
8、使用回调函数的一点自我感受。使用cube配置的,DMA传输功能的。如果要使用空闲总线中断,使用前加入这两句话。) {2 M: S- l7 g* ]
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
& ?, M9 W' g: n4 xHAL_UART_Receive_DMA(&huart1, Usart_Rx_Buf, 10);
- U- `; i: z( q: h' \$ n  @串口中断里边加入这些。因为我们进入HAL_UART_AbortReceive_IT(&huart1);会发现里边调用了回调函数HAL_UART_AbortReceiveCpltCallback。所以我们加入下面的以后,我们只需要在我们的文件中加入此回调函数,做串口数据处理。这样就完成了串口接收。# V0 c  F: n6 P/ c
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)6 [' i; V2 Y, l6 K! d9 n; a4 t
{
+ i' U8 K- Z$ q2 [6 Q: n# T: KHAL_UART_AbortReceive_IT(&huart1);5 q+ {! n9 d  f
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
; S  f4 |  z- Z}3 e5 A6 M9 B: i, l2 g
: i) L" l: r5 A$ l. h% n
串口回调函数的一个数据处理举例如下( A2 w5 d  Q. W8 U( C1 Y' t2 Q
( B6 w* K, \0 P& w
20210126085305756.png
# ]# ^; x7 s9 J+ x8 p4 N: q
& a! C/ `  p* c0 H4 Q  T4 a2 H————————————————4 E# d% ?* o: c6 B
版权声明:冬麻麻
) M$ P. n  \6 E2 z$ K' z& r) l& `4 P1 `
/ C( v& R0 ~4 t
赞 收藏 评论0 发布时间:2023-3-7 15:00

举报

0个回答

所属标签

相似技术帖

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