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

stm32CUBE之串口通讯

[复制链接]
STMCU小助手 发布时间:2023-3-7 15:00
1、使用cube配置NIVC中断,配置一下串口的中断; y4 V/ ~( m  _- {% \

5 _- a# X6 b6 W6 T, h% ^# x  p
20190826143424611.png ( V2 k. p* o$ X& [5 G  ~1 T, e

* o5 f* x7 e7 X, Z& q; E2、配置串口
- J  l0 Z% J  W3 j* F, _8 ]4 U
+ Z- l  y6 ^$ Q5 a5 H' t+ k
20190826143458550.png ( j/ d, ~, x4 M' V! Q) T
; W% s8 \/ @! T! M# n9 b+ y, {
3、如果要在线仿真,要记得配置SYS2 D. N" E) k2 r( n3 o% a

; z. ~. p; x. R& ^, r. V
20190826143537693.png . p, ?  a, Z% ~( q! Z

; T& V5 i% d- p! n; ]) p3 @4、使用函数: HAL_UART_Transmit(&huart1,testbuff,10,0xFFFF);进行串口发送, s! C$ c# K* y* w/ ]* P
5、过程中发现直接配置好的串口无法进入中断- @6 O5 @7 b9 |7 N7 _* o
在主函数加上 下面这两句就可以了- v4 Z. Q2 s- g, E
__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);* s7 T" r/ R5 k1 h
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);, t/ _" H& m+ p
6、最后注意,主控程序加了以后,只能进去一次中断
% i+ Y5 n5 L) U0 r& C在中断程序最后也要加上。完成了/ o6 M& }( o8 N: }0 E8 f
__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);. ?' H8 @6 N5 }; S
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
* H4 J: U7 Q+ u& ~9 }6 K2 P, x+ l) E9 ?

