用STM32F030做串口通讯,发送端经常未知长度,后不能再次接收研究了好久,參考网上有DMA接收但是超过最大值也会出错需重置DMA。 UART DMA https://www.stmcu.org.cn/module/forum/thread-620624-1-1.html : v) h1 L$ V& \- T
因 STM32F030F4P6 FLASH 太小用DMA会多增加500字节。
$ S9 m1 ~0 D9 ^' t* d: \- s5 C* C1 C% `: f, {& _
1.在usart.c /* USER CODE BEGIN 1 */处增加代码方便后续cube配置不会被清除。) J( b5 ~) n n" t
- /* USER CODE BEGIN 1 */
5 c7 m5 l2 ?% ?( C/ Y - void UsartReceive_IDLE(UART_HandleTypeDef *huart)
- v! L% [$ \( x$ M) [1 T - { 5 g: U$ t4 g3 |8 _3 Z. k* B& L4 ]% K
- uint32_t isrflags = READ_REG(huart->Instance->ISR);
3 x! \0 v. h: m0 H7 u - uint32_t cr1its = READ_REG(huart->Instance->CR1);. f0 g: i- K# G8 F; J9 Z
9 N9 P4 E6 T4 P" x5 x0 F0 o% x5 Z- /* UART Idle interrupt occurred --------------------------------------------*/. \) h4 h" l, |8 S3 \! v5 }
- if (((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))' `: C) @ o! y9 F, S" m9 s3 H1 Q
- {
) E* g; p; A1 P/ k3 }! W - __HAL_UART_CLEAR_IDLEFLAG(huart);
2 l) N9 G4 g6 J1 C2 F - __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
5 E- d9 j) }7 K - HAL_UART_RxIdleCallback(huart);
* `' E# a/ j; e7 ]( I - return;& q* E; g8 _+ R7 }
- }
- o! c E& G" Y9 ~1 q) g! J, v - }
* G( y2 @) Q7 A; V8 k - /**
, A' I: |. Q4 j - * @brief Rx Idle callbacks.& Y/ t u) j1 [, Y" y5 w- l% W
- * @param huart: Pointer to a UART_HandleTypeDef structure that contains7 g* V2 U( V' S( K
- * the configuration information for the specified UART module.# |/ A1 _5 |1 B( s* v" I' x4 `
- * @retval None
) w: n9 h8 ]$ _1 W! z - */
$ O( C3 M. R! P: J' G - __weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
2 v8 q# @* u# I5 y# G - {
' k+ t; [7 \* |% o ~ - /* Prevent unused argument(s) compilation warning */: z$ V4 `: H; {7 V' v- |
- UNUSED(huart);/ s! p) e* \2 o3 [" [" n
- /* NOTE: This function should not be modified, when the callback is needed,( `8 t J8 ^9 @
- the HAL_UART_RxIdleCallback can be implemented in the user file. j, S+ ?! m. V
- */6 G$ Q4 f4 q) S8 W* l
- }
# P2 W0 \; P* b+ a+ t7 j - /* USER CODE END 1 */
复制代码 2.在usart.h /* USER CODE BEGIN Prototypes */ 新增4 l3 A( w# q. p. Z8 ]. D& Y& a
- /* USER CODE BEGIN Prototypes */
& ]; l3 L1 U4 Q% Q; t6 o - void UsartReceive_IDLE(UART_HandleTypeDef *huart);
0 d4 q0 h4 Z- c9 W. \ - void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
3 I- y# M. S9 `! S - /* USER CODE END Prototypes */
复制代码 3.在stm32f0xx_it.c /* USER CODE BEGIN 0 */ 新增: q9 H$ k2 b+ D5 n( S
- /* USER CODE BEGIN 0 */; M: b; ]5 a% u6 O
- #include "usart.h"
$ K" }8 w7 `/ L7 }* q5 o. Y - /* USER CODE END 0 */
复制代码 4.在stm32f0xx_it.c void USART1_IRQHandler(void) 新增7 ?$ t4 Q8 ?" m8 b' {+ R
- void USART1_IRQHandler(void): |) C/ x& b9 k
- {
" r9 |3 ^- K" ^ - /* USER CODE BEGIN USART1_IRQn 0 */ n" r7 N5 j r# T c
- UsartReceive_IDLE(&huart1); //新增
@( T9 L$ Y+ r* ]6 q - /* USER CODE END USART1_IRQn 0 */6 g, u: `4 ?, T( H
- HAL_UART_IRQHandler(&huart1);8 h& f/ U' I/ P2 I
- /* USER CODE BEGIN USART1_IRQn 1 */5 y* f- n) x8 v$ ]' z
1 T" e( W% @ k- y& U+ ^/ [- /* USER CODE END USART1_IRQn 1 */0 T0 K: d0 x3 i( m( L4 K
- }
复制代码 5.1在main.c /* USER CODE BEGIN Includes */ 新增: {5 W' u6 h4 O- B
- /* USER CODE BEGIN Includes */
$ [) c) S/ U) [% k+ a - #include "string.h"0 u. v9 z! Y9 N( o
- /* USER CODE END Includes */
复制代码 5.2在main.c /* USER CODE BEGIN PV */ 新增
9 p3 Y* j$ u5 B9 X- /* USER CODE BEGIN PV */* R* O0 ^+ \, K( v# p% x
- /* Private variables ---------------------------------------------------------*/
- Q& Q& |* Z/ p8 r2 u) d+ e - #define RECEIVELEN 16! I1 h! |0 l; L9 S& X% u
- u8 uart1_Rx_Temp; //接收缓冲
" e8 }, }" x4 C3 X- J& K+ a/ [! n - u8 uart1_RxBuff[RECEIVELEN]; //接收缓冲/ C# N a# f3 A7 N; o7 ]
- u16 uart1_Rx_Count; //接收长度3 W3 x9 b* \: Q+ A& i
- /* USER CODE END PV */
复制代码 5.3在main.c /* USER CODE BEGIN 2 */ //新增. k5 S! I Y! ]. ?' }7 g7 J- D1 ~
- /* USER CODE BEGIN 2 */
- i* ^; G7 \: P: [2 W7 v" ~ - HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_Rx_Temp, 1);) S1 g6 v8 @0 I
- /* USER CODE END 2 */
复制代码 5.4在main.c /* USER CODE BEGIN 4 */ 新增6 i( ~- d- x. S
- /* USER CODE BEGIN 4 */2 c7 R) W! l) R8 N: ~
- //UART1' \5 t9 ~# {, y2 ]
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart), O Q, o4 t% E5 r+ O. I; A
- {
6 Y3 M# a b, ^, b) F - if (huart->Instance == USART1) * B# \% y% G. M2 O6 a
- {+ u8 o$ U* n" H Q7 G$ x) h$ c. N
- uart1_RxBuff[uart1_Rx_Count] = uart1_Rx_Temp;2 f a! `7 i# \$ i. ^) q
- HAL_UART_Receive_IT(huart, (uint8_t *)&uart1_Rx_Temp, 1);
- _/ a; z+ {& S, h - if (++uart1_Rx_Count >= RECEIVELEN)
+ X% q, r3 p0 z' `: W- k - {
- w! N* l1 [3 Y% i/ ` - uart1_Rx_Count--;
6 C: f3 [6 i; `- z! m/ a$ Y6 y - }$ X/ [# y' u" c2 s& ]0 ]% m, {- D! _
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);
^" G) k/ Q. e! U3 Y- f, J0 S - __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);1 f+ Q) X" ~7 r& t+ v9 R z# q, y
- }+ S" E; B- n% ^" {
- }
% U) B; i0 \) D9 { - void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
: d7 p2 C4 ~7 ?: @. R/ x* A - {
- S, N5 i8 F+ k0 ` - if (huart->Instance == USART1) * d) N) U" A: h M; H1 [3 a
- {
- g* y3 B8 D0 C. _- X - __HAL_UART_CLEAR_IDLEFLAG(huart);3 t" L5 F- m. o% @3 w, e! H
- __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);* E& C: e# c. J1 U5 x$ Z1 F
1 e! z: x5 Y3 C W% e" `' i1 K5 u$ Y$ \- HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, RECEIVELEN,0xFFFF);2 ?6 Q7 F) a& K* G4 m2 x
- memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff)); //清空数组8 r8 _ v3 f6 a8 ?5 ~
- uart1_Rx_Count = 0;
/ d8 M/ K7 ]" u0 h6 q1 _ - } v/ K, V0 _5 e D0 o* C. z
- }6 Y( M; w9 |' c9 d9 t" O
- /* USER CODE END 4 */
复制代码 3 w' v: r% A" C; k
* h' Y8 @' G. j4 H
參考 https://www.stmcu.org.cn/module/forum/thread-620532-1-1.html?or59 s; {) D$ U7 Z$ B- y
* Q- t- O% k! h) H! Y! ?. p$ y& d1 ~# I. @1 A- {" V
) S- {1 x# n2 \$ S+ X6 g6 H v- `9 M& z( {1 u* M8 k
* A D- h! r. D% ?1 u, Y- j$ J3 @* h: V# |
[7 m" { n0 g& t# s0 I
/ Q- ~/ R/ q0 D! R' }4 j4 D' N. Z4 J# a9 d5 M8 a; B
# X" d. x9 x; \ W& p2 {! m1 z8 ?! R, i6 w( _* X$ B& D. i# H6 w" k" U( N* E
+ p$ L5 l% z# |. y2 P
% N. K, E7 p( C# A |