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

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

[复制链接]
wjandsq 发布时间:2019-5-10 21:33
stm32f4xx_hal_uart.c 中的HAL_UART_IRQHandler 函数,增加如下代码
8 N# K/ ]6 k3 e+ b1 v: u1 n0 r5 ]
4 I9 x. N$ [3 J4 Q  /* UART Idle interrupt occurred   --------------------------------------------*/
. c5 t( q( R# D+ `5 k: J& D$ p  if (((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))4 n7 f' E% K  m
  {
1 b$ z6 A7 ?7 Q- h7 B    __HAL_UART_CLEAR_IDLEFLAG(huart);9 d3 O% U( U* Y: ^" F$ b
    __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
$ a8 l; Y" Z! v0 p    HAL_UART_RxIdleCallback(huart);
1 N: \2 E1 d) I/ U' v8 T6 {    return;6 A1 n- a7 K( z/ e3 j0 Q- h
  }) v1 `8 I7 z# L6 ], C6 e
! b: j0 W& k8 Y  q3 F
以下__weak 函数也在stm32f4xx_hal_uart.c 中定义: e4 m# d1 r/ K4 a
/**
. a1 ?' M0 }* `9 P: H' Y  * @brief  Rx Idle callbacks.
* M4 Y- d/ j/ x7 e! b" ?) {8 l. h" R  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains9 y, U7 `4 z; _' U
  *                the configuration information for the specified UART module.
) w* p5 {5 L+ `: V. v" d" m8 n  * @retval None
9 r+ d" A8 J8 y9 d( t  */
0 Q9 H4 k+ Y% D% G4 f6 |! C__weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)" e" t1 D! u8 n& v
{, j! k6 w2 Y) {# r
  /* Prevent unused argument(s) compilation warning */
' k: x  S. v: k) U$ O  UNUSED(huart);/ j  Y, `, z+ {
  /* NOTE: This function should not be modified, when the callback is needed,
  l. d3 L* `9 `           the HAL_UART_RxIdleCallback can be implemented in the user file
/ v8 t  S6 w# Z   */
2 k7 @- N* p1 ]+ T) o9 y}
: K5 P. O. \7 s, p9 W& t6 P5 O" H! I同时,stm32f4xx_hal_uart.h中增加如下函数声明,算是给最新的HAL库打补丁了。
7 G  @( G* z$ ]: e7 Cvoid HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
/ }" o) `! q! F( U3 Q4 P7 I
' ?% B$ N( F7 U6 m5 r0 G! I最后,在生成的代码中,增加如下实际函数。( {* E& I1 K. [
/* USER CODE BEGIN 1 */: p8 l& ?0 E" F3 {* K0 l
/**7 f+ f! i4 m+ o+ b* R+ y+ S4 A9 O
  * @brief  Rx Transfer completed callbacks.
( D2 o0 t" m, X& o* s  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains0 q! j6 p  l. z! Z. z# r' j% U$ p: @0 g
  *                the configuration information for the specified UART module.- H& `2 N9 u0 U1 `
  * @retval None
$ s6 x9 s: a  q# G& U& Y  */3 u5 e! c+ }' E+ a/ w+ F
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
4 U" O# a' D# |, T/ q: U0 L{
* h: O. d1 L7 A6 L2 N  if (huart->Instance == USART1) {
2 ~  B2 e! o$ p3 x    USART1_Rx_Buf[USART1_Rx_Count] = USART1_Rx_temp;
% f" B: ]5 M! S4 L    HAL_UART_Receive_IT(huart, (uint8_t *)&USART1_Rx_temp, 1);, e( h; {$ y6 _
    if (++USART1_Rx_Count >= USART1_Rx_Buf_Size) {
) `/ [5 l* K& o; c  B1 c      USART1_Rx_Count = 0; 3 M- t! f& j* x; c: q
    }
( D1 f8 e  @- f& o    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
& C8 d/ Q3 E* n+ W" A! y    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);* D$ i& _* g6 A' C+ D
  }
* [7 ^6 o! U6 @8 L4 H}
9 ?0 ~! t+ @. S0 A' @8 a$ S+ ~! X( T$ \: K1 u
/**
) z: s& s  z! u, [$ F2 `! m  * @brief  Rx Idle callbacks.
* i6 N- ?2 k- ^# @2 S  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains1 k; x! p* q4 {
  *                the configuration information for the specified UART module.
# N% V9 r3 I6 D  * @retval None
8 c1 V. x! V0 f* ]  */
, A0 M8 h9 z. [+ U$ Fvoid HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
7 D! o0 ]4 [5 i+ z! G{) @. K8 Y! f. d  W% \
  if (huart->Instance == USART1) {
8 S! J7 k$ t4 M" J    __HAL_UART_CLEAR_IDLEFLAG(huart);! ?8 h, \, W6 q% ~
    __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
9 W0 ~+ X3 X) C& D7 i! A2 C    if(USART1_Rx_Buf[1] == 0x55){
1 {3 a5 o( B; o2 N      __NOP();; E/ S& f, q9 e# x+ O( `& K+ s
      __NOP();
* b' k# w4 J* J  S' A6 C      __NOP();
5 |2 H. U0 w7 c# v- O/ f( w) I    } else if(USART1_Rx_Buf[1] == 0xA5){3 D4 c- f# f* p2 B
      __NOP();3 h/ w3 P7 C" x) G/ V
      __NOP();
/ C: @) O4 {% @) D' E8 U      __NOP();& c0 Z. o% t. o4 y. ~  w
    }" V: O" A% E7 @  s& ~& {
    memset((uint8_t *)USART1_Rx_Buf, 0, 1024);
& }8 J( X- p& c    USART1_Rx_Count = 0;0 }6 F' ^' ~# \7 q4 N7 W
  }
$ ?* N7 ]* N+ o6 h} 3 W' z* y3 l, s7 Z3 d8 |! Z

2 W  a" S" Z  G( C' `% p: s) B/* USER CODE END 1 */
' k/ p! b# \! m2 b5 M: B: R) a" o" z8 j# c: k; v/ m" M
经测试,不管连发多少个字符,都会进空闲中断回调函数,这样应用程序就非常好处理了。- L! p: e, h5 \& M6 U( [# r

0 s) b/ |/ ]0 d  ?% {; {7 z, s2019/05/10 wjandsq@163.com
1 {& q+ N( ^+ r7 h2 h0 X4 R$ x8 P9 w# N6 \4 J' ?# C  e6 }$ Q! p
收藏 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 编辑
/ [+ X& T' H8 I. o( K* F1 @, }7 o+ E" F
很好用,多谢分享
liu1980108 回答时间:2020-12-15 10:50:41
感谢奉献  赶紧的收藏

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版