|
之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻 STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。 打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。 
生成代码的过程就不废话了。 在串口初始化里面调用这个函数来定义串口中断接受长度。 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1); 不要忘记在中断函数里面再次调用。 一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。 - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)7 ^+ K5 I# B0 J! I' F
- {
: Z3 ?0 Q! ?4 N. }1 y! `0 ^/ C - static uint8_t sta = 0;6 v0 V- t) f- y2 G) I @
- if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1
+ X5 z# v+ g( U9 U8 k0 H - {
0 d6 s( w% B" M: C% ^3 t; M - // USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];* J V1 w! g- |. f1 I$ b7 s
- // Usart1_len++;5 A% c E( u- S! n; k
- // if(Usart1_len == 0x04)
. ^6 n. O$ `7 D/ b - // {; B4 F% i! U: {6 h7 M- {9 v
- HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);
, J5 K7 Z G1 r! ^0 t6 s2 P6 r - while(1), Z2 ^! D4 L2 u! {8 i
- {3 _# ^3 w7 S% J) d2 P* Z6 a& x
- if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É9 T6 P6 D& L+ w; I* X% ~7 l& y
- {8 X5 \- m7 W2 l! f- A7 K
- __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
0 {1 O& N$ {# R" B2 y9 K. e# } - HAL_UART_DMAStop(&huart1); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA/ C- h0 Y5 i4 r' [3 g
- break; 1 d, V" N! L5 R1 X/ C
- }& L8 }4 t, M4 F* }3 G; I
- // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);. Z j& s7 o+ h1 w$ Z" P
- }
3 K, f/ }6 Y2 a9 m5 ?) L - switch(sta)$ j+ j8 l6 }1 H
- {
2 F7 }2 C. B/ }+ F% T) o/ F - case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;3 G* Z8 L% H" M3 ?1 N
- case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
( P4 Z& F8 t- _% A - case 2:mode = 0;sta = 0;break;5 J6 r# a% [+ E3 h' c0 y) ~
- } 3 E6 ~. c& W7 X H
- HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);
* H+ I- a3 ~( v* J& z9 j) u: `1 Y - // } 4 Z) L: R/ b/ m$ Y
- }
( D/ g" y2 s7 _: y6 j5 W - if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú21 T: ^7 k& u# n2 J9 k
- {
8 x# G; N4 q3 a6 B0 @3 p - HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);1 I( d$ E; G2 c) q
- while(1)
6 |2 M8 g, t( D$ Z' ^. B - {
% d# b3 o; Q! V' ` - if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É1 l- W* O/ H S
- {7 ^# j7 ^8 s6 Y' Z* W3 I
- __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾8 k8 l, d! Q# L+ F' I I/ `5 |
- HAL_UART_DMAStop(&huart2); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
8 G: u- i$ l$ y$ i9 ]2 H - break;
( C8 C# {+ ` F: J' J' A - }
) C, R: ?, U0 _6 P: z - // __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
P. r$ l6 k, @& k - } //·¢ËͽÓÊÕµ½µÄÊý¾Ý! @+ r E$ L2 ~2 R8 v% l
- while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
5 K* \ @& g) j+ E - HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE); 3 M5 k$ _ a+ F- h0 n
- }
. }" W J& p: E% G# z; B - if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
' F% n9 ]7 ?2 H* @ - {
6 S# _$ f4 Y" n3 t! _ - HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);5 c3 R! c, s2 D' L, E( N: ~" j0 Y/ ?
- while(1)
( ?6 I6 V: h0 }) n2 w - {
+ S: a1 R2 ]+ W0 b; Z - if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É8 X* h. A" Z2 p6 M$ k
- {- k7 _7 F. j+ d X; J1 Z' l
- __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
9 d& N3 Z9 [# [7 Z - HAL_UART_DMAStop(&huart3); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA" s# U4 z6 m3 p& E s
- break; ; x ~* G; F* y8 y: ]% `4 b) ^
- }
( d P+ L0 S7 W5 Q3 \ - // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);5 t: D/ L9 V' M! u4 H+ j
- } //·¢ËͽÓÊÕµ½µÄÊý¾Ý
6 H; }4 w* \( T: ^! H9 r) W% W! c - while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
% N4 ]% t; C0 w, s. Q - HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE); , n7 }* N* f) f) g
- }
j9 o9 E3 Q. [# r R - if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
$ K( l% j5 o e7 d - {
8 {- z* g8 J( J! r9 X - HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
# x6 v! r3 \% v5 f' u' J - while(1)3 U6 r; u5 r( \2 P" X
- {
- Y; ], g# _* X* E - if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
, u8 P E6 v, j' e8 ]2 a - {9 r7 @( W! u/ K8 F
- __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾8 e2 A$ o7 L; i: `4 A4 h; f7 ?
- HAL_UART_DMAStop(&huart4); //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
/ j( x6 b$ r' y6 [% K' z - break; 1 L/ \4 Z# f+ e0 Q; d& z; ^& n# d. b
- }
( L& h7 R0 G1 A, k$ J: z0 u - // __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);/ j2 i3 l3 S# @1 \+ |- Q( \- H- p( ^9 _
- } //·¢ËͽÓÊÕµ½µÄÊý¾Ý& P$ [# I s( r" D c: u
- while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET); //µÈ´ý·¢ËͽáÊø
$ |0 r& u( a! O' Q2 `% o& D L - HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE); 7 M! I1 ?* e& ~' e( v; {5 s
- }. k, Y, F% }5 x4 v; h
- }
4 u2 x8 w( R# \+ i -
复制代码 这个我是放在中断里实现串口自收自发的。- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)% B% s5 }2 b+ n2 Z( C
- 2 {& i1 u& {$ h% Z L ~& q2 A
- 3 uint32_t isrflags = READ_REG(huart->Instance->ISR);//?????,???????SR# P. k, t, M) Q* {4 G7 H
- 4 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
4 D$ M4 A4 \! G" I- d - 5 {9 ^' s2 n$ Z- s! s2 i
- 6 READ_REG(huart->Instance->RDR);//PE???,????DR9 I* j( `( u, d% c! b* B
- 7 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???- R; p( C7 }$ f6 p
- 8 }
$ B1 g; p& w1 x5 |: ?4 ] - 9 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
& s. x( r: R3 h. Y; ?) q& H$ v - 10 {
7 m+ h# H2 d( C2 j4 I2 b - 11 READ_REG(huart->Instance->RDR);//FE???,????DR
7 \6 n4 P# h% J. ~8 Z' | - 12 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
c7 x3 C5 q( P* ` - 13 }
I C5 I4 I; j1 [$ {9 F - 14
* w7 q8 h' T8 A( c. T - 15 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
; t$ w1 X4 i7 {1 J& l( O' k9 U0 G - 16 {6 p' r0 A& S7 I
- 17 READ_REG(huart->Instance->RDR);//NE???,????DR
5 k1 t. b- c3 n- ? - 18 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);! @- z% G$ U" h) d; Q/ I' @
- 19 } 0 }& W7 `1 C: ^8 ]7 B& s% Z5 x/ [+ D
- 20 , A( S4 j$ |) I! Z4 p
- 21 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET) O) j# O+ d$ I" z
- 22 {0 w/ @" N, {% E* ^/ Z
- 23 READ_REG(huart->Instance->RDR);//ORE???,????CR
# S0 Z1 h( A- K( C$ P0 e1 P! V - 24 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
5 D# c. x: r; G! m8 [: ~ - 25 } 9 ^8 W2 r6 ~4 N+ Y+ H* ^- t& U
- 26 }
复制代码
3 L( \' P8 ?3 D# Y
8 s/ _# [: p3 g
! H6 g, }3 A8 Y+ H$ Z; Z" ^! m' U; G2 x! c- q3 U% g
|