|
之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻 STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。 打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。 
生成代码的过程就不废话了。 在串口初始化里面调用这个函数来定义串口中断接受长度。 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1); 不要忘记在中断函数里面再次调用。 一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。 - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)7 q6 d5 K6 t! d2 z
- {( C# l& u4 w+ l6 t1 M# N
- static uint8_t sta = 0;
2 _; Z, N! @1 Y% {, j8 E% W/ Z - if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1/ Z, y6 b, b0 ?0 p7 _8 j* J
- {1 y4 K* y5 w. I, j F; o6 r
- // USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];$ ~, q+ @; ~# Z2 n
- // Usart1_len++;, Y$ X7 S: i+ H) U" L6 v; T" x
- // if(Usart1_len == 0x04) . q% I( k3 a5 F: _3 Y
- // {5 M5 {; O; R3 h
- HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);
1 d2 g: A! Y0 P+ L' P: C' ]5 W1 _ - while(1)$ U# [/ s/ U6 _5 ^# V
- {
) {2 ~+ m% I; L: |2 A - if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
( a+ Y8 C$ A) d2 ]3 l1 A8 | - {4 Q6 ~4 B2 h) n# S
- __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾% X* |6 J. c2 ^$ t; K
- HAL_UART_DMAStop(&huart1); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
8 W, C7 H; N; k- F. C0 M5 ~ - break; : S# M6 C3 w- S" y
- }- t) p+ r0 @3 [+ D6 U
- // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
9 E4 _9 G$ L& @" E - }
8 }7 Y! i G# R& l- l - switch(sta)9 W0 r: `$ `8 }* R8 \! {( m
- {
1 [( E7 ~1 m; w) Y5 z; @ - case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;
8 P& h8 A u) I: C) A& Z+ P- f - case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
) S7 F$ X* S8 ^/ _& X - case 2:mode = 0;sta = 0;break;
& l5 ^% V6 }6 ? h8 Z# U! U - } ' X+ _8 j5 A: C5 \
- HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);
7 h/ p7 U3 j9 d2 M" J - // } + o- t3 R% a/ L, f" Q: |% k
- }; e6 P* V8 y: X+ V: i1 j
- if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú24 o2 T q% N7 S0 n0 R% l
- {- L% G; M' ^* Q: ^8 b4 O6 j" S
- HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);9 z( t9 C' D; @( Q: d
- while(1)
/ p- ~# w2 D; d - {
9 `0 ]8 M4 p) q% M- r2 C$ h- A - if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
" U4 f9 N, l9 b - {
3 E6 l! |8 j: ?) g7 m3 X - __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾- G- m6 U0 I5 f' q8 u9 h
- HAL_UART_DMAStop(&huart2); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
7 @. q( ]% a2 v3 ?3 k; z - break; - I& N) W- W0 X9 }+ `5 }
- }
s$ G% V3 x" F) O9 t - // __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);, P3 b* p! w5 F. _3 k
- } //·¢ËͽÓÊÕµ½µÄÊý¾Ý& u& K( q1 Y) k( T
- while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø6 g8 N' w) a# f
- HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);
4 \ Y. T3 u `+ s; N$ O - }! a @) \7 x- w$ P1 ?4 P& H: [' |
- if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú33 f _) \2 j* ]/ s3 S! X
- {4 s% s; n5 O# q- o' A
- HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);
. c: Q) B6 Z- _# C" J, L: { - while(1)
1 I, l& g9 @/ f% S+ p( M - {
' ] n# y' ~; N! [5 t+ g) V - if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
' n8 Y# j% d( S; I$ a" \ - {( c1 a; e' s. u" H, p& e1 }/ }
- __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
- _. B) C; r/ k' m! J# R. { - HAL_UART_DMAStop(&huart3); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
' b. e/ [& c, I8 C) | - break; $ I# L2 V3 J3 u) A c, v Y
- }) l1 \) a) [, A, |" D
- // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
& M' N+ g! q( w \* l - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý5 {( z7 D/ p! P- d$ P1 c4 H
- while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø# d( _( p6 _* w0 A6 K
- HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);
( H: G3 j3 w2 d+ M5 h! X! _ - }- N2 J; d5 Z2 A/ n! p) }1 m
- if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
: E! t3 `4 }. l, [ - {0 a0 l$ M4 B! T* ~, R. S0 q6 r
- HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
5 _0 ]" s+ A2 e4 Q - while(1) r, r% P5 U; @ t, f) ?
- { W- d" F9 O6 f. b
- if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É8 z2 u+ h! B& d K) H& I1 o& N
- {
& h" n( I' |9 d2 q0 i, _' C7 ?5 G - __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
7 \7 e) ~9 h. a' w - HAL_UART_DMAStop(&huart4); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
3 ?8 J% ]0 d0 l, [$ L$ N! d* L - break; 3 ^* }, }! ]$ }6 \+ \! \) }( n
- }
/ O0 S- }. F! F# q, t/ X! m - // __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
# b; A& p5 F$ S* E8 k5 O - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý( D# k3 l% h- l8 Y& `1 Y
- while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
6 L1 ^5 @ F: ] K. e - HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE); 9 w; E! j8 g! v8 \' I/ L
- }
# d2 x! t3 u+ g1 k7 I - }* K; |. g* Q R; J. @( t/ E) e4 B( [" p
-
复制代码 这个我是放在中断里实现串口自收自发的。- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
( r* S& Y( ~3 {: z - 2 {$ y' Q! K" u e
- 3 uint32_t isrflags = READ_REG(huart->Instance->ISR);//?????,???????SR0 l( }# v7 j$ E' e8 C
- 4 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET) J" V7 `. K9 w0 F j
- 5 {
$ O+ }7 f/ i; O6 b8 u' d& C - 6 READ_REG(huart->Instance->RDR);//PE???,????DR; ]3 u- C& T% o
- 7 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
h9 j4 g" n; c: \$ Y; ~& g - 8 }2 p! i* ~4 Z" K# m, ~( N3 _
- 9 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
* x( a" o9 B7 M3 ~+ t* I# r - 10 {
/ ~6 H2 D/ u8 [# i; k+ p1 c" k0 I - 11 READ_REG(huart->Instance->RDR);//FE???,????DR# y5 d, r; m4 p1 f
- 12 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
6 I9 F0 v. r" t: \5 Z$ h: C! s - 13 }1 k" ?! n3 J' N: w" f) V/ P
- 14 0 l+ B3 h5 U% N! z% s
- 15 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
; Q9 O/ `# k' K _6 a - 16 {# v2 j* H7 F9 ^/ Q2 A4 h* x
- 17 READ_REG(huart->Instance->RDR);//NE???,????DR6 F3 \7 Z2 f' X/ `
- 18 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
% `. y; U, N$ X2 n! ` - 19 }
7 E" Y3 I- ^ ~8 j3 P# u1 E$ Q4 `# X - 20
8 p1 }! f' P; N, g/ f7 P - 21 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET): a* Q5 o+ u+ o/ ?& [" ~
- 22 {
. k! u& a+ F! { - 23 READ_REG(huart->Instance->RDR);//ORE???,????CR5 @5 _/ i& B3 u+ b& p: C8 n
- 24 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
4 R/ j; X7 J5 A% f - 25 }
" e7 L% S- U& U- p% _ - 26 }
复制代码 0 N4 ~ K. w+ a+ R6 B
# J* {1 W$ E& e$ z
# y+ U* v" ~! n$ c+ f8 m( q0 b* I0 _0 H
% x* [' t, _( a2 ~ |