之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻 STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。 打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。 生成代码的过程就不废话了。 在串口初始化里面调用这个函数来定义串口中断接受长度。 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1); 不要忘记在中断函数里面再次调用。 一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。 - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)) p- R6 O; X. c
- {& q2 [$ x. ~9 p1 x
- static uint8_t sta = 0;: c: E5 O4 Z' A2 H0 o
- if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1& d& w5 F- a3 `& Q4 b% c% u1 R
- {7 s# x: r& q7 x7 v
- // USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];# o/ Y! b. b9 X$ k: O+ ]9 [; v. c
- // Usart1_len++;) m j r( c( _# i; R/ j
- // if(Usart1_len == 0x04) % t$ W) L+ a& |0 g' `" O6 C3 Y5 u1 \
- // {/ N! C* U+ ~% U; T: F% S1 D
- HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);. G- U% G# P1 \
- while(1)8 }3 y' a4 J3 m6 L( I. J& Q8 q
- {
. k) [% X2 \* Z9 t/ M - if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
! b9 f$ ^/ q) {* N. y6 D - {7 x6 i* p; S0 B( U0 T
- __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾; X6 |; E! N+ Y8 E3 E# y" S
- HAL_UART_DMAStop(&huart1); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA& j" H* e/ m4 V% `/ g
- break; & D+ e$ M/ D6 _' B# w* T* u* r
- }
}: Z. {8 E; l% x8 L) O - // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);! ?* k# ?! Z+ b; `
- }
4 |- f- x# a: G; D- b9 j" }3 k - switch(sta)
, T; F$ P7 H# A* T - {
; K; u, F6 } N! _+ j+ n5 O - case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;+ x' F; i( m% l* ?9 E6 W. x" ?) ^
- case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
5 x( r# B; J$ K, L1 C9 W7 p - case 2:mode = 0;sta = 0;break;
x# s H X, t) i* {+ D1 ] - } 9 i# O$ W; T' {) T
- HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE); + G' B7 m! D+ ]) |, h
- // }
9 L& t. |, `" \) C8 t: R0 V1 J" {, E - }
0 v1 n2 l9 d$ L - if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
- l0 @' A) U8 z1 T* u# f0 G. K - {
1 ?; ~0 X( R& n0 P2 ` - HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);$ n. O- K! h+ _3 Z w2 W
- while(1)
4 I2 z+ o( a$ f( X. E - {+ u$ ~, C2 ?% X8 @$ W
- if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
$ X) M0 ?& c8 Z. ]# D - {
, b" Z3 f" |- ?5 \: {7 e* Y - __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
/ L# l% t+ E; g* f) @) G5 d7 p( K: z - HAL_UART_DMAStop(&huart2); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
. {5 h( h. ] J9 } - break;
9 P. u3 m/ k) S; t - }
( J: s$ T2 k2 i" `" F+ ^ - // __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
. Z3 C2 ?3 p7 Y2 j - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý6 n$ x9 B7 L0 v: Q4 ?/ p
- while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
) O$ U( l6 P$ d6 K: }( ] - HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);
. |7 I6 Z! Z+ d( x, }' H: G - }9 ?; e5 e$ f7 o/ M# \' z( U1 g
- if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
( f* r1 T& O7 z - {
2 B+ O; W; l, j2 v - HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);
% f5 n6 W1 Z' f& v: F6 f# B& U - while(1)
4 K9 F. S0 F5 W; G- L$ H- { - {
+ q4 ~) ?( I# H/ S - if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É! L+ Q1 P% i2 F7 P6 S
- {# S" I: t1 J1 h& S+ s r# `& r$ N c
- __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾1 S! `$ U& P3 L
- HAL_UART_DMAStop(&huart3); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
B& r/ {! x- f* y7 u2 f - break; 6 `4 |6 k2 u* ~: U& N
- }
' g4 }5 u% n7 j, \' H - // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);/ q, i) y/ j1 k5 T8 s- f
- } //·¢ËͽÓÊÕµ½µÄÊý¾Ý- X2 K, c: f1 }/ u
- while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø) }$ ?$ b0 H% J+ j5 I$ E! S; s9 a* N
- HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE); 7 U B5 f) _ `* |. P# e% ~) x
- }/ |+ }: q) \7 M' S/ \1 l
- if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
; f, b* q$ O3 B- J8 `1 o y - {: Q2 d* k- B7 a7 V8 n, H
- HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);5 c2 p2 F4 \7 B
- while(1)3 r9 t1 A# X1 f7 x7 `. q& X% {3 T
- {
! T2 p+ i6 z5 c5 l) v% Z* u - if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
: U% v. s) z0 {, N& n - {
7 x; j* c8 _; n; O A ~( A3 [+ O - __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
P5 ]' ^. B7 E7 o - HAL_UART_DMAStop(&huart4); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA& p* N. ~" }$ P0 o1 u
- break; 2 z& G. Q% m/ d6 Z T
- }, p t+ O. A! Z7 p; t& P o
- // __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);5 d7 ~4 Z/ _* | s
- } //·¢ËͽÓÊÕµ½µÄÊý¾Ý9 c3 q. Y" U/ }) `: ]# }5 `9 j9 O
- while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
. V7 N1 ^+ v0 j, s( D - HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE); + g! m% q. c% L$ D3 U
- }
" L& }$ _, J) n. V6 c; N - }$ G* n) w" n1 c) a
-
复制代码 这个我是放在中断里实现串口自收自发的。- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)/ \1 O$ _) T! r/ l% u! \' I. o! r# u
- 2 {& G$ ~0 l- t* H3 z. [ f
- 3 uint32_t isrflags = READ_REG(huart->Instance->ISR);//?????,???????SR
9 v* n$ V. Q H" t - 4 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)5 X. K0 ]7 e X) b. F3 C% `
- 5 {2 S# ^2 N$ p2 A3 `1 w9 v" T y+ R
- 6 READ_REG(huart->Instance->RDR);//PE???,????DR. y# u* y; u( D
- 7 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
7 b9 E, h1 F; m - 8 }% W# C0 O, N' p( Q8 ?- t2 N
- 9 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
& f. Z2 q* Y, K7 V - 10 {
! m1 ^- G( I. R - 11 READ_REG(huart->Instance->RDR);//FE???,????DR
+ s" c8 g8 l" W! k - 12 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
5 m3 P# ~8 _- e2 o- G* f. ?. ?- F - 13 }
) S' c; }. w6 U. G4 ?7 E - 14
( ?1 k: D6 e$ V& Q7 X F - 15 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
K5 A N* ^' t, ~ - 16 {
8 D$ l F0 L9 }+ p5 X' ]* ^! ~ - 17 READ_REG(huart->Instance->RDR);//NE???,????DR
! w+ K; J3 f# b - 18 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);! L/ h$ X+ ^6 h8 L+ E
- 19 } , O; ]9 B* T. h# g) @. d
- 20 4 v* h3 e. S9 R) M4 e# ~' K
- 21 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)& Y+ _+ O, f; p
- 22 {& L3 M0 T5 M4 I @
- 23 READ_REG(huart->Instance->RDR);//ORE???,????CR
' R. j$ V9 D& Y* }/ A2 X4 L - 24 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);5 h7 S3 I; _3 ^6 I! Y) B+ y0 O
- 25 }
; z1 n; N8 p0 S( Z$ `4 m - 26 }
复制代码 6 v& F( F8 j& D5 }6 u
% E+ X) M8 d1 p/ p, J4 p; x! \
3 p4 {" G5 S, b k7 Z9 w6 O9 a: l
. d' R" T) Y! j; \ y# R |