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

HAL串口实战例程,调试通过!

[复制链接]
wjandsq 发布时间:2019-5-10 21:33
stm32f4xx_hal_uart.c 中的HAL_UART_IRQHandler 函数,增加如下代码
, k3 H& {" p5 D* i- h
4 Q, z3 j: u# s$ E" g  /* UART Idle interrupt occurred   --------------------------------------------*/
! Z9 r* j1 @* j$ O2 u2 e6 G$ c* F  if (((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
6 k2 C  J, ~* r: y- L! e  {/ I# i  W9 O( d6 S) [$ T9 r  X
    __HAL_UART_CLEAR_IDLEFLAG(huart);
' O2 E) j3 h+ u( q+ z. l    __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
! A# r( `* g$ F8 f4 F, Q    HAL_UART_RxIdleCallback(huart);  s9 p0 `- Y. s  Z1 W9 c; R! ^/ x
    return;$ u# s6 @3 W$ k2 o3 q4 Z
  }
0 }$ q% x# a& t  L: l
. A% J. j1 }0 i" B" I0 A+ Z0 s- J6 d% Z以下__weak 函数也在stm32f4xx_hal_uart.c 中定义
* B! o% Q; i# a8 V9 L/**
; U+ _+ \2 i3 Y5 M# i  * @brief  Rx Idle callbacks.
' J. X5 N$ {& G  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains+ E8 E) r8 E/ X6 d  K
  *                the configuration information for the specified UART module.
0 j( r) z5 T2 O! y0 u5 ~1 }  * @retval None
& ^$ F; p' p- r- r# n  */; L5 l) w. h) G8 ?) E
__weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)$ N0 j6 y- }7 z
{% S4 m2 ^$ P' g& e
  /* Prevent unused argument(s) compilation warning */
& E6 m- j( R+ C5 x/ E3 M1 u  UNUSED(huart);, p" f* `+ D# `  k7 h6 G: G- i) H
  /* NOTE: This function should not be modified, when the callback is needed,. s3 y' I, _3 X+ ]  @
           the HAL_UART_RxIdleCallback can be implemented in the user file
% \6 `. w9 H: S6 v1 C   */% t/ b8 z4 w: h, [6 F. n" F6 o& E  S( b/ ]
}
) D3 F$ b( C: {5 O5 \6 H同时,stm32f4xx_hal_uart.h中增加如下函数声明,算是给最新的HAL库打补丁了。6 R% n' Y% U* q. Y
void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
  Z$ ~. l- R0 y: y& O: g/ R; [' O
最后,在生成的代码中,增加如下实际函数。
. K9 k5 B& j, b* Q/* USER CODE BEGIN 1 */3 q4 {+ j7 Q  S9 r
/**
. X0 Y' A% |% Z' I% p  * @brief  Rx Transfer completed callbacks.
& I. i; q" \4 |, c+ n9 i  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains
# o! h" P! H2 v4 D, D7 o  *                the configuration information for the specified UART module.
( J" G4 _1 K/ [  * @retval None
5 N$ }8 y+ \) }$ M  */
7 W4 s5 }# C# i" T5 qvoid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)# d' m4 W' `3 }% s& Y
{
- \4 a" `, E! e" M: i2 |  if (huart->Instance == USART1) {3 l- V9 i( j$ @$ W2 W& o
    USART1_Rx_Buf[USART1_Rx_Count] = USART1_Rx_temp;
! r3 p6 h. P. W: H3 `    HAL_UART_Receive_IT(huart, (uint8_t *)&USART1_Rx_temp, 1);
* D% x. p. b2 m* r: z    if (++USART1_Rx_Count >= USART1_Rx_Buf_Size) {% G) _) d* S3 o, U+ Q% e
      USART1_Rx_Count = 0; 4 E5 K& J( O; f% i+ }
    }
* u+ T$ @9 Z3 E4 N4 D  w    __HAL_UART_CLEAR_IDLEFLAG(&huart1);( M$ Z0 q6 s9 m% }4 G" @
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);. ~6 {, p' I" @/ e( M
  }" a' J" k* E3 Y% ~
}
% V- V1 ~+ \2 }7 r
7 C3 D, E2 H6 Y: i  M /**
) n3 `0 [: Z  Y; t" g  * @brief  Rx Idle callbacks.
1 e7 b+ n, Z" U- S  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains' `$ z4 U3 U2 k( |
  *                the configuration information for the specified UART module.
3 Y; P$ n2 H( ?* l  * @retval None
! @8 Q" z: i. `/ Q$ m+ t  */
8 w! v, C8 ?  A% Bvoid HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
- F' j! G, K% [6 K{' X3 J+ I2 B& ^# u
  if (huart->Instance == USART1) {
) G4 t2 x5 j4 k    __HAL_UART_CLEAR_IDLEFLAG(huart);
4 j  S! T! L2 g) G    __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);; G* n$ P1 z. C8 F, A9 L
    if(USART1_Rx_Buf[1] == 0x55){/ s9 B0 U$ h* F, u) K& b& Q& p
      __NOP();; ]% {) V" g2 d- f0 R! P
      __NOP();
0 s4 G, w# p8 Y7 K3 V5 {      __NOP();2 P$ `& h$ r6 I  s: W
    } else if(USART1_Rx_Buf[1] == 0xA5){
5 i& Y7 d% @& c/ C8 O9 j% J* Z2 ~      __NOP();
2 X* |# K6 p+ {' I' q3 D$ V2 [      __NOP();/ ?* z' L) |5 y. F
      __NOP();6 Q. x8 M" g. V8 \# w
    }
, }2 ~  b( Z* I* G; s- c$ c    memset((uint8_t *)USART1_Rx_Buf, 0, 1024);
  O! R2 X% f' j9 t# v2 g    USART1_Rx_Count = 0;
% m& f' j8 D* ^4 a  }- H# S* m8 J) V2 E2 R$ K
}
( m* ~" y5 P" W, h" U* d! Y* e  o+ H2 ]
' S' @$ D* h, `( E1 `" B/* USER CODE END 1 */
  u# ~, L# A: h/ J, v0 @! [* I' U4 z) A8 e
经测试,不管连发多少个字符,都会进空闲中断回调函数,这样应用程序就非常好处理了。" C. w. Z) D( F8 s$ ]3 M  n/ g
! f! {( w! ~$ Y0 J, s/ {5 n3 v
2019/05/10 wjandsq@163.com
; ~% j: @5 J$ `7 a( b: S. k2 A" P# J5 e$ F
收藏 2 评论6 发布时间:2019-5-10 21:33

举报

6个回答
wjandsq 回答时间:2019-5-10 21:41:43
HAL库版本: STM32Cube_FW_F4_V1.24.1
Kevin_G 回答时间:2019-5-12 22:56:29
收藏收藏,最近也在搞这个。
STMCU-管管 回答时间:2019-5-16 15:27:10
谢谢分享
289466080 回答时间:2019-5-24 10:32:05
谢谢分享,搞了好几天参考这个终于搞定而且不用DMA用F030 16k的正好可以减少使用空间
米兰的无线电 回答时间:2019-5-24 15:44:50
本帖最后由 role_2099 于 2019-5-24 16:15 编辑
. y$ G) U9 |% Q. B, ~% M
& s+ W& t7 B0 _& H2 n" |很好用,多谢分享
liu1980108 回答时间:2020-12-15 10:50:41
感谢奉献  赶紧的收藏

所属标签

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