|
之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻 STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。 打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。 
生成代码的过程就不废话了。 在串口初始化里面调用这个函数来定义串口中断接受长度。 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1); 不要忘记在中断函数里面再次调用。 一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。 - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
) O" J* `: }& k3 Z% R7 G7 h) }. A; O - {! J5 d, x* f* ?: k5 j7 G3 V
- static uint8_t sta = 0;
! _. m8 k# J+ C0 { - if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1/ o3 e2 ^2 N' Y; ~7 r
- {
4 Q( }9 Z) w& M$ h" o. o - // USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];
J$ j" N7 ~) c8 O - // Usart1_len++;- l# C" A, H: c1 e9 Z R0 J
- // if(Usart1_len == 0x04)
5 k: I; K) a" L: ?. P8 Z" I - // {9 h* t! |; {8 o/ t4 _
- HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);8 d+ Q* m0 O; z: X6 U; i: b
- while(1)* W( E. Z( c4 x9 y; _
- {
% M) u, r6 C, A, e! \% S. x - if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É6 B! ~# B S$ p- B+ @3 T
- {1 k. [1 r. ]) p7 Z0 ^
- __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
! x1 @ y2 t0 n2 c$ R; d - HAL_UART_DMAStop(&huart1); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA3 X* x U; b" p/ `" _
- break; , R' b& D& \, S7 |" J
- }3 A7 A6 y& x' g9 X5 U1 X
- // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
2 u Z4 J, x/ J& k! ~9 _) C - }0 M- c# u! a6 p
- switch(sta)
! J' B+ ^4 f+ Y' z* i - {( m: [, l% b* ]2 [: s
- case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;
% s9 d' R* F* k - case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;, {+ L; w7 R5 G8 V$ W
- case 2:mode = 0;sta = 0;break;
6 p6 V$ A8 }2 ^/ q4 r2 T: d. L a | - }
) L3 ]2 T( p" d! _$ V; h+ y! h - HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);
, p" t9 _- p( r; F, i$ Z8 s, d3 c4 r - // } , f" L* O6 ~1 _8 K
- }0 R1 L1 h& m* g% b" E4 M
- if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
3 {* c9 |2 l" \# B( v - {9 t ]* P; f, F& v4 k6 S7 E
- HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);
% `- X6 J/ o) ?2 _% K - while(1)
) k9 K0 b# q! W9 n. O2 h - {
& H! K5 _; c3 Z$ O: A9 }& V7 d - if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É7 [+ q: z; T( h- O
- {
4 c8 E/ ^ J: A+ r/ q; J* M% u: B - __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾! P2 H2 W5 [; C, m' T
- HAL_UART_DMAStop(&huart2); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
: b+ h% \( A# Y# q9 l - break;
# r0 ]% s8 p2 j: X [7 |/ Y1 L; Q - }
9 i# ?3 C) R# d$ y' B - // __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
+ j. u( ~/ p4 T) [" [% d - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý
( n$ e, j+ a# w" Z/ y+ S - while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
\" o& {+ ]# O# k/ C - HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE); ) k; M+ I. H, ^
- }
' j: j# p0 z- m6 |% Q - if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3& u2 g! R6 V+ I, n
- {2 f# m2 ]% D* i* @0 O' h
- HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);9 n# w/ y( ~& [/ K
- while(1): h* p y# w5 R+ ~; E7 F/ `
- {3 F3 w, Y1 j! J; q# E9 J) Y
- if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É, B9 j0 @( W! }9 @2 I
- {! W) e" C4 @; x. b& H% u( U: @
- __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
" Y' N$ T( v: `3 k0 m p8 T - HAL_UART_DMAStop(&huart3); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
4 {! k: Q3 _: Z8 e% b - break; 8 b' |0 \' m5 D3 E: K; L
- }& S7 a5 a# K- Y' S
- // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
# H" g F$ r/ x- U% q$ `+ l# R - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý" E& e5 f$ Y3 m7 {# A$ @
- while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
, P: v9 F, ?& ]. D0 S - HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);
M% ^# G9 O1 x ~$ ~' v - }/ E" p% w( r8 G2 t
- if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4, N. X/ U0 {! M) ^' l% | i$ Q
- {
2 h6 W5 X7 [1 v; w' s- i - HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
/ j* K* U2 J: M% Y# u - while(1)
3 j1 U9 A/ G$ I" m# g) X4 s1 @5 I* Z2 F - {, I) Y! }: C" O2 P R4 X- K
- if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É( ]6 T& A2 d+ G9 `# E% E; N
- {
$ {$ n; E; H% Y( t! | c - __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾1 ?+ q8 B# ^# B7 X2 G
- HAL_UART_DMAStop(&huart4); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
% [8 r. P _. ^2 I, c; {8 g8 D - break;
' W4 Q: m- k1 ^( _$ B) F! C' n8 L) R$ T - }
, }, K6 c2 T, Z0 @ - // __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
3 x- r# m0 `; ] - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý
( a( e( d2 R( s9 e( L5 C8 S; q0 A+ C - while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø. p; X/ g: i) A) |5 d
- HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE); 2 d/ Y3 h/ o6 R; ]- m$ ^- ~
- }
2 W$ ^- C' ]6 M/ P4 z* ]( x - }
Z" l; M+ ]1 e8 W( Y0 ] -
复制代码 这个我是放在中断里实现串口自收自发的。- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
7 s4 \+ i: l) X* d3 y - 2 {2 F( |! Y; Z% E) J' A1 l6 x) p# O
- 3 uint32_t isrflags = READ_REG(huart->Instance->ISR);//?????,???????SR& q: f' E0 K V2 P
- 4 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)( }, y- M& l) W4 `/ \: Z9 K
- 5 {; L7 S; j. w0 _/ I: A1 W
- 6 READ_REG(huart->Instance->RDR);//PE???,????DR
. Z0 u; T7 I1 t* D& e - 7 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???7 W' h# Y- B/ H+ z* m. z; U3 L o2 P
- 8 }; T# e! s* r$ x; n
- 9 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
# X1 {; O% K9 o - 10 {4 p$ k- G% J& ?/ I& k
- 11 READ_REG(huart->Instance->RDR);//FE???,????DR9 i( @" m1 h( C9 v2 s& a/ U! q5 K$ M
- 12 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
/ N; H: z: _. ^7 U4 N' h; J, Z8 o - 13 }
+ }1 e9 [: |5 u3 [0 \4 b" Z - 14
2 Z- c& }' }7 Z: x1 z x# E9 \ - 15 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)' b" K- Q0 H% @
- 16 {0 Y9 u b8 z/ w' a: N& V
- 17 READ_REG(huart->Instance->RDR);//NE???,????DR
3 H: r# a* k6 e; k8 U& Q$ b z( a: n0 n - 18 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);0 Q9 ~3 @& |6 t; i% B- ^
- 19 }
_+ R/ q' c% b- s" ^! D - 20
0 d/ R+ P2 o' W* ]& v- Y - 21 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
; `5 R1 `! q1 ^& @( w6 d/ I2 d - 22 {4 O& ]- m8 R' }
- 23 READ_REG(huart->Instance->RDR);//ORE???,????CR
- H" z# M, M) i# G - 24 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);) f" V/ r! u# L/ C" D6 U" a
- 25 }
% l( U6 x, _1 @' B - 26 }
复制代码 3 C5 ]# N h* d3 z4 E) d
, g4 x0 P' o& Y$ n5 q
0 \- v2 [) p( x3 r- i# Q& S2 B G/ p
|