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

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   : 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
  1. /* USER CODE BEGIN 1 */
    5 c7 m5 l2 ?% ?( C/ Y
  2. void UsartReceive_IDLE(UART_HandleTypeDef *huart)
    - v! L% [$ \( x$ M) [1 T
  3. {  5 g: U$ t4 g3 |8 _3 Z. k* B& L4 ]% K
  4.   uint32_t isrflags   = READ_REG(huart->Instance->ISR);
    3 x! \0 v. h: m0 H7 u
  5.   uint32_t cr1its     = READ_REG(huart->Instance->CR1);. f0 g: i- K# G8 F; J9 Z

  6. 9 N9 P4 E6 T4 P" x5 x0 F0 o% x5 Z
  7.   /* UART Idle interrupt occurred   --------------------------------------------*/. \) h4 h" l, |8 S3 \! v5 }
  8.   if (((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))' `: C) @  o! y9 F, S" m9 s3 H1 Q
  9.   {
    ) E* g; p; A1 P/ k3 }! W
  10.     __HAL_UART_CLEAR_IDLEFLAG(huart);
    2 l) N9 G4 g6 J1 C2 F
  11.     __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
    5 E- d9 j) }7 K
  12.     HAL_UART_RxIdleCallback(huart);
    * `' E# a/ j; e7 ]( I
  13.     return;& q* E; g8 _+ R7 }
  14.   }
    - o! c  E& G" Y9 ~1 q) g! J, v
  15. }
    * G( y2 @) Q7 A; V8 k
  16. /**
    , A' I: |. Q4 j
  17.   * @brief  Rx Idle callbacks.& Y/ t  u) j1 [, Y" y5 w- l% W
  18.   * @param  huart: Pointer to a UART_HandleTypeDef structure that contains7 g* V2 U( V' S( K
  19.   *                the configuration information for the specified UART module.# |/ A1 _5 |1 B( s* v" I' x4 `
  20.   * @retval None
    ) w: n9 h8 ]$ _1 W! z
  21.   */
    $ O( C3 M. R! P: J' G
  22. __weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
    2 v8 q# @* u# I5 y# G
  23. {
    ' k+ t; [7 \* |% o  ~
  24.   /* Prevent unused argument(s) compilation warning */: z$ V4 `: H; {7 V' v- |
  25.   UNUSED(huart);/ s! p) e* \2 o3 [" [" n
  26.   /* NOTE: This function should not be modified, when the callback is needed,( `8 t  J8 ^9 @
  27.            the HAL_UART_RxIdleCallback can be implemented in the user file. j, S+ ?! m. V
  28.    */6 G$ Q4 f4 q) S8 W* l
  29. }
    # P2 W0 \; P* b+ a+ t7 j
  30. /* USER CODE END 1 */
复制代码
2.在usart.h /* USER CODE BEGIN Prototypes */ 新增4 l3 A( w# q. p. Z8 ]. D& Y& a
  1. /* USER CODE BEGIN Prototypes */
    & ]; l3 L1 U4 Q% Q; t6 o
  2. void UsartReceive_IDLE(UART_HandleTypeDef *huart);
    0 d4 q0 h4 Z- c9 W. \
  3. void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
    3 I- y# M. S9 `! S
  4. /* USER CODE END Prototypes */
复制代码
3.在stm32f0xx_it.c /* USER CODE BEGIN 0 */ 新增: q9 H$ k2 b+ D5 n( S
  1. /* USER CODE BEGIN 0 */; M: b; ]5 a% u6 O
  2. #include "usart.h"
    $ K" }8 w7 `/ L7 }* q5 o. Y
  3. /* USER CODE END 0 */
