当前位置: 首页 > news >正文

HAL库DMA框架

介绍HAL库中外设如何与DMA建立连接

外设句柄结构体中包含有DMA句柄,如ADC

typedef struct __ADC_HandleTypeDef {
  // ADC_TypeDef                   *Instance;        /*!< Register base address */
  // ADC_InitTypeDef               Init;             /*!< ADC required parameters */
  DMA_HandleTypeDef             *DMA_Handle;         /*!< Pointer DMA Handler */
  // HAL_LockTypeDef               Lock;             /*!< ADC locking object */
  // __IO uint32_t                 State;            /*!< ADC communication state */
  // __IO uint32_t                 ErrorCode;        /*!< ADC Error code */
}ADC_HandleTypeDef;

DMA句柄中包含中断回调函数的函数指针接口,以及该父对象指针

typedef struct __DMA_HandleTypeDef{
  // DMA_Channel_TypeDef        *Instance;       /*!< Register base address */
  // DMA_InitTypeDef            Init;             /*!< DMA communication parameters */
  // HAL_LockTypeDef            Lock;           /*!< DMA locking object  */
  // __IO HAL_DMA_StateTypeDef  State;               /*!< DMA transfer state  */
  void    *Parent;       /*!< Parent object state    */
  void   (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma);    
  void   (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); 
  void   (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);    
  void   (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); 
  // __IO uint32_t              ErrorCode;            
  // DMA_TypeDef                *DmaBaseAddress;     
  // uint32_t                   ChannelIndex;        
} DMA_HandleTypeDef;

在外设初始化时,会对DMA进行初始化,同时将两者进行关联。这样通过外设句柄就能操作DMA句柄

#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \do                                                               \
    {                                                                \
        (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__);         \
        (__DMA_HANDLE__).Parent = (__HANDLE__);                      \
    } while (0U)
                          
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

在外设启用DMA发送或接收时,收发函数内部会对外设挂载的DMA设置回调函数,而这里使用的函数实体来自于外设预留的、关于DMA中断的回调函数。

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) {// ...    /* Set the DMA transfer complete callback */
    hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
    /* Set the DMA half transfer complete callback */
    hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
    /* Set the DMA error callback */
    hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
    /* Start the DMA channel */
    HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
    
    // ...
}

赋值的回调函数为 ADC_DMAConvCplt ,其内部调用了 HAL_ADC_ConvCpltCallbackHAL_ADC_ConvCpltCallback 才是最后用户需要实现的。

void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma) {
  /* Retrieve ADC handle corresponding to current DMA handle */
  ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;  /* Update state machine on conversion status if not in error state */
  if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA))
  {
    /* Update ADC state machine */
    SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);// ...    /* Conversion complete callback */
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
    hadc->ConvCpltCallback(hadc);
#else
    HAL_ADC_ConvCpltCallback(hadc);
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  }
  else
  {
    /* Call DMA error callback */
    hadc->DMA_Handle->XferErrorCallback(hdma);
  }
}__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  UNUSED(hadc);
}

DMA 中断被启动,并且挂载回调函数后,会在中断中自动运行。

void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
{
  uint32_t flag_it = hdma->DmaBaseAddress->ISR;
  uint32_t source_it = hdma->Instance->CCR;  /* Half Transfer Complete Interrupt management ******************************/
  if (((flag_it & (DMA_FLAG_HT1 << hdma->ChannelIndex)) != RESET) && ((source_it & DMA_IT_HT) != RESET))
  {// ...
    if(hdma->XferHalfCpltCallback != NULL) {
      hdma->XferHalfCpltCallback(hdma); /* Half transfer callback */
    }
  }  /* Transfer Complete Interrupt management ***********************************/
  else if (((flag_it & (DMA_FLAG_TC1 << hdma->ChannelIndex)) != RESET) && ((source_it & DMA_IT_TC) != RESET))
  {
    // ...
    if(hdma->XferCpltCallback != NULL) {
      hdma->XferCpltCallback(hdma);/* Transfer complete callback */
    }
  }  /* Transfer Error Interrupt management **************************************/
  else if (( RESET != (flag_it & (DMA_FLAG_TE1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_TE)))
  {// ...
    if (hdma->XferErrorCallback != NULL) {
      hdma->XferErrorCallback(hdma);/* Transfer error callback */
    }
  }
  return;
}void DMA1_Channel1_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&hdma_adc1);
}
http://www.jsqmd.com/news/31597/

