用STM32F030做串口通讯,发送端经常未知长度,后不能再次接收研究了好久,參考网上有DMA接收但是超过最大值也会出错需重置DMA。 UART DMA https://www.stmcu.org.cn/module/forum/thread-620624-1-1.html
+ p3 h2 B3 D# h; r 因 STM32F030F4P6 FLASH 太小用DMA会多增加500字节。
) L! k/ ^0 J) ? j# F) z4 X! ^2 Y* c; Q. }8 T
1.在usart.c /* USER CODE BEGIN 1 */处增加代码方便后续cube配置不会被清除。2 T1 W# ^ `- q9 ^7 M! ~
- /* USER CODE BEGIN 1 */8 J( z- \9 z2 f' l1 O% t
- void UsartReceive_IDLE(UART_HandleTypeDef *huart)
0 X) l$ ? q6 b - { ' M# P5 o. Z0 p' X
- uint32_t isrflags = READ_REG(huart->Instance->ISR);2 s" _- q2 O* H# R
- uint32_t cr1its = READ_REG(huart->Instance->CR1);
2 S, M+ w/ Z* H5 G+ x3 | - 7 B$ F; Y$ O$ M; C( t
- /* UART Idle interrupt occurred --------------------------------------------*/
! j& a X7 j" Z+ p/ G9 t - if (((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
7 H1 b1 f, Y( R - {* ^ D& P: z7 }' d
- __HAL_UART_CLEAR_IDLEFLAG(huart);
5 \/ @! g- ]3 E- n# R7 G! k& Z - __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
& @' L8 |' c# P& q* L2 P: S4 G - HAL_UART_RxIdleCallback(huart);6 l1 m' N j+ S8 K# f
- return;; ~+ y j# `/ y1 ?; h0 o
- }; J1 x8 a% u) x& L5 M
- }4 q4 t0 ]/ [$ S
- /**
& T4 D1 E) E# t5 H - * @brief Rx Idle callbacks.
7 T$ [5 X/ j. t& b2 a# J' K - * @param huart: Pointer to a UART_HandleTypeDef structure that contains0 w: c6 ?3 I: ?1 z* p5 R7 R
- * the configuration information for the specified UART module.5 Z& A; I" W! A7 |
- * @retval None/ x% ] \* ]" X. y
- */
$ f9 Q7 l8 g$ a0 R8 W$ m - __weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
! l1 I5 w- a6 ^# b7 M1 ] - {6 e/ H' f: m3 s0 U' d$ o8 m
- /* Prevent unused argument(s) compilation warning */; Z& \3 v% l. a O; N0 B( Z% e1 E, e
- UNUSED(huart);
) f H) p8 C; D v4 B" }0 v - /* NOTE: This function should not be modified, when the callback is needed,
6 G8 l" b$ M# M3 }" ?" X - the HAL_UART_RxIdleCallback can be implemented in the user file
- N+ I, s6 D( t0 j4 @; H - */+ ^$ L1 b. o; W
- }! v( m# L% J( @, V0 e
- /* USER CODE END 1 */
复制代码 2.在usart.h /* USER CODE BEGIN Prototypes */ 新增
9 T% r/ z8 \) s+ Y* d1 }9 _- /* USER CODE BEGIN Prototypes */
5 o0 @- y# z/ D% a - void UsartReceive_IDLE(UART_HandleTypeDef *huart);
0 Y" O3 M! Y& y2 l( q/ M/ w - void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
# ~2 p* y4 `* W) X, M - /* USER CODE END Prototypes */
复制代码 3.在stm32f0xx_it.c /* USER CODE BEGIN 0 */ 新增) N* l+ O5 H, p8 n& Q. Q% o9 \
- /* USER CODE BEGIN 0 */
1 A% z m1 q: {# G& M' [ - #include "usart.h"
+ w, p7 L2 {$ y" c, W - /* USER CODE END 0 */
复制代码 4.在stm32f0xx_it.c void USART1_IRQHandler(void) 新增
9 h+ p) J! Z" T6 S- void USART1_IRQHandler(void)
! X. N" H6 L6 A% D0 f - {
2 v" `: S @4 {. Q# H) @ - /* USER CODE BEGIN USART1_IRQn 0 */
* D/ S1 N" z5 V" g - UsartReceive_IDLE(&huart1); //新增8 U% L& S# X, t2 ?4 S; I$ @
- /* USER CODE END USART1_IRQn 0 */0 @/ S6 B; ^; |4 M, Y0 s( @
- HAL_UART_IRQHandler(&huart1);
8 P( C2 s8 ~5 y! ^- P' z- t1 i0 F - /* USER CODE BEGIN USART1_IRQn 1 */
8 h! h) ^' w( b: L* x$ l% W
/ u; V F7 m* m+ _; J- /* USER CODE END USART1_IRQn 1 */8 U& Z8 H* _, l* e, w
- }
复制代码 5.1在main.c /* USER CODE BEGIN Includes */ 新增
4 M! b, v1 f# A: O- /* USER CODE BEGIN Includes */: E4 E# W0 J& |. `* b5 K. [
- #include "string.h"
: A! ^; F3 b3 {7 j$ B& D- a- @ - /* USER CODE END Includes */
复制代码 5.2在main.c /* USER CODE BEGIN PV */ 新增
4 w* U8 P* W* ~1 p/ j- /* USER CODE BEGIN PV */8 M3 d: Y3 p$ N3 J
- /* Private variables ---------------------------------------------------------*/% F8 ^8 K7 G. U$ T( }. N0 d, j
- #define RECEIVELEN 16
0 Q! C# P# t7 P; ]; E - u8 uart1_Rx_Temp; //接收缓冲; O8 h& F- K5 a9 s9 ]6 i- ^ N
- u8 uart1_RxBuff[RECEIVELEN]; //接收缓冲: h) c- S9 [. r, w# k
- u16 uart1_Rx_Count; //接收长度
% U0 @" }' r& m; I - /* USER CODE END PV */
复制代码 5.3在main.c /* USER CODE BEGIN 2 */ //新增1 ^3 T2 x i7 G, z; E6 f
- /* USER CODE BEGIN 2 */$ b" p: P8 Q$ S/ U. N+ L: {& G
- HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_Rx_Temp, 1);. v& e8 P, d$ j0 x; Q& Q' s5 W
- /* USER CODE END 2 */
复制代码 5.4在main.c /* USER CODE BEGIN 4 */ 新增, N& M! z* W# U# }4 i
- /* USER CODE BEGIN 4 */) y# t0 V7 P6 u. q- s
- //UART1* |2 I) ^# B, g% w
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart), n/ t" T+ E& I8 P- w
- {+ B! A- R: x6 c8 b. r
- if (huart->Instance == USART1) 4 K# @- v, f. W$ B: P
- {
/ w% ] d. p; G6 J - uart1_RxBuff[uart1_Rx_Count] = uart1_Rx_Temp;
$ n! I) A, x, |3 g, | - HAL_UART_Receive_IT(huart, (uint8_t *)&uart1_Rx_Temp, 1);: _* g* r# ]7 b' X* G5 V& ~
- if (++uart1_Rx_Count >= RECEIVELEN), w! `6 x2 ~: S- @
- {6 o' z2 o6 Y/ Q/ V$ A+ C2 h# k0 m
- uart1_Rx_Count--;9 w* Z/ u" ^$ ]" G
- }6 h$ D A7 M/ v6 _0 B! U% v
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);9 J, R' x) L5 X2 _' s: e" X
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);5 ^) K0 \; ], |/ m* l+ D V8 {
- }
5 R3 K% p/ l* z( s8 t. v - }) Z% Q; W& |9 h
- void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
" K Q, L, K8 H7 z" f" s Q - {9 k3 N! {6 `$ r; W. t, ^2 p$ O' j
- if (huart->Instance == USART1) + U% x5 Q5 Z. \4 U. J
- {
. N; ]1 R7 s2 K - __HAL_UART_CLEAR_IDLEFLAG(huart);4 B* ~4 j! `- W( Q( L! m* i8 j
- __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
/ O S2 p, Q9 C$ Q - . M8 Y; L- B2 X- E4 \, ] m) ]
- HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, RECEIVELEN,0xFFFF);# h; H# J) M: y# f$ Z
- memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff)); //清空数组
# j: X( o; l0 [( V, A( k - uart1_Rx_Count = 0;5 G& E% t/ z( i x/ h, w
- }9 z4 _, ~) |" u; f' P
- }
2 k- d/ s. W# M! N - /* USER CODE END 4 */
复制代码 . a1 C* [0 ^6 \6 v
5 `# t4 F+ b4 B- J6 a
參考 https://www.stmcu.org.cn/module/forum/thread-620532-1-1.html?or59 s0 F; J% B; {- B3 @, C
1 q- a/ o* N: B+ k7 l ^6 _7 Z
! N0 k! a( M9 W" s& A& M3 x6 t3 Z1 S' o/ a( Q3 T( y& S
' L* s- g! j& r6 a/ M2 O3 B) }# E( o" u5 G
- ^( |0 ~: S" f. n6 D7 @: o8 y7 g
8 ~5 K* P8 p4 M& H+ k3 D! ?3 d, [+ x/ z0 u k) X- s2 Y
7 i+ Y5 P8 h H* n! b6 |
- C0 a$ k! G3 ^+ B6 v
4 S; }- \, X9 g* Z9 `
/ U* `0 a: q& ~+ d8 L$ X6 d2 B$ I9 L: B: Z; ?9 n
|