你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 UART串口不定长接收IDLE,串口接收任意长度数据。

[复制链接]
289466080 发布时间:2019-5-30 09:49
  用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! ~
  1. /* USER CODE BEGIN 1 */8 J( z- \9 z2 f' l1 O% t
  2. void UsartReceive_IDLE(UART_HandleTypeDef *huart)
    0 X) l$ ?  q6 b
  3. {  ' M# P5 o. Z0 p' X
  4.   uint32_t isrflags   = READ_REG(huart->Instance->ISR);2 s" _- q2 O* H# R
  5.   uint32_t cr1its     = READ_REG(huart->Instance->CR1);
    2 S, M+ w/ Z* H5 G+ x3 |
  6. 7 B$ F; Y$ O$ M; C( t
  7.   /* UART Idle interrupt occurred   --------------------------------------------*/
    ! j& a  X7 j" Z+ p/ G9 t
  8.   if (((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
    7 H1 b1 f, Y( R
  9.   {* ^  D& P: z7 }' d
  10.     __HAL_UART_CLEAR_IDLEFLAG(huart);
    5 \/ @! g- ]3 E- n# R7 G! k& Z
  11.     __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
    & @' L8 |' c# P& q* L2 P: S4 G
  12.     HAL_UART_RxIdleCallback(huart);6 l1 m' N  j+ S8 K# f
  13.     return;; ~+ y  j# `/ y1 ?; h0 o
  14.   }; J1 x8 a% u) x& L5 M
  15. }4 q4 t0 ]/ [$ S
  16. /**
    & T4 D1 E) E# t5 H
  17.   * @brief  Rx Idle callbacks.
    7 T$ [5 X/ j. t& b2 a# J' K
  18.   * @param  huart: Pointer to a UART_HandleTypeDef structure that contains0 w: c6 ?3 I: ?1 z* p5 R7 R
  19.   *                the configuration information for the specified UART module.5 Z& A; I" W! A7 |
  20.   * @retval None/ x% ]  \* ]" X. y
  21.   */
    $ f9 Q7 l8 g$ a0 R8 W$ m
  22. __weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
    ! l1 I5 w- a6 ^# b7 M1 ]
  23. {6 e/ H' f: m3 s0 U' d$ o8 m
  24.   /* Prevent unused argument(s) compilation warning */; Z& \3 v% l. a  O; N0 B( Z% e1 E, e
  25.   UNUSED(huart);
    ) f  H) p8 C; D  v4 B" }0 v
  26.   /* NOTE: This function should not be modified, when the callback is needed,
    6 G8 l" b$ M# M3 }" ?" X
  27.            the HAL_UART_RxIdleCallback can be implemented in the user file
    - N+ I, s6 D( t0 j4 @; H
  28.    */+ ^$ L1 b. o; W
  29. }! v( m# L% J( @, V0 e
  30. /* USER CODE END 1 */
复制代码
2.在usart.h /* USER CODE BEGIN Prototypes */ 新增
9 T% r/ z8 \) s+ Y* d1 }9 _
  1. /* USER CODE BEGIN Prototypes */
    5 o0 @- y# z/ D% a
  2. void UsartReceive_IDLE(UART_HandleTypeDef *huart);
    0 Y" O3 M! Y& y2 l( q/ M/ w
  3. void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
    # ~2 p* y4 `* W) X, M
  4. /* USER CODE END Prototypes */