复制代码
4.在stm32f0xx_it.c void USART1_IRQHandler(void) 新增7 ?$ t4 Q8 ?" m8 b' {+ R
  1. void USART1_IRQHandler(void): |) C/ x& b9 k
  2. {
    " r9 |3 ^- K" ^
  3.   /* USER CODE BEGIN USART1_IRQn 0 */  n" r7 N5 j  r# T  c
  4.   UsartReceive_IDLE(&huart1);    //新增
      @( T9 L$ Y+ r* ]6 q
  5.   /* USER CODE END USART1_IRQn 0 */6 g, u: `4 ?, T( H
  6.   HAL_UART_IRQHandler(&huart1);8 h& f/ U' I/ P2 I
  7.   /* USER CODE BEGIN USART1_IRQn 1 */5 y* f- n) x8 v$ ]' z

  8. 1 T" e( W% @  k- y& U+ ^/ [
  9.   /* USER CODE END USART1_IRQn 1 */0 T0 K: d0 x3 i( m( L4 K
  10. }
复制代码
5.1在main.c /* USER CODE BEGIN Includes */ 新增: {5 W' u6 h4 O- B
  1. /* USER CODE BEGIN Includes */
    $ [) c) S/ U) [% k+ a
  2. #include "string.h"0 u. v9 z! Y9 N( o
  3. /* USER CODE END Includes */
复制代码
5.2在main.c /* USER CODE BEGIN PV */ 新增
9 p3 Y* j$ u5 B9 X
  1. /* USER CODE BEGIN PV */* R* O0 ^+ \, K( v# p% x
  2. /* Private variables ---------------------------------------------------------*/
    - Q& Q& |* Z/ p8 r2 u) d+ e
  3. #define RECEIVELEN 16! I1 h! |0 l; L9 S& X% u
  4. u8  uart1_Rx_Temp;            //接收缓冲
    " e8 }, }" x4 C3 X- J& K+ a/ [! n
  5. u8  uart1_RxBuff[RECEIVELEN]; //接收缓冲/ C# N  a# f3 A7 N; o7 ]
  6. u16 uart1_Rx_Count;           //接收长度3 W3 x9 b* \: Q+ A& i
  7. /* USER CODE END PV */
复制代码
5.3在main.c   /* USER CODE BEGIN 2 */ //新增. k5 S! I  Y! ]. ?' }7 g7 J- D1 ~
  1.   /* USER CODE BEGIN 2 */
    - i* ^; G7 \: P: [2 W7 v" ~
  2.   HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_Rx_Temp, 1);) S1 g6 v8 @0 I
  3.   /* USER CODE END 2 */
复制代码
5.4在main.c /* USER CODE BEGIN 4 */ 新增6 i( ~- d- x. S
  1. /* USER CODE BEGIN 4 */2 c7 R) W! l) R8 N: ~
  2. //UART1' \5 t9 ~# {, y2 ]
  3. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart), O  Q, o4 t% E5 r+ O. I; A
  4. {
    6 Y3 M# a  b, ^, b) F
  5.   if (huart->Instance == USART1) * B# \% y% G. M2 O6 a
  6.   {+ u8 o$ U* n" H  Q7 G$ x) h$ c. N
  7.     uart1_RxBuff[uart1_Rx_Count] = uart1_Rx_Temp;2 f  a! `7 i# \$ i. ^) q
  8.     HAL_UART_Receive_IT(huart, (uint8_t *)&uart1_Rx_Temp, 1);
    - _/ a; z+ {& S, h
  9.     if (++uart1_Rx_Count >= RECEIVELEN)
    + X% q, r3 p0 z' `: W- k
  10.     {
    - w! N* l1 [3 Y% i/ `
  11.       uart1_Rx_Count--;
    6 C: f3 [6 i; `- z! m/ a$ Y6 y
  12.     }$ X/ [# y' u" c2 s& ]0 ]% m, {- D! _
  13.     __HAL_UART_CLEAR_IDLEFLAG(&huart1);
      ^" G) k/ Q. e! U3 Y- f, J0 S
  14.     __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);1 f+ Q) X" ~7 r& t+ v9 R  z# q, y
  15.   }+ S" E; B- n% ^" {
  16. }
    % U) B; i0 \) D9 {
  17. void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
    : d7 p2 C4 ~7 ?: @. R/ x* A
  18. {
    - S, N5 i8 F+ k0 `
  19.   if (huart->Instance == USART1) * d) N) U" A: h  M; H1 [3 a
  20.   {
    - g* y3 B8 D0 C. _- X
  21.     __HAL_UART_CLEAR_IDLEFLAG(huart);3 t" L5 F- m. o% @3 w, e! H
  22.     __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);* E& C: e# c. J1 U5 x$ Z1 F

  23. 1 e! z: x5 Y3 C  W% e" `' i1 K5 u$ Y$ \
  24.     HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, RECEIVELEN,0xFFFF);2 ?6 Q7 F) a& K* G4 m2 x
  25.     memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff));                            //清空数组8 r8 _  v3 f6 a8 ?5 ~
  26.     uart1_Rx_Count = 0;
    / d8 M/ K7 ]" u0 h6 q1 _
  27.   }  v/ K, V0 _5 e  D0 o* C. z
  28. }6 Y( M; w9 |' c9 d9 t" O
  29. /* 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
赞 收藏 2 评论0 发布时间:2019-5-30 09:49

举报

0个回答

所属标签

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