STM32标准库中DMA配置详解 (标准库版)

写博客Mark下自己对STM32中DMA功能的一些分析:首先,我们来看下DMA寄存器映像和复位表:          我们首先来对上面这张表进行下分析:          先看下左侧的偏移地址,偏移地址是相对于DMA1_BASE的相对地址。查表可得DMA1_BASE的实际物理地址是:0x4002 0000 .故我们可以得出这些寄存器的实际地址是什么。实际上我们对寄存
摘要由CSDN通过智能技术生成

  写博客Mark下自己对STM32中DMA功能的一些分析: 

        先看上图中下左侧的偏移地址,偏移地址是相对于DMA1_BASE的相对地址。查表可得DMA1_BASE的实际物理地址是:0x4002 0000 .故我们可以得出这些寄存器的实际地址是什么。实际上我们对寄存器配置的时候也是对这几个寄存器值进行修改。


  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于STM32微控制器的标准库配置ADC DMA可通过以下步骤完成: 1. 启用ADC和DMA模块:确保已在CubeMX或者HAL库启用ADC和DMA模块,并正确配置它们的时钟。 2. 配置ADC:使用`HAL_ADC_Init()`函数初始化ADC,并使用`HAL_ADC_ConfigChannel()`函数配置ADC通道。确保设置正确的采样时间、转换分辨率和触发模式。 3. 配置DMA:使用`HAL_DMA_Init()`函数初始化DMA,并使用`HAL_DMA_ConfigChannel()`函数配置DMA通道。设置数据传输方向、数据大小和内存地址等参数。 4. 配置ADC DMA请求:使用`HAL_ADC_Start_DMA()`函数启动ADC DMA请求。此函数将触发DMA传输并开始连续的ADC转换。 下面是一个简单的示例代码,演示了如何进行ADC DMA配置: ```c #include "stm32f4xx_hal.h" #define ADC_BUFFER_SIZE 100 ADC_HandleTypeDef hadc; DMA_HandleTypeDef hdma_adc; uint32_t adc_buffer[ADC_BUFFER_SIZE]; void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { /* 配置ADC时钟和DMA */ __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE(); hdma_adc.Instance = DMA2_Stream0; hdma_adc.Init.Channel = DMA_CHANNEL_0; hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc.Init.MemInc = DMA_MINC_ENABLE; hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_adc.Init.Mode = DMA_CIRCULAR; hdma_adc.Init.Priority = DMA_PRIORITY_HIGH; hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE; HAL_DMA_Init(&hdma_adc); __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc); } void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) { /* 禁用ADC和DMA时钟 */ __HAL_RCC_ADC1_CLK_DISABLE(); HAL_DMA_DeInit(hadc->DMA_Handle); } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { /* 在此处理ADC转换完成的数据 */ } int main(void) { HAL_Init(); /* 配置ADC和DMA */ hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.NbrOfConversion = 1; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; HAL_ADC_Init(&hadc); HAL_ADC_Start_DMA(&hadc, (uint32_t*)adc_buffer, ADC_BUFFER_SIZE); while (1) { /* 在此处执行其他任务 */ } } ``` 你可以根据具体的需求进行修改和扩展。这只是一个简单的示例,仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值