|
之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻 STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。 打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。 
生成代码的过程就不废话了。 在串口初始化里面调用这个函数来定义串口中断接受长度。 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1); 不要忘记在中断函数里面再次调用。 一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。 - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
( z+ ~* x& o9 x* f$ u - {
* p0 w* V( q( a: q0 w - static uint8_t sta = 0;* d1 E7 _# ]" t- v5 B
- if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1! ?' f+ Q5 C$ ~
- {. D; D/ a5 ^' @9 U1 N- w
- // USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];
# T# r) z5 q; r H: A- A - // Usart1_len++;" f/ u) W( _; M7 c
- // if(Usart1_len == 0x04) 9 z! J9 A) H! t% _) D4 ? f6 Z
- // {+ C0 F% S& R& C) X4 p) h2 N1 f
- HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);
8 n0 w( P4 R& [& b; r" Q) ` - while(1)
2 g" p* P0 q, h6 m: j. t - {( ]/ p2 q7 S9 ]; ]& s( c' M* ]2 \
- if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É, P5 O4 J" @" b
- {( O9 C/ R* \7 s/ G
- __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
9 o) ]$ H1 V1 @5 e - HAL_UART_DMAStop(&huart1); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
/ C6 _- W+ p* l' h+ D5 n# o - break;
6 u, @/ J- a: r: ?. p3 y* K - }
. K' I# C: H# h - // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);' K6 W. Q% q$ p8 Y/ v1 s0 k
- }
4 h! q9 |" ~5 o - switch(sta)8 g0 u6 ]# J0 Z* \
- {7 o( v; X0 ^2 p+ ~' r5 w7 t
- case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;
3 w& M$ ^9 U3 I8 P8 u - case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
% {7 E2 {, X3 y* \7 [4 M - case 2:mode = 0;sta = 0;break;+ X* \1 K! S/ s' c* e
- } ) a5 R s. y1 E0 m7 d F+ c" D$ q
- HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE); ! \" u) [8 q ~8 S6 R1 }
- // } ( \, L- k9 I6 `7 l( J/ @4 ]
- }
9 X: J# ^5 a3 [ - if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
5 m, f# N( \4 d - {0 _* E# d/ B; K8 f
- HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);. k. h. o q- @8 Z* ~% s# w/ R
- while(1)
& V8 p2 Y8 S$ n$ N - {6 Q5 i2 J4 s5 a
- if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
9 N9 t6 |# @" x$ a% M' F - {0 Q6 {' c' z. \, I( g
- __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
4 U' l1 J4 s1 w. x* E8 g - HAL_UART_DMAStop(&huart2); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
: k8 _ p( d. |6 ?2 P# E2 [ - break;
; h' m; J# J/ d8 {/ R - }' R" o2 y! e! ~7 ]
- // __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);; k$ n& L V" h4 Y; `
- } //·¢ËͽÓÊÕµ½µÄÊý¾Ý- |( N0 o! g" w4 C# Z# w* K
- while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø( ]# d6 i4 \: d) l+ q0 o: V
- HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE); + E* K3 m+ t/ _3 F
- }
$ z' K7 N2 W5 W* x; ?' ~ - if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
( Z$ P9 {8 A a. n - {
5 D4 F( N8 Q* `( ^5 f) n6 c - HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);# c, C# Q& U6 U
- while(1)! f! Y- `. Z$ @ ?
- {4 { J. o7 w% b
- if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
2 e& Z% ?- v. O - {
( R, C5 S' e/ h3 V1 I7 j* k- n2 x - __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
( Q2 Y# ~. k5 l# i' Q8 Q) } - HAL_UART_DMAStop(&huart3); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA7 {3 N0 \! q6 z5 O! z6 D
- break; . m, a+ }. X9 l* r5 _' t
- }
3 d7 U9 s5 b- V" u8 ~/ T - // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);* P1 K3 I0 P/ T$ x3 `
- } //·¢ËͽÓÊÕµ½µÄÊý¾Ý4 C* {) e- e3 C$ O
- while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø0 c$ g! |$ i1 S6 R9 n. P1 z1 T z
- HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE); 7 h+ S$ l4 K8 ?0 C5 ~. l3 ?; x9 J
- }3 c& k) ~3 R8 H- i( a+ p
- if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
6 t$ H" d8 `4 X! W. G8 k - {8 t; d/ e8 L9 d K0 H
- HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
7 b4 j3 D8 o4 s) M3 d9 ^7 w8 ~ - while(1)
2 F. K& z1 O1 X$ R - {/ y: I* X* F) O1 i( _% Z9 K
- if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
; ^3 u$ p, _( _ - {0 X+ y6 T* K# w& H. Y z
- __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
! U+ T4 X5 r2 s8 I, f. _' I& q - HAL_UART_DMAStop(&huart4); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
/ o3 H! r3 l( e4 K) W/ y - break;
, F4 ~, k$ Q1 `! e- v - }
/ ^+ l z/ Y! K- f - // __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
1 p6 `6 u/ o4 f3 R/ e% w/ F - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý! |/ y/ Y3 v+ `/ R
- while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
% D; U; J3 o9 b1 { - HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE);
) o- K5 k5 _' d/ A8 p4 l - }5 u0 ~& V0 z. D) z# A& `
- }
( L/ F% h, B$ W% F -
复制代码 这个我是放在中断里实现串口自收自发的。- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)- x: A6 Z [" Y" I- ]5 X- s
- 2 {* S; z# F) ~1 a U) j
- 3 uint32_t isrflags = READ_REG(huart->Instance->ISR);//?????,???????SR
% ]+ R6 R- e, F( P6 m - 4 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)' J$ q7 Q$ q5 v5 o$ L/ W# `8 d
- 5 {: k$ S) m0 G& {# p* @; F6 P/ K
- 6 READ_REG(huart->Instance->RDR);//PE???,????DR( n6 V2 ~9 Q2 a6 ^
- 7 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
2 X7 ^5 `/ u) t0 ]5 J; w3 }7 J - 8 }
# x- d/ \4 ^' O/ j - 9 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET). Y' K, J* M/ h( K3 d. s
- 10 {
! u( }# }# _5 K0 \# W - 11 READ_REG(huart->Instance->RDR);//FE???,????DR
4 G* K+ R1 X9 G5 x5 V. \ - 12 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
% Y$ G9 W+ T' k: f* J - 13 }
- u6 k- ]- f) c2 d - 14 ) W1 Y4 H5 g' {( d' S
- 15 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
3 d. o! e/ g4 B - 16 {6 ~1 o: p* u) @5 K' `: }' R# V+ N0 w
- 17 READ_REG(huart->Instance->RDR);//NE???,????DR
: Z* V' C, L5 t - 18 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
* b( s7 b e; `$ ? - 19 } 6 @2 S* J: A0 ]1 O( N
- 20 0 S$ k0 |/ A6 i' h& `: [% x
- 21 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)& h* O o* v( l2 }- ?: V
- 22 { ]6 S2 l. n9 E$ u7 Z" g. C& F
- 23 READ_REG(huart->Instance->RDR);//ORE???,????CR
; P9 U0 R! ]! ?% ^5 I. n# J0 l - 24 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
% N- |, q" e4 z' {9 w - 25 } 6 _' e" W7 T1 A/ {
- 26 }
复制代码 ' h/ h! k* D5 G. D' g
+ G! O' `0 \6 \/ w
# V: T G# g" N6 {1 E! j) h; Q0 S
% S; b5 B% ?, |6 y! q2 M6 a z
|