【STM32F4】HAL库 CubeMX(十四)--------ADC实验

本文围绕STM32F4系列的ADC展开,介绍了其有3个可独立或双重/三重模式使用的ADC,是12位逐次逼近型模拟数字转换器,有19个通道。还阐述了ADC转换分组,包括规则通道组和注入通道组。此外,进行了ADC实验,涵盖所需配置功能、功能配置、时钟配置及代码生成等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

STM32F4xx 系列一般都有 3 个 ADC,这些 ADC 可以独立使用,也可以使用双重/三重模式(提高采样率)。STM32F4 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 19 个通道,可测量 16 个外部源、2 个内部源和 Vbat 通道的信号。这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

一、ADC是什么?

STM32F407ZGT6 包含有 3 个 ADC。STM32F4 的 ADC 最大的转换速率为 2.4Mhz,也就是转换时间为 0.41us(在 ADCCLK=36M,采样周期为 3 个 ADC 时钟下得到),不要让 ADC 的时钟超过 36M,否则将导致结果准确度下降。
STM32F4 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。

二、ADC实验

1.实验所需配置功能

1、ADC1的通道5(PA5)
2、串口发送电压值(可用LCD显示或者OLED显示)

2.功能配置

1、选择ADC1,通道5并且配置PA5的模式。
在这里插入图片描述
在这里插入图片描述
2、配置ADC1的相关参数(初学阶段可以看着原子的配置一一配置)
在这里插入图片描述
在这里插入图片描述
3、配置串口(如有不懂的请看串口那一节,此处不配置)

3.时钟配置

RCC时钟配置如前文一样(此处一般情况是不变的)。
【STM32F4】HAL库 CubeMX(一)--------创建工程(点亮LED)

4.生成代码

在这里插入图片描述

uint16_t ADC_Value;

在这里插入图片描述

HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
	ADC_Value = HAL_ADC_GetValue(&hadc1);
	printf("PA5 True Voltage value : %.4f \r\n",ADC_Value*3.3f/4096);
	HAL_Delay(500);
}

代码注释就不写了(太难打了),大家可以对应库函数实验代码进行理解。有问题也可以在评论里提出来。一起解决,如果以上有误请提出来,谢谢


总结

大家可以试试其他ADC和通道,也可以获取指定引脚的电压转换值哦。
在这里插入图片描述

### STM32 HAL中DMA的使用教程及错误排查 #### DMA的基础概念 直接内存访问(Direct Memory Access, DMA)是一种硬件机制,允许外部设备与存储器之间或者存储器与存储器之间的数据传输不经过CPU干预[^1]。通过这种方式可以显著提高系统的效率并减少CPU负载。 #### 初始化DMA控制器 在STM32 HAL中,初始化DMA控制器通常涉及配置DMA通道、方向、优先级以及数据宽度等参数。以下是典型的DMA初始化过程: ```c // 创建DMA句柄 DMA_HandleTypeDef hdma; void MX_DMA_Init(void) { __HAL_RCC_DMA2_CLK_ENABLE(); // 启用DMA时钟 hdma.Instance = DMA2_Stream0; // 配置使用的DMA流 hdma.Init.Channel = DMA_CHANNEL_0; // 设置DMA通道 hdma.Init.Direction = DMA_PERIPH_TO_MEMORY; // 数据传输方向 hdma.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址固定不变 hdma.Init.MemInc = DMA_MINC_ENABLE; // 存储器地址自动增加 hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // 外设数据对齐方式 hdma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; // 存储器数据对齐方式 hdma.Init.Mode = DMA_CIRCULAR; // 循环模式 hdma.Init.Priority = DMA_PRIORITY_HIGH; // 高优先级设置 if (HAL_DMA_Init(&hdma) != HAL_OK) { // 初始化DMA Error_Handler(); } } ``` 上述代码展示了如何配置一个用于循环缓冲区操作的DMA实例。 #### 堆栈溢出问题及其解决方案 当编写复杂的嵌入式应用程序时,可能会遇到堆栈溢出的情况,这可能导致程序运行不稳定甚至崩溃。如果发现程序无明显逻辑错误却频繁卡死或出现其他异常现象,则应考虑是否存在堆栈空间不足的问题[^3]。可以通过调整向量表偏移量来增大可用堆栈大小;另外,在定义局部变量尤其是大型数组时要格外小心,尽量将其声明为全局变量或将它们分配到动态内存区域以规避潜在风险。 #### 结合ADC实现高速采样 为了利用DMA技术提升模数转换速度,需先完成相应外设资源准备动作后再启动两者联动工作流程。下面给出一段关于启用ADC并通过DMA读取结果寄存器内容的例子: ```c ADC_HandleTypeDef hadc; uint16_t adcValue[NUMBER_OF_CHANNELS]; void Start_ADC_DMA_Conversion(ADC_HandleTypeDef* hadc, uint16_t* pData, uint32_t Length){ if(HAL_ADC_Start_DMA(hadc, (uint32_t*)pData, Length)!= HAL_OK){ /* Conversion start error */ Error_Handler(); } } int main(){ ... MX_ADC_Init(); // ADC初始化函数调用 MX_DMA_Init(); // DMA初始化函数调用 Start_ADC_DMA_Conversion(&hadc, adcValue, NUMBER_OF_CHANNELS); while (1){ // 主循环处理其它任务... } } ``` 此部分演示了怎样借助于之前提到过的DMA功能加速来自模拟输入端口的数据采集进程。 #### 注意事项 - 确认所选DMA请求映射至目标外设上。 - 正确设定源/目的地址增长属性以防越界访问。 - 对中断事件做出适当响应以便及时获取最新状态更新信息。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值