之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻 STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。 打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。 
生成代码的过程就不废话了。 在串口初始化里面调用这个函数来定义串口中断接受长度。 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1); 不要忘记在中断函数里面再次调用。 一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。 - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart). T0 O4 O. [! t' E+ v) \; B8 _/ _9 z
- {
" f! P |6 G# F* S - static uint8_t sta = 0;9 A' m$ H3 M, W% [
- if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1: o( e: N ^6 ^: [2 b, O6 K
- {9 V# T5 ^$ b5 A; M3 i
- // USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];
: r) v4 ^) m7 V/ ] - // Usart1_len++;: Y6 w% H; A( X4 ]
- // if(Usart1_len == 0x04)
7 y \% I& O6 C& E' P1 h6 y - // {
) s( e) C$ A6 J, n - HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);. k* q) U' {! H% R
- while(1)
) }9 x/ X5 H8 ` - {
) ~4 C; t- |6 B* p" z1 i" @# u - if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É9 c& P2 G+ J( F" G. ?! g6 r7 u
- {& y$ ~% W# N( P- @- I: w5 u
- __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾. G+ P* O0 a5 X3 y
- HAL_UART_DMAStop(&huart1); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA8 v# N" h# R$ o! z3 Q$ d
- break; % t) z) \0 u0 A( Z8 k0 A
- }
6 ~0 ]8 _% b& O, `& V - // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
) o3 @7 w5 Y K: ^; X) ^ - }
2 @, X! D3 q4 j2 s0 l - switch(sta); z- P8 T3 m: N7 N! p
- {
' b& `; V$ o4 M - case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;& d! z. y X: h% g5 D6 z
- case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
D% C0 U" N7 B1 ? - case 2:mode = 0;sta = 0;break;$ }2 r: b4 M- ~ ~8 B
- }
% x& r$ o- |$ _7 G$ L0 w - HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE); / ~+ w' g% k0 e5 L, f! U
- // } ' [2 `# }: T% F0 Z
- }
6 e Z- ]# ?' s$ p* E - if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú28 ?( e3 E+ y4 ~5 n, L0 g* S
- {2 ?6 u- x. `8 B9 ^( h3 Z3 v/ a
- HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);
% o3 j8 @& Y! A( ?1 x$ J; ^* h - while(1)4 S# q4 n% C5 u: R# g% f3 z, b
- {
, @# H" y6 ^$ P - if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É* I4 d) u1 V a6 S
- {
" t S# C% f( Z1 f4 K3 G, ?" u - __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
- e' |" g& ?5 ~' {( H+ X - HAL_UART_DMAStop(&huart2); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA( @' I, ]$ A5 ?
- break; 5 [) B9 r% v T& P
- }
' Z# S4 Q$ @3 |; v; ? - // __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
5 l" N' B+ l9 q% b$ ] N9 X - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý3 _: i. a! K4 w& ^( f5 J
- while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
8 W; {" P! {. i& K - HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE); ' w6 I/ x+ e9 b$ S" e3 X
- }
, _+ d5 |9 p. J# p1 q9 \; U% [+ w - if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
2 ^1 Q k1 k" F - {" {( p5 L0 P+ c1 V" ~' }/ `
- HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);
2 d6 M1 f# T3 k - while(1)
# m8 S h7 d2 _* O9 b - {
& |4 z, {) M7 O6 T - if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
/ m6 x$ p, a! o, O - {4 P5 P& N$ P7 G3 U
- __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
* A" H% K8 C( z( O - HAL_UART_DMAStop(&huart3); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA- I1 a- [' B5 z9 H8 P3 S' q
- break; ' P- ~8 m. B9 ~2 L' C
- }0 ^9 e1 G; N, a+ m, F
- // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx); J$ T# {9 l1 H9 u! m
- } //·¢ËͽÓÊÕµ½µÄÊý¾Ý
2 e& h! e/ q* A4 `0 P - while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø& P! }% v# g0 @
- HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);
2 u' J3 }0 O8 h* u+ F - }
! _8 i) z% D# Y( |: b - if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
- x/ N$ }7 b, p6 V7 Z6 f: L - {8 j: |+ h+ H4 q* u: N4 Z
- HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);& X% C# B, p! ?: Z; P2 C- p
- while(1)
$ P$ |( `8 Y; h6 | - {5 N# g: g. h) d- e" o. F$ c0 n
- if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É! |2 F% |& T4 }+ I; k& C3 ~% u0 l5 N
- {
?( n. G9 ?* Q5 D6 Q1 A4 j8 Q - __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾! w' V D& _/ U
- HAL_UART_DMAStop(&huart4); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA5 G7 ~5 l% m* Q- |% D2 O0 K3 |5 h/ L
- break;
) X! n1 H2 R# n1 h; ] - }
) l- o0 P( I- k2 h. [ - // __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
8 Z9 ]2 X- ^- d' X) ~ - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý& g# I) s1 A8 ^; H' Y* @( B% K
- while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
! o# F2 \' u, y/ ^% J4 Y9 k - HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE); 6 H m/ Z. J ^4 E5 i0 e
- }0 i7 a4 p( B* A+ p# \) M1 X
- }' H7 X6 D1 A7 w2 M$ c
-
复制代码 这个我是放在中断里实现串口自收自发的。- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
5 @0 ~1 B! ~0 z S - 2 {: i# W/ A* c. N4 W
- 3 uint32_t isrflags = READ_REG(huart->Instance->ISR);//?????,???????SR
. i* y' h( k4 i1 ^2 Z! g - 4 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
( o) R2 j: W7 {5 G2 L - 5 {6 n/ J1 j) P; l/ ^! |$ x" d
- 6 READ_REG(huart->Instance->RDR);//PE???,????DR
, t7 S& t2 g" k& U6 i - 7 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
% B3 e$ U" |( z1 E* v- C+ t - 8 }$ B$ `3 s3 L" X1 q# g" p
- 9 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
# ?7 C) ], p; ^5 f' }4 ~ - 10 {
' s/ H+ u3 @1 w+ s - 11 READ_REG(huart->Instance->RDR);//FE???,????DR
3 U8 Z2 l* |" j9 j- T; S - 12 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);% X' o# ]: v( e) t
- 13 }
0 x0 C/ P7 e- D - 14
: F, _8 i5 O3 Y7 O9 f/ p P7 J - 15 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
1 A: n9 p/ j8 Z" E/ ~8 D - 16 {
! P: Z% `+ R, z7 ]- l - 17 READ_REG(huart->Instance->RDR);//NE???,????DR o! Y: q6 M" @; b
- 18 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
& I4 `0 M# e9 L0 M' N. ?9 @+ v - 19 }
d9 i* z$ j+ I - 20
) t5 b4 A, p F7 Z# \* m - 21 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
" T: D+ o0 O* B% \# J: t- ]* i: z - 22 {
) P. X8 ^% q2 K% } - 23 READ_REG(huart->Instance->RDR);//ORE???,????CR7 W3 [" ?: P! A: q( l, x
- 24 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
: h$ X6 X U! d& R1 Z6 I* B - 25 } # o4 _7 r; \! w) c
- 26 }
复制代码
5 W* W0 Y; J) V% x- }% r1 }8 s' g6 M- Y$ ^" h
4 j4 K) {% y g5 N
8 Q9 v' E" b, |. g( V |