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

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

[复制链接]
byronsong 发布时间:2019-6-13 10:11
本帖最后由 songshiqun2010 于 2019-6-13 12:01 编辑 8 d2 K0 A9 v! V. b1 k2 I7 |7 \' p

  1. 0 m3 f* Y; o, u/ o  B  `' Y
复制代码
1.空闲中断回调函数定义 如下
  1. void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)$ N/ b+ N6 I1 n1 H9 X- C6 c# p
  2. {. I& [  o* x; K" k4 Y# i
  3.   if(huart->Instance == USART1){
    ! i( o( ?2 e! _6 i! R
  4.     if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) ){, v/ a  ^8 x- @* q. i8 F0 o
  5.       uint16_t rx_buffer_len,i;
    ; x1 J6 g2 y; o: c
  6.       __HAL_UART_CLEAR_IDLEFLAG(huart);' ~9 S( d2 s2 |7 o4 c& s
  7.       HAL_UART_DMAStop(huart);
    2 |: ?1 x  X; W6 G
  8.       rx_buffer_len = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx);/ A# I  d9 ?) |6 |* ^, R
  9.       //TO DO:
    ; Z7 ^( Z, G% M6 m
  10.       //将数据(huart->pRxBuffPtr 中 rx_buffer_len个字节)压入环形队列5 p3 e+ o. D/ ]' V+ I8 V
  11.       //这里未做环形队列实现,请自行填充4 C' w  w2 S/ Z8 b. W; P
  12.       HAL_UART_Receive_DMA(huart,huart->pRxBuffPtr,huart->RxXferSize);4 ]+ m1 i. U( x8 \) Y8 X" n
  13.     }! t/ k8 G! @. r1 l6 E/ B8 G: \
  14.   }: `& o' Y4 U# p: N6 J2 W
  15. }
复制代码
( S. W* c, ^7 h( M! P6 c
2.回调函数调用方式如下4 @' ~8 C2 p* |( F
  1. /**& p" r4 R7 m' q" ^
  2.   * @brief This function handles USART1 global interrupt.
    9 z# D/ U( k' z3 _; r$ [. ^
  3.   */3 Z0 v; s6 R+ {) F0 ~
  4. void USART1_IRQHandler(void)
    ' u0 h- N) u( o5 }4 T
  5. {
    + x/ R6 n* L3 Q
  6.   /* USER CODE BEGIN USART1_IRQn 0 */
    7 ~: ^1 e9 W1 k
  7.   extern void HAL_UART_IdleCallback(UART_HandleTypeDef *huart);8 w/ X/ W$ v+ T7 n1 T
  8.   HAL_UART_IdleCallback(&huart1);
    7 Q$ C( s) y. Q, ]
  9.   /* USER CODE END USART1_IRQn 0 */
    * W5 g, }2 S. Z" j2 ^
  10.   HAL_UART_IRQHandler(&huart1);
    # D9 P, I- M" q+ u0 m  z
  11.   /* USER CODE BEGIN USART1_IRQn 1 */
    6 |2 F( q1 e( }- l

  12. , K6 u0 s3 b+ L
  13.   /* USER CODE END USART1_IRQn 1 */
    ( E1 ~  ]3 O* X! l
  14. }
复制代码
3.初始化如下
8 T" z9 y; ~4 U, k( u: F
  1.   W# b5 {* F. z
  2. uint8_t rx_buffer[256];* O( B3 _$ B$ d% h2 s3 q

  3. 4 ]: a. t) f) o" s: T5 Q
  4.   HAL_UART_Receive_DMA(&huart1,rx_buffer,sizeof(rx_buffer));& B9 g* ^# T8 K- s& Z4 K
  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
谢谢分享
9 _5 V, v0 I  ?. E' @
rayan19890804 回答时间:2020-9-23 08:31:18
这个好
Ankky 回答时间:2020-9-24 08:53:05
jeffhe1 发表于 2019-6-13 17:13
; @* {" e% i* g' SRingbufer 也可以直接生成 , 真是越來越方便了

8 W- j, |6 v: S大神,环形队列怎么自动生成?
jeffhe1 回答时间:2020-9-24 09:05:50
caoenq 发表于 2020-9-24 08:53
1 v5 j; y! C& e5 T5 _+ p大神,环形队列怎么自动生成?

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