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

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

[复制链接]
byronsong 发布时间:2019-6-13 10:11
本帖最后由 songshiqun2010 于 2019-6-13 12:01 编辑
; a. j0 l, L" g4 b$ c
  1. ! m( @3 V- b) @5 ~( d+ H/ v; H
复制代码
1.空闲中断回调函数定义 如下
  1. void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)- I' y+ d& u( ]9 m1 i- A! t
  2. {8 F# A) P0 t: ~8 e
  3.   if(huart->Instance == USART1){
    , u/ m$ A  R# m: N
  4.     if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) ){4 M+ B" @; C  V: t
  5.       uint16_t rx_buffer_len,i;, D* K" N) A1 K, r$ W' U) y
  6.       __HAL_UART_CLEAR_IDLEFLAG(huart);' Y' O* M) E3 _+ e# s
  7.       HAL_UART_DMAStop(huart);
    5 S# T+ Q% b  u. `
  8.       rx_buffer_len = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx);
    : q5 @' f0 L% n
  9.       //TO DO:
    2 ~) m- ~% [" j1 Z8 M+ P( K
  10.       //将数据(huart->pRxBuffPtr 中 rx_buffer_len个字节)压入环形队列
    : g7 X7 T7 f" U2 t
  11.       //这里未做环形队列实现,请自行填充4 V# q/ v/ ]2 F! r) @5 J
  12.       HAL_UART_Receive_DMA(huart,huart->pRxBuffPtr,huart->RxXferSize);7 q. D- H5 l9 ]$ o% {, a" X  T1 O
  13.     }
    + f( a3 C  S3 m' S
  14.   }3 ^+ M* V8 c( Q# T- K: s5 d+ `- f
  15. }
复制代码
6 w5 |+ T( o: {" b4 l$ p- ^$ V4 F
2.回调函数调用方式如下
+ `0 x) B0 U. h
  1. /**
    ' C# I) ^6 k6 [( E+ N, {% o3 Y8 m
  2.   * @brief This function handles USART1 global interrupt.8 B1 j# Z' u. f) _1 y& [
  3.   */
    * l( p, ?, Q2 Y
  4. void USART1_IRQHandler(void)
    # m. Z( e0 a" g" w9 s9 o! [  R8 D
  5. {' P8 ~% @$ \' |  H3 b" h: z
  6.   /* USER CODE BEGIN USART1_IRQn 0 */( @$ D) L) k6 o/ ?! r
  7.   extern void HAL_UART_IdleCallback(UART_HandleTypeDef *huart);
    & n: ]8 F5 U5 E1 F5 e8 y
  8.   HAL_UART_IdleCallback(&huart1);1 [/ I* @6 @* y5 M; B; J; A3 Y: C
  9.   /* USER CODE END USART1_IRQn 0 */
    ' a  D, K  c; ?- O9 H
  10.   HAL_UART_IRQHandler(&huart1);, m" N& [% f3 p; N
  11.   /* USER CODE BEGIN USART1_IRQn 1 */' u0 `8 ^+ x6 D+ f* N  A& U9 k) W
  12. ( |& j: E9 ]  S8 I
  13.   /* USER CODE END USART1_IRQn 1 */
    6 O4 q0 ?4 c& L! N$ F1 V6 K9 o5 s
  14. }
复制代码
3.初始化如下* R) d% F* O9 Q, {3 x7 U; j/ [
  1. # k, z8 h7 U) a! `: Z! r, j
  2. uint8_t rx_buffer[256];+ u% Y8 d& o" z% W8 \; o

  3. 8 [" S% H" n; I
  4.   HAL_UART_Receive_DMA(&huart1,rx_buffer,sizeof(rx_buffer));4 a+ a. n$ B; C- g
  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
谢谢分享  K' E+ A$ i% Q  r3 `* X# D
rayan19890804 回答时间:2020-9-23 08:31:18
这个好
Ankky 回答时间:2020-9-24 08:53:05
jeffhe1 发表于 2019-6-13 17:13; V0 `8 m# Z2 b* ?2 O
Ringbufer 也可以直接生成 , 真是越來越方便了
& K% v2 x' h7 Q* y) F0 r, s8 b
大神,环形队列怎么自动生成?
jeffhe1 回答时间:2020-9-24 09:05:50
caoenq 发表于 2020-9-24 08:53
6 w! ^# y  Q9 B大神,环形队列怎么自动生成?

2 t6 [+ w; A$ S$ g帖子上不是有說明如何勾選 ? 如何生成 ?

所属标签

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