相关文章:

  • 2025 年 11 月电线电缆厂家推荐排行榜,国标电线电缆,中缆电线电缆,工程电线电缆,环保电线电缆,家用电线电缆,工业电线电缆,光伏电线电缆,耐火电线电缆公司推荐
  • 2025 年 11 月清洗机厂家推荐排行榜,全自动/工业/零排放/双溶剂/碳氢/改性醇/真空/全密闭清洗机设备公司精选
  • 2025 年 11 月电线电缆厂家推荐排行榜,电力电缆,控制电缆,通信电缆,阻燃电缆,高压电缆公司推荐
  • 2025 年 11 月电磁阀线圈厂家推荐排行榜,电磁线圈,电磁铁线圈,小型电磁线圈,微型线圈,汽车电磁线圈,车用感应线圈,防爆线圈,防爆电磁线圈,直流电磁线圈,电磁线圈定制公司推荐
  • 2025 年 11 月潜水泵厂家推荐排行榜,新型潜水泵,节能潜水泵,低噪声潜水泵,超低压潜水泵,防爆潜水泵,高压潜水泵,防腐潜水泵公司推荐
  • 2025 年 11 月消杀药剂厂家推荐排行榜,扑灭司林/5%扑灭司林,苯甲酸苄酯/25%苯甲酸苄酯,15%胺氯菊百灭宁,疥螨,阴虱,科灭达公司推荐
  • 2025 年 11 月回信器厂家推荐排行榜,隔爆回信器,阀门回信器,防爆回信器,限位开关回信器,气动阀回信器,气动回信器公司推荐
  • 数据分析流程
  • 2025 年 11 月闭式冷却塔厂家推荐排行榜,工业闭式冷却塔,横流闭式冷却塔,逆流闭式冷却塔,复合流闭式冷却塔公司推荐
  • 2025 年 11 月锅炉厂家推荐排行榜,有机热载体锅炉,导热油锅炉,生物质锅炉,蒸汽锅炉,燃天然气锅炉,热水锅炉公司推荐
  • 每日反思(2025_11_03)
  • 2025 年 11 月高温轴承厂家推荐排行榜,耐高温轴承,不锈钢高温轴承,高速高温轴承,定制高温轴承公司精选
  • 2025 年 11 月清洗机厂家推荐排行榜,高压清洗机,工业清洗机,超声波清洗机,零部件清洗设备公司推荐
  • 2025 年 11 月电缆厂家推荐排行榜,国标电缆/国网南网入围电缆,铜芯/铝合金/光伏/新能源/工业/控制/拖链/橡胶/铠装电缆公司推荐
  • 9.22 未完成的情感投射
  • 20232306 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 2025 年 11 月轮转印刷机厂家推荐排行榜,间歇式轮转印刷机,凸版/胶印/PS版间歇式轮转印刷机,专业印刷设备厂家推荐
  • 2025 年 11 月电磁铁厂家推荐排行榜,直流电磁铁,微型电磁铁,小型电磁铁,防爆电磁铁,比例电磁铁,非标电磁铁定制公司推荐
  • 2025 年 11 月柱塞泵厂家权威推荐榜:高压柱塞泵/液压柱塞泵/气动柱塞泵/电动柱塞泵/小型柱塞泵/超高压柱塞泵/往复式柱塞泵公司精选
  • 大文件上传公共库
  • 2025 年 11 月电磁阀厂家推荐排行榜,高压电磁阀,防爆电磁阀,比例电磁阀,汽车电磁阀,ABS电磁阀,ESP电磁阀,车用ESC电磁阀公司推荐
  • 2025 年 11 月 EVA 厂家推荐排行榜,EVA发泡胶/EVA板材/EVA卷材/EVA片材,防火EVA/阻燃EVA/防静电EVA/去味EVA/高弹EVA/彩色EVA公司推荐
  • 2025 年 11 月控制器厂家推荐排行榜,开关控制器,自动控制器,阀门控制器,智能控制器,限位开关控制器公司推荐
  • 请求库的封装
  • [jupyter]
  • 2025 年 11 月管道泵厂家推荐排行榜,新型管道泵,节能管道泵,低噪声管道泵,超低压管道泵,防爆管道泵,高压管道泵,防腐管道泵,SF管道泵,SFB管道泵,WF屋顶管道泵公司推荐
  • 2025 年 11 月冷却塔厂家推荐排行榜,工业冷却塔,开式冷却塔/钢制开式冷却塔,封闭式冷却塔/密闭式冷却塔,蒸发式冷却塔公司推荐
  • Spring 中的Event机制
  • jiangly模板-字符串
  • Java 内存模型(JMM)中 volatile 的作用与限制