复制代码
3.在stm32f0xx_it.c /* USER CODE BEGIN 0 */ 新增) N* l+ O5 H, p8 n& Q. Q% o9 \
  1. /* USER CODE BEGIN 0 */
    1 A% z  m1 q: {# G& M' [
  2. #include "usart.h"
    + w, p7 L2 {$ y" c, W
  3. /* USER CODE END 0 */
复制代码
4.在stm32f0xx_it.c void USART1_IRQHandler(void) 新增
9 h+ p) J! Z" T6 S
  1. void USART1_IRQHandler(void)
    ! X. N" H6 L6 A% D0 f
  2. {
    2 v" `: S  @4 {. Q# H) @
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
    * D/ S1 N" z5 V" g
  4.   UsartReceive_IDLE(&huart1);    //新增8 U% L& S# X, t2 ?4 S; I$ @
  5.   /* USER CODE END USART1_IRQn 0 */0 @/ S6 B; ^; |4 M, Y0 s( @
  6.   HAL_UART_IRQHandler(&huart1);
    8 P( C2 s8 ~5 y! ^- P' z- t1 i0 F
  7.   /* USER CODE BEGIN USART1_IRQn 1 */
    8 h! h) ^' w( b: L* x$ l% W

  8. / u; V  F7 m* m+ _; J
  9.   /* USER CODE END USART1_IRQn 1 */8 U& Z8 H* _, l* e, w
  10. }
复制代码
5.1在main.c /* USER CODE BEGIN Includes */ 新增
4 M! b, v1 f# A: O
  1. /* USER CODE BEGIN Includes */: E4 E# W0 J& |. `* b5 K. [
  2. #include "string.h"
    : A! ^; F3 b3 {7 j$ B& D- a- @
  3. /* USER CODE END Includes */
复制代码
5.2在main.c /* USER CODE BEGIN PV */ 新增
4 w* U8 P* W* ~1 p/ j
  1. /* USER CODE BEGIN PV */8 M3 d: Y3 p$ N3 J
  2. /* Private variables ---------------------------------------------------------*/% F8 ^8 K7 G. U$ T( }. N0 d, j
  3. #define RECEIVELEN 16
    0 Q! C# P# t7 P; ]; E
  4. u8  uart1_Rx_Temp;            //接收缓冲; O8 h& F- K5 a9 s9 ]6 i- ^  N
  5. u8  uart1_RxBuff[RECEIVELEN]; //接收缓冲: h) c- S9 [. r, w# k
  6. u16 uart1_Rx_Count;           //接收长度
    % U0 @" }' r& m; I
  7. /* USER CODE END PV */
复制代码
5.3在main.c   /* USER CODE BEGIN 2 */ //新增1 ^3 T2 x  i7 G, z; E6 f
  1.   /* USER CODE BEGIN 2 */$ b" p: P8 Q$ S/ U. N+ L: {& G
  2.   HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_Rx_Temp, 1);. v& e8 P, d$ j0 x; Q& Q' s5 W
  3.   /* USER CODE END 2 */
复制代码
5.4在main.c /* USER CODE BEGIN 4 */ 新增, N& M! z* W# U# }4 i
  1. /* USER CODE BEGIN 4 */) y# t0 V7 P6 u. q- s
  2. //UART1* |2 I) ^# B, g% w
  3. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart), n/ t" T+ E& I8 P- w
  4. {+ B! A- R: x6 c8 b. r
  5.   if (huart->Instance == USART1) 4 K# @- v, f. W$ B: P
  6.   {
    / w% ]  d. p; G6 J
  7.     uart1_RxBuff[uart1_Rx_Count] = uart1_Rx_Temp;
    $ n! I) A, x, |3 g, |
  8.     HAL_UART_Receive_IT(huart, (uint8_t *)&uart1_Rx_Temp, 1);: _* g* r# ]7 b' X* G5 V& ~
  9.     if (++uart1_Rx_Count >= RECEIVELEN), w! `6 x2 ~: S- @
  10.     {6 o' z2 o6 Y/ Q/ V$ A+ C2 h# k0 m
  11.       uart1_Rx_Count--;9 w* Z/ u" ^$ ]" G
  12.     }6 h$ D  A7 M/ v6 _0 B! U% v
  13.     __HAL_UART_CLEAR_IDLEFLAG(&huart1);9 J, R' x) L5 X2 _' s: e" X
  14.     __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);5 ^) K0 \; ], |/ m* l+ D  V8 {
  15.   }
    5 R3 K% p/ l* z( s8 t. v
  16. }) Z% Q; W& |9 h
  17. void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
    " K  Q, L, K8 H7 z" f" s  Q
  18. {9 k3 N! {6 `$ r; W. t, ^2 p$ O' j
  19.   if (huart->Instance == USART1) + U% x5 Q5 Z. \4 U. J
  20.   {
    . N; ]1 R7 s2 K
  21.     __HAL_UART_CLEAR_IDLEFLAG(huart);4 B* ~4 j! `- W( Q( L! m* i8 j
  22.     __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
    / O  S2 p, Q9 C$ Q
  23. . M8 Y; L- B2 X- E4 \, ]  m) ]
  24.     HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, RECEIVELEN,0xFFFF);# h; H# J) M: y# f$ Z
  25.     memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff));                            //清空数组
    # j: X( o; l0 [( V, A( k
  26.     uart1_Rx_Count = 0;5 G& E% t/ z( i  x/ h, w
  27.   }9 z4 _, ~) |" u; f' P
  28. }
    2 k- d/ s. W# M! N
  29. /* 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
赞 收藏 2 评论0 发布时间:2019-5-30 09:49

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版