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

一种基于HAL+UART+DMA环形队列接收数据实现方法

[复制链接]
byronsong 发布时间:2019-6-13 10:11
本帖最后由 songshiqun2010 于 2019-6-13 12:01 编辑 : y5 p% D+ N# T

  1. 6 [- _5 _/ }& }9 \6 l2 [  n: o
复制代码
1.空闲中断回调函数定义 如下
  1. void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)& c/ y/ o7 b* r. ?
  2. {
    ! F1 ~) M$ i: M& V( ~
  3.   if(huart->Instance == USART1){( _/ A: B4 R) t3 {+ J
  4.     if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) ){
    6 g; X, o/ t" b3 s8 b# u- ]
  5.       uint16_t rx_buffer_len,i;
    & k0 |3 q& I0 [
  6.       __HAL_UART_CLEAR_IDLEFLAG(huart);; O  t  C" X  ]/ o3 `, u* `
  7.       HAL_UART_DMAStop(huart);" F+ ^4 W& K: W- v
  8.       rx_buffer_len = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx);: @, j+ V9 a! S! A0 v3 e( b
  9.       //TO DO:
    ( @1 v2 F4 l0 m3 b
  10.       //将数据(huart->pRxBuffPtr 中 rx_buffer_len个字节)压入环形队列
    % z0 k4 s+ |! A; Y' X
  11.       //这里未做环形队列实现,请自行填充
    : [9 l- M! O( k. F' v; K! Q
  12.       HAL_UART_Receive_DMA(huart,huart->pRxBuffPtr,huart->RxXferSize);
    1 i, v, X0 d* p" P1 y2 m- W
  13.     }
      P. u* S8 l' ^! P- `5 e- P
  14.   }
    & t+ w+ e! z  H* L7 i5 O' x
  15. }
复制代码

% X# S, t0 D2 Q" b9 r$ j2.回调函数调用方式如下
3 m( [3 J0 s% l4 h5 Y& x
  1. /**
    : x) ^4 m3 _. p. I
  2.   * @brief This function handles USART1 global interrupt.
    9 V; C1 [9 o( X; l: m
  3.   */) g, V# u3 e% X& q5 V- y
  4. void USART1_IRQHandler(void)
    . Z- F$ K+ G2 T' P0 a' V
  5. {* P& ]  G; K/ Y, i% m' M5 {
  6.   /* USER CODE BEGIN USART1_IRQn 0 */$ n  q6 @& v/ n( q" O/ ]: C
  7.   extern void HAL_UART_IdleCallback(UART_HandleTypeDef *huart);
    + c. t' O  k, a9 F
  8.   HAL_UART_IdleCallback(&huart1);
    ' ~) B9 C% U# f( m# F- M, I2 V
  9.   /* USER CODE END USART1_IRQn 0 */
    ! A. a" W; x/ i# U9 t2 Z' l
  10.   HAL_UART_IRQHandler(&huart1);
    6 F- p( b, K- m1 J) R6 ]
  11.   /* USER CODE BEGIN USART1_IRQn 1 */) k5 p) G# I5 J+ n6 L8 E% J

  12. , w4 o' G$ ]# S
  13.   /* USER CODE END USART1_IRQn 1 */3 E) p" C1 G/ h. g1 Q5 ^
  14. }
复制代码
3.初始化如下4 M! b7 o5 n0 a$ Q$ t
  1. " |/ C5 v/ s5 f: q9 l
  2. uint8_t rx_buffer[256];
    / X" ^$ y/ I1 r7 |" b1 a

  3. 5 R5 I: Y. n7 z6 b- m( r
  4.   HAL_UART_Receive_DMA(&huart1,rx_buffer,sizeof(rx_buffer));' A% [' w) K& ^( K. ]: s  P
  5.   __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
复制代码
4.环形队列keil5 pack ctb.ringbuffer.1.0.0.zip (3.61 KB, 下载次数: 96)
赞 收藏 3 评论6 发布时间:2019-6-13 10:11

举报

6个回答
creep 回答时间:2019-6-13 13:56:06
感谢分享      
jeffhe1 回答时间:2019-6-13 17:13:29
Ringbufer 也可以直接生成 , 真是越來越方便了
唐英tcy 回答时间:2019-6-17 08:05:45
谢谢分享' w( n1 @5 |" T$ O/ n& s
rayan19890804 回答时间:2020-9-23 08:31:18
这个好
Ankky 回答时间:2020-9-24 08:53:05
jeffhe1 发表于 2019-6-13 17:13
7 R: Y, ]% m- d6 F* hRingbufer 也可以直接生成 , 真是越來越方便了

1 E$ t  R* t1 Y! D! ^/ O# G大神,环形队列怎么自动生成?
jeffhe1 回答时间:2020-9-24 09:05:50
caoenq 发表于 2020-9-24 08:53' E3 ]7 t* L: I5 T
大神,环形队列怎么自动生成?
3 ]! |- m4 v( ?, }
帖子上不是有說明如何勾選 ? 如何生成 ?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版