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

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

[复制链接]
byronsong 发布时间:2019-6-13 10:11
本帖最后由 songshiqun2010 于 2019-6-13 12:01 编辑 & Z% O& L! g$ x4 g9 p1 x

  1. 0 a. n6 G3 s; p/ [+ q7 l# [6 h
复制代码
1.空闲中断回调函数定义 如下
  1. void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)6 |3 j, j: ]) d: i
  2. {, c- v8 \1 C" ^. k' Q1 Z
  3.   if(huart->Instance == USART1){
    . o3 g5 ?8 O7 ?& @
  4.     if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) ){
    % n+ h6 w7 `4 w7 X$ }
  5.       uint16_t rx_buffer_len,i;3 J7 @1 t# n! Y; o
  6.       __HAL_UART_CLEAR_IDLEFLAG(huart);7 }2 b4 [/ P2 ?) {! i; s
  7.       HAL_UART_DMAStop(huart);/ y9 X6 C) B1 a
  8.       rx_buffer_len = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx);/ ^9 u$ l! M: z* f
  9.       //TO DO:
    6 x1 H; R) K8 M
  10.       //将数据(huart->pRxBuffPtr 中 rx_buffer_len个字节)压入环形队列
    # m0 u: N1 X/ D" Z, F" t
  11.       //这里未做环形队列实现,请自行填充/ e1 ~2 L, c! ?' z
  12.       HAL_UART_Receive_DMA(huart,huart->pRxBuffPtr,huart->RxXferSize);
    2 G& A, J3 O, j8 v+ d
  13.     }
    - ]" E. [5 e  x5 I( U
  14.   }2 ~7 Q# H% C% i: p. @% q4 W8 }. g5 q
  15. }
复制代码

; e( K1 g5 X+ Q# M- W2.回调函数调用方式如下
0 v" d$ |5 M0 N, w3 m* B/ F
  1. /**3 `  w( y9 x' C' j
  2.   * @brief This function handles USART1 global interrupt.
    ( O  n7 h+ c; s, o: L
  3.   */. M# m0 Y3 P5 D
  4. void USART1_IRQHandler(void)
      P) N, }) {+ |- s
  5. {* I, O7 U6 k9 |2 t" |
  6.   /* USER CODE BEGIN USART1_IRQn 0 */
    : i- S( F, n% o4 K$ @0 y
  7.   extern void HAL_UART_IdleCallback(UART_HandleTypeDef *huart);
    % E2 G6 z/ {1 W$ E$ `  {
  8.   HAL_UART_IdleCallback(&huart1);& r0 V" t4 g9 I* W* n
  9.   /* USER CODE END USART1_IRQn 0 */# M5 U; t! j# M) A5 |
  10.   HAL_UART_IRQHandler(&huart1);
    ( ]! i9 |5 h, D/ y* W
  11.   /* USER CODE BEGIN USART1_IRQn 1 */: Y/ Q( \7 ^+ k1 q: t8 |

  12. 7 M* W1 c6 @0 W
  13.   /* USER CODE END USART1_IRQn 1 */2 f( O" D: |& y6 A1 m( {
  14. }
复制代码
3.初始化如下
" O) T7 O6 _) X6 _) J7 `3 m4 m; X
  1. . A2 n# S* n4 t/ k
  2. uint8_t rx_buffer[256];1 @( j& ^$ |1 W5 \! h2 E
  3. 5 g- U% Q2 }& k8 H) K5 W
  4.   HAL_UART_Receive_DMA(&huart1,rx_buffer,sizeof(rx_buffer));8 ]3 E& n" u! g5 L( E. ?5 ]1 B
  5.   __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
复制代码
4.环形队列keil5 pack ctb.ringbuffer.1.0.0.zip (3.61 KB, 下载次数: 85)
收藏 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
谢谢分享
+ V, u7 i% Y. g2 T& R! I
rayan19890804 回答时间:2020-9-23 08:31:18
这个好
Ankky 回答时间:2020-9-24 08:53:05
jeffhe1 发表于 2019-6-13 17:13; y0 D& b2 P/ U& f+ c1 A
Ringbufer 也可以直接生成 , 真是越來越方便了

' E, n' i0 |1 `3 B3 x' a大神,环形队列怎么自动生成?
jeffhe1 回答时间:2020-9-24 09:05:50
caoenq 发表于 2020-9-24 08:53; T; R+ {$ A9 i3 g; i( m
大神,环形队列怎么自动生成?
! t# v! A# ^0 w6 _- ~8 R; R9 k
帖子上不是有說明如何勾選 ? 如何生成 ?

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版