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

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

[复制链接]
wjandsq 发布时间:2019-5-10 21:33
stm32f4xx_hal_uart.c 中的HAL_UART_IRQHandler 函数,增加如下代码6 G$ ?, |! |6 ]4 G7 E' j' O: [- A
$ h$ b5 U9 ]  Z1 {
  /* UART Idle interrupt occurred   --------------------------------------------*/$ s8 _$ X9 v- j7 l" W  [
  if (((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
+ v0 \( r, Q- [0 `! n  {
: D5 J. \! B; T# I    __HAL_UART_CLEAR_IDLEFLAG(huart);
; a# E0 l9 p) h    __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
$ D1 _: }4 V. I    HAL_UART_RxIdleCallback(huart);
8 _. X$ x" k; H5 N* f8 [    return;
" |$ N$ L: p  J9 q) d1 K6 ]  }
8 {* v+ Z/ X& Z
. ^4 I& P- l2 J8 g以下__weak 函数也在stm32f4xx_hal_uart.c 中定义
5 n. H9 Z7 D0 R9 j0 Y' l' U2 z/**( ^$ j9 z! P* |( W0 ?  P7 c
  * @brief  Rx Idle callbacks.
9 ]% t7 H9 h! b7 n  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
' ]& c& M3 R" Q* Z7 E  *                the configuration information for the specified UART module.7 b" P& `1 q; p5 f2 I) |- a
  * @retval None0 Q1 @; _! Y. a/ h, |0 {: g
  */) c  V1 s& P2 `
__weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
, |; }( T& w( R{
/ K& L; {& z; i5 C$ k. v  M  /* Prevent unused argument(s) compilation warning */
8 x) h; L5 e" q1 C  UNUSED(huart);) Q; J$ ~( Q$ C+ Y6 {
  /* NOTE: This function should not be modified, when the callback is needed,( {( M. o2 Y  c" l
           the HAL_UART_RxIdleCallback can be implemented in the user file, u! c( v& D3 y! m1 r
   */8 ]" v2 P- d9 u9 r* K7 M, }) O! m4 P4 M
}
7 X4 k# s. u7 e& `同时,stm32f4xx_hal_uart.h中增加如下函数声明,算是给最新的HAL库打补丁了。  z; O' H1 n8 f" {- S* P# b! {8 ^
void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);& m0 l: @" D9 P9 g

1 E( U9 ^4 R/ j& g) X最后,在生成的代码中,增加如下实际函数。# o, R3 K: g  a1 y% R
/* USER CODE BEGIN 1 */6 ]" c% Q& m$ f; h- R
/**
8 z+ g9 s2 B) M" y- [. W  * @brief  Rx Transfer completed callbacks.) u7 p0 g! V7 e5 a9 [7 U
  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains& N: m) x+ S3 C- O# G+ s
  *                the configuration information for the specified UART module.6 ^. _; D4 l0 r
  * @retval None
+ J+ X" x8 Z* c0 C$ `( r2 B# d  */2 C' D4 e$ ~/ r# w1 n
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
2 \$ L3 V4 Q" M3 ?' F' q# ?{
) {" e. S3 Q: t$ {  if (huart->Instance == USART1) {: Z7 L- F& f# C& m* Q, G
    USART1_Rx_Buf[USART1_Rx_Count] = USART1_Rx_temp;
# o0 E. N$ N1 ~8 M$ Y; }    HAL_UART_Receive_IT(huart, (uint8_t *)&USART1_Rx_temp, 1);" H: ?5 n/ `7 K2 \1 O+ s& y
    if (++USART1_Rx_Count >= USART1_Rx_Buf_Size) {5 o' b) H1 I* Q6 Q5 z
      USART1_Rx_Count = 0;
8 \4 U% ]. R9 J7 O    }
% m' z. P; D1 v. {* e3 B* M0 c    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
2 J3 l" b* R+ B5 T" {: ]" D0 d    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);, [: ^$ s/ H" _% e" P- m
  }
& Z$ {- x6 J0 h}& a+ ^% e  u) m9 M

; F8 s+ Y, L0 t/ _/ O /**! V: M' L6 n, Z
  * @brief  Rx Idle callbacks.' j$ W, M" N+ b4 T1 U
  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
! F1 O0 O/ N& {2 v% V+ Z: `2 q0 [" _  *                the configuration information for the specified UART module.; M& N6 J  `% H1 G
  * @retval None) v* F0 I$ Y) J- a
  */2 N+ J/ |  r3 D5 b1 i+ }" S- |
void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart); i* |7 G4 ~. X! a8 e' _5 l( p5 i3 Y
{+ q7 Q" J% ?/ G  Y1 j- M" t# d
  if (huart->Instance == USART1) {
8 z7 R/ ]. Q% h( u. n$ X    __HAL_UART_CLEAR_IDLEFLAG(huart);# u+ H3 O7 q' b" x8 R
    __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
- T4 T4 s% i* X    if(USART1_Rx_Buf[1] == 0x55){4 K8 F4 W9 o( T6 h) ^
      __NOP();
9 b; k6 _3 w" X( @2 G      __NOP();4 _9 l. ~' r3 E3 s3 ]
      __NOP();3 e2 j  H. v6 C& K' D
    } else if(USART1_Rx_Buf[1] == 0xA5){$ O2 {1 G0 h7 v2 `% P
      __NOP();
' W8 ?  ^2 ~! D! D9 B' a5 A      __NOP();$ N8 L- Y2 o; e' Z
      __NOP();
& N0 w0 B$ `# n' [5 ^    }: p" r2 {, n8 D" e9 T
    memset((uint8_t *)USART1_Rx_Buf, 0, 1024);3 E# @, u+ G, U% |4 @" t9 Q. b# i
    USART1_Rx_Count = 0;
% p1 z- H# U9 n/ R/ ?" _/ G0 _  }
$ q5 [. s! l1 n0 \) m}
) M# W9 H& Z2 b( v& u' M4 M( x7 W, q( V$ ?# U% U/ m5 t0 m
/* USER CODE END 1 */- g) [4 @) N' Q# |

, M4 L3 o3 ?! {% M经测试,不管连发多少个字符,都会进空闲中断回调函数,这样应用程序就非常好处理了。
& Q& ~* p  u& x4 E$ ~+ d8 c. U) F. V
2019/05/10 wjandsq@163.com8 |5 l- B0 r# d) s0 D
/ o; r: j$ X3 M6 H5 T  Y8 b
赞 收藏 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 编辑 ' c8 a5 Z- a0 m8 \+ ?7 |) L7 b

" y  G) ~; m# e8 Q很好用,多谢分享
liu1980108 回答时间:2020-12-15 10:50:41
感谢奉献  赶紧的收藏
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版