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

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

[复制链接]
byronsong 发布时间:2019-6-13 10:11
本帖最后由 songshiqun2010 于 2019-6-13 12:01 编辑 9 N& F' D: p+ }* P7 T2 a
  1. " G+ `4 d% A' W8 z1 ?
复制代码
1.空闲中断回调函数定义 如下
  1. void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)
    / a% A3 [% U/ ^3 v' p
  2. {
    9 b) _3 M6 O8 ]6 M; F) \
  3.   if(huart->Instance == USART1){& w8 z1 B$ Q& X# ]/ Q
  4.     if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) ){
      _8 A! I1 r0 ?8 D+ `
  5.       uint16_t rx_buffer_len,i;- i# o3 ?8 H1 O; y1 `
  6.       __HAL_UART_CLEAR_IDLEFLAG(huart);
    , F! W2 d) ?6 N8 q8 D( L# ^
  7.       HAL_UART_DMAStop(huart);: L9 k+ @4 ]: Y( Q9 ~8 j: j' a6 P0 A
  8.       rx_buffer_len = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx);
    1 v; d7 m( M. j  v) K/ m1 w  d& C
  9.       //TO DO:
    ) R6 k8 ]2 E; D
  10.       //将数据(huart->pRxBuffPtr 中 rx_buffer_len个字节)压入环形队列! Q( ^, T+ |" H/ {) {
  11.       //这里未做环形队列实现,请自行填充
    , D, y1 e$ O, H3 n# [+ p; `
  12.       HAL_UART_Receive_DMA(huart,huart->pRxBuffPtr,huart->RxXferSize);1 ^. k8 m8 y8 M6 {# \- V
  13.     }& j$ N. f/ i& o4 }! ]" a4 [
  14.   }
    ' q4 C5 r# [% V8 F% u, d( o
  15. }
复制代码
( C  h8 ]& @+ m# r3 o
2.回调函数调用方式如下0 ?. U! L2 X: ?( Y3 O! z
  1. /**& A$ Z0 a9 I9 ~; K- W
  2.   * @brief This function handles USART1 global interrupt.- @8 a' `" K; w9 k  H
  3.   */
    + E, l- O9 E- ?  N; f' s& l
  4. void USART1_IRQHandler(void)
    % f: U7 ?* i2 z
  5. {  G1 W8 x$ v4 `& i
  6.   /* USER CODE BEGIN USART1_IRQn 0 */
    2 E/ Q0 W5 k4 \' a0 Q
  7.   extern void HAL_UART_IdleCallback(UART_HandleTypeDef *huart);
    5 }% A$ y& E$ {# R0 ]% G1 W! I
  8.   HAL_UART_IdleCallback(&huart1);
    8 ]6 L+ x. B4 R  B5 C" p* D  U
  9.   /* USER CODE END USART1_IRQn 0 */% P8 H. l& K1 K: h' D
  10.   HAL_UART_IRQHandler(&huart1);+ W/ K  q: @+ j* `+ k( v
  11.   /* USER CODE BEGIN USART1_IRQn 1 */
    * [1 h+ V5 x9 z9 T
  12. 8 o7 U1 t6 H& L8 z  d/ }1 l! j
  13.   /* USER CODE END USART1_IRQn 1 */. d4 g5 x! ?$ g* i' Q0 Y
  14. }
复制代码
3.初始化如下
4 J2 g! d9 J6 u9 D, Z" }7 F
  1.   Y9 ^  Y+ @  s+ m: R
  2. uint8_t rx_buffer[256];4 w, x6 g7 V& G2 v: B! D, ]( v* b
  3. 6 [2 e1 w# Z+ _" c, J, }
  4.   HAL_UART_Receive_DMA(&huart1,rx_buffer,sizeof(rx_buffer));
    + G7 Z# w5 `/ t4 h
  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
谢谢分享$ D# d; c5 ~! d" s
rayan19890804 回答时间:2020-9-23 08:31:18
这个好
Ankky 回答时间:2020-9-24 08:53:05
jeffhe1 发表于 2019-6-13 17:131 @% Y- `+ E; b% Z) \0 [
Ringbufer 也可以直接生成 , 真是越來越方便了

3 k& v, n0 J4 V# ^1 b大神,环形队列怎么自动生成?
jeffhe1 回答时间:2020-9-24 09:05:50
caoenq 发表于 2020-9-24 08:53& c# d: x0 p3 x/ T3 \- o1 E3 O$ ?
大神,环形队列怎么自动生成?
* Q/ t: Q2 Y! v- q" f1 \. ?' |
帖子上不是有說明如何勾選 ? 如何生成 ?

所属标签

相似分享

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