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

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

[复制链接]
byronsong 发布时间:2019-6-13 10:11
本帖最后由 songshiqun2010 于 2019-6-13 12:01 编辑
9 x) |0 s+ i0 Z, B$ A

  1. 3 ^( v# ^% x4 F3 _
复制代码
1.空闲中断回调函数定义 如下
  1. void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)5 @3 k7 \$ v) Q) `
  2. {
    1 z, U% j3 F) V4 l
  3.   if(huart->Instance == USART1){
    - Q* }8 ]$ }' Y! d
  4.     if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) ){9 A3 x' ~) m6 _: J+ C! m- J4 K. @2 t) O
  5.       uint16_t rx_buffer_len,i;" x. \! O: M+ c$ U  g
  6.       __HAL_UART_CLEAR_IDLEFLAG(huart);
    ' Y$ X- ~" r8 Y* J
  7.       HAL_UART_DMAStop(huart);
    " Z9 `, C( K  f" v- B
  8.       rx_buffer_len = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx);) T7 f) F1 S7 ~5 W5 k
  9.       //TO DO:3 a# W- R" k: X# V
  10.       //将数据(huart->pRxBuffPtr 中 rx_buffer_len个字节)压入环形队列) |; g* `( x0 }; a8 ~
  11.       //这里未做环形队列实现,请自行填充
    ( l2 q! J% m" a" K; u3 }( T+ t% d
  12.       HAL_UART_Receive_DMA(huart,huart->pRxBuffPtr,huart->RxXferSize);( z2 o" M4 a. F- F
  13.     }
    . b! y6 V) h; {: b2 _# ]1 _
  14.   }
    ! U% L7 Y4 I) }6 ?# O! c, W
  15. }
复制代码
& V- @* R& a2 W! ~9 \, u, ^$ w0 \+ Y
2.回调函数调用方式如下
2 ~! V& V/ l5 _$ a1 M
  1. /**
    2 X" c9 `; d8 s7 J1 W
  2.   * @brief This function handles USART1 global interrupt.) w7 ?* e- q& \6 m* k0 H
  3.   */: W+ W( t; |( I9 l+ F( |) e
  4. void USART1_IRQHandler(void)% p' m. b8 b/ ]$ O. L
  5. {
    ) ]0 {9 j* T; Y- k
  6.   /* USER CODE BEGIN USART1_IRQn 0 */& t. ~; x$ a- P+ b. g
  7.   extern void HAL_UART_IdleCallback(UART_HandleTypeDef *huart);
    " @( x6 M" ?, _# h0 _# g
  8.   HAL_UART_IdleCallback(&huart1);
    9 n9 i2 U; l: c, S$ x) |
  9.   /* USER CODE END USART1_IRQn 0 */  x' v7 ?; ^9 d0 T% N
  10.   HAL_UART_IRQHandler(&huart1);; t, ~  l- X  d) Q5 C" k
  11.   /* USER CODE BEGIN USART1_IRQn 1 */
    * G. U4 M( b- k

  12. 5 g+ f) _/ x* K& y; C" X
  13.   /* USER CODE END USART1_IRQn 1 */
    9 h- \: e- B9 E+ W+ i, y
  14. }
复制代码
3.初始化如下3 o( Z2 f1 F, N0 C

  1. # \% o! g5 h) o8 K2 y! G  Z8 j: z
  2. uint8_t rx_buffer[256];$ g, b2 D: v0 L1 S' j4 \6 \- a- D

  3. 2 m. y8 t- |5 }
  4.   HAL_UART_Receive_DMA(&huart1,rx_buffer,sizeof(rx_buffer));# q8 _7 @3 N# }9 M" f/ Q
  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
谢谢分享) p' o% p4 i4 N2 Q& l
rayan19890804 回答时间:2020-9-23 08:31:18
这个好
Ankky 回答时间:2020-9-24 08:53:05
jeffhe1 发表于 2019-6-13 17:13
, j9 h, g' b- k- pRingbufer 也可以直接生成 , 真是越來越方便了

3 [) Q4 k0 o; ^- k* t0 b/ q8 a" `大神,环形队列怎么自动生成?
jeffhe1 回答时间:2020-9-24 09:05:50
caoenq 发表于 2020-9-24 08:53; [3 K7 ]2 |" y$ a# w
大神,环形队列怎么自动生成?
* P& ?- w! M4 S- ]6 B1 X
帖子上不是有說明如何勾選 ? 如何生成 ?

所属标签

相似分享

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