- ^: F3 Y) B! z2 S$ BDMA传输的串口通讯
; _) O' r* E; @4 Z0 w1、配置基础上加DMA。DMA设置—ADD–选择–添加即可。把接受和发送都加上
5 f2 X+ d0 x2 U) C3 E2 e6 V
" E8 {5 c- h) ~* s# @# @8 O; J7 D3 r+ E
20190827163420154.png
. i: _* b: j( I. ~( E' U. Q5 Z3 o+ F7 v6 `
2、发送使用函数:HAL_UART_Transmit_DMA(&huart1,TxBuffer1,sizeof(TxBuffer1));
# x" S) N8 s( N6 Q. Z* q接收使用函数:
( ~6 t9 A8 _# Z- o6 L, M* Xvoid USART1_IRQHandler(void)  F, @& }5 \2 s. {5 W1 S
{2 l8 e; |2 [+ g8 y+ b
HAL_UART_Receive_DMA(&huart1,RxBuffer1,10);1 g5 u- k& o2 v
HAL_UART_IRQHandler(&huart1);
: G7 j" F* F$ V  C2 N9 J* D+ X5 V}" i' \4 a& z6 m! o7 ?* X+ p9 p8 e% y

5 ^7 m" n4 Y$ J" G) w# \6 z0 @4 I  a
, z. h0 a1 t  V: x+ D9 w
3、使用注意事项
2 q2 T# G& m9 i4 p2 J+ I' I; f# JHAL_UART_Receive_DMA(&huart1,RxBuffer1,10);这个函数应该在串口初始化就定义一次,告知我们中断接收长度,之前理解错误,放在串口中断里边才第一次定义,结果每次都收不到第一个字节。* s4 o; p8 z) M5 B
另外:使用DMA传输中发现,串口发送时候会进入void USART1_IRQHandler(void)这个函数,如果不进行是否是接收中断判断,会造成错误。后来把串口接收数据部分放入DMA的IRQHandler里边,也就是DMA的接收中断里边,就什么也不需要判断了,非常简单。7 D: C, a: S! f9 b' r5 g. T, C; y

& j$ L- `9 A% A) z$ x
4、另外在使用cube配置完成可能会出现串口只能发一次的情况
: q% f  j: T0 h% x" Cstm32f4xx_it.c(我这里以f4位例,其余系列按照芯片进入对应文件)中找到对应TX DMA的中断函数,我这里是DMA2_Stream7_IRQHandler函数,在代码中加入对串口的重新初始化 HAL_DMA_IRQHandler(&hdma_usart1_tx); HAL_UART_Init(&huart1); ,(使用串口几选择串口几,我这里是串口1)如下:. i- o8 w6 E/ q$ d/ |

  X0 z2 e3 E; U/ t- F% D
20210121163232851.png
: L* W# C4 h4 l8 `3 j

) o8 u4 F' F- X1 N解决只能发一次的问题3 w, A9 ?* i8 N5 S" g" S

( x" p1 x2 o* K# g8 k" `5、不能进入接收DMA中断DMA2_Stream2_IRQHandler(void),需要在主函数里边加入这两句话。" x% ^$ e$ P: ^% h2 `5 b
HAL_UART_Receive_DMA(&huart1, Usart_Rx_Buf, 20);
0 M, V( @; e9 L0 L6、关于中断函数,如果这个里边不加入画线那句,能进入这个函数,但是自己不会跳到回调函数,具体为啥不知道,不知道哪里问题。3 V, c) b% K: [) b: y/ U9 i
后来又发现不放进来回调函数,回调函数也能进去了,不着调是cube哪里配置的问题,已经懵掉
" W9 U/ L7 i1 ]* V6 b; P) N+ b6 a! o: W' t* u) Z" a
2021012215391417.png . R; E3 D, z2 s- @/ [( }  g0 P/ V
5 [5 J* s/ {' X5 o$ U5 Y0 B
7、上操作系统,调试中还出现过奇葩的,串口在一个线程里边发送数据,延时600ms。结果出现1次执行发送两次的情况。后发现是由于该线程的栈大小设置过小造成的
/ i# J# ]5 {9 B4 I* K
* ~/ W) p  h7 g+ y0 [% Y+ l/ m
8、使用回调函数的一点自我感受。使用cube配置的,DMA传输功能的。如果要使用空闲总线中断,使用前加入这两句话。/ |' i6 K1 E/ c3 K  W& M/ G
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);) F# S5 {5 T* C
HAL_UART_Receive_DMA(&huart1, Usart_Rx_Buf, 10);
- ^  t0 s8 t  }0 F# N: }8 a, r串口中断里边加入这些。因为我们进入HAL_UART_AbortReceive_IT(&huart1);会发现里边调用了回调函数HAL_UART_AbortReceiveCpltCallback。所以我们加入下面的以后,我们只需要在我们的文件中加入此回调函数,做串口数据处理。这样就完成了串口接收。
  v& f& Y8 }$ O" `( z7 D! K0 L! ?if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)' B- n& g7 @. I8 W% X/ e
{  s! n% x3 b2 c4 r; H2 p
HAL_UART_AbortReceive_IT(&huart1);0 R0 |& a& {% O5 w7 |7 }
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
8 M3 x/ c) ]% ^6 a% Q5 i}
$ L# f% P2 k4 h, g3 L$ ^2 c, d
* l- C' |: O: B( ]( l串口回调函数的一个数据处理举例如下6 Z7 [2 n- l! c# [$ t4 |, C

% W) P4 c# B$ Z- q! `: T8 s& Z6 ^- k 20210126085305756.png
# i7 R3 i- j/ p
: L# a7 }0 k5 c$ O) L————————————————6 X( m4 G4 ~- r- ^/ [$ ?2 x
版权声明:冬麻麻
" w; a. h  F& o* {8 t7 p" F6 o# I' d8 T

, n9 ?% z- @4 I# c
收藏 评论0 发布时间:2023-3-7 15:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版