6,STM32CubeMX配置ADC+DMA工程

  1,前言

        单片机型号:STM32F407

        编程环境    :STM32CubeMX + Keil v5

        硬件连接    :串口1,ADC1CH5--->PA5

注:本工程在4,STM32CubeMX配置UART串口工程基础上完成。

       本工程在5,STM32CubeMX配置ADC工程基础上完成。

2,STM32CubeMX配置ADC工程

        首先开启ADC1通道5的采样,在Analog(1)下方点击ADC1(2)启用模数转换器1.点击通道IN5(3)开启该通道,此时我们会在(4)位置看到PA5已经设置完成。

        想要配置其他ADC和其他通道请参考下表:

        接下来进行ADC的配置,在Configuration(1)配置下点击Parameter Settings(2)参数设置。修改Resolution(3)采样精度为12bit,也可以选择其他精度。再修改Continuous Conversion Mode(4)点击Enalbe使能,启动连续采样功能。

3,STM32CubeMX配置ADC的DMA

       继续进行进行ADC+MDA的配置,在Configuration配置下点击Parameter Settings参数设置,再DMA Continuous Requests(1)勾选Enable,使能DMA传输。

        在Configuration(1)配置下点击DMA Settings(2)进行DMA参数设置。添加新的DMA传输Stream流,如图(3)中标注。

4,STM32HAL库常用ADC函数

1,启动 ADC 转换函数HAL_ADC_Start。输入量hadc为ADC句柄。

/**
  * @brief 启用 ADC 并开始转换常规通道。
  * @param指向 ADC_HandleTypeDef 结构的 hadc 指针,其中包含
  * 指定 ADC 的配置信息。
  * @retval HAL 状态
  */
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)

2,轮询常规转换完成函数HAL_ADC_PollForConversion。输入量hadc为ADC句柄,输入量Timeout为超时时间。

/**
  * @brief 轮询常规转换完成
  * @note ADC 转换标志 EOS(序列结束)和 EOC(序列结束
  * conversion) 被此功能清除。
  * @param指向 ADC_HandleTypeDef 结构的 hadc 指针,其中包含
  * 指定 ADC 的配置信息。
  * @param Timeout Timeout(超时)值(以毫秒为单位)。 
  * @retval HAL 状态
  */
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)

3,ADC获取结果函数HAL_ADC_GetValue。输入量hadc为ADC句柄。

/**
  * @brief 从常规通道的数据寄存器中获取转换值。
  * @param指向 ADC_HandleTypeDef 结构的 hadc 指针,其中包含
  * 指定 ADC 的配置信息。
  * @retval 换算值
  */
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)

4,DMA方式启动ADC采样函数HAL_ADC_Start_DMA。输入量hadc为ADC句柄,输入量pData为内存地址,输入量Length为传输的数据长度。

/**
  * @brief 在最后一次传输后启用 ADC DMA 请求(单 ADC 模式)并启用 ADC 外设 
  * @param指向 ADC_HandleTypeDef 结构的 hadc 指针,其中包含
  * 指定 ADC 的配置信息。
  * @param pData 目标 Buffer 地址。
  * @param长度 要从 ADC 外设传输到内存的数据长度。
  * @retval HAL 状态
  */
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc、uint32_t* pData、uint32_t Length)

5,编程实战

       首先先增加两个变量。

/* USER CODE BEGIN PV */
uint16_t ADC_Value[100]={0};
float Volt;
/* USER CODE END PV */

        接着编写while(1)循环中的内容如下。

  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 100);
		for(uint8_t i=0;i<100;i++)
		{
			Volt = ((float)(ADC_Value[i]*3.3))/4096;
			HAL_Delay(20);
			printf("A:%1.2f\r\n",Volt);
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

        编译后运行烧录,结果如下。

### 使用 STM32CubeMX 配置 ADC 进行多次采样并使用 DMA 传输 #### 准备工作 为了实现通过DMA进行ADC多次采样的配置,在STM32CubeMX软件中需完成如下设置: - 打开STM32CubeMX工具,创建新项目并选择合适的MCU型号。 - 在Pinout & Configuration界面找到并展开“Analog”选项卡下的ADC模块。 #### ADC参数设定 对于希望使用的ADC通道(例如`ADC1_IN1`),应将其状态设为启用,并调整相应的采样时间以满足精度需求[^3]。此外,还需特别注意以下几点来支持多通道及DMA功能: - **Channel Selection**: 根据实际硬件连接情况挑选参与测量的模拟输入端口。 - **Sampling Time**: 合理规划各通道间的转换间隔,确保获得稳定可靠的读数。 - **Scan Conversion Mode**: 开启此模式允许连续遍历所有选定的通道执行A/D变换操作[^2]。 #### DMA控制器初始化 为了让DMA能够自动处理来自ADC的数据流,必须正确地配置DMA资源: - 寻找RCC时钟树中的DMA外设开关,开启对应实例的服务权限。 - 设置好目标存储区地址、每次传输单元数量以及方向等属性;这里建议采用循环缓冲机制以便于后续编程逻辑简化。 - 将DMA请求映射到特定事件上——比如每当一次完整的序列扫描结束之后触发一次DMA事务提交动作[^4]。 #### 中断服务程序编写 尽管主要依靠DMA搬运数据,但仍有必要定义ISR用于监控整个过程的状态变化或是响应异常状况的发生。可以考虑利用HAL库提供的API函数快速搭建框架结构,如下面这段伪代码所示: ```c void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ /* 当前批次全部样本均已就绪 */ } ``` 以上即完成了基于STM32CubeMX平台下针对ADC-DMA联合工作的基本环境构建流程概述[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值