HAL库STM32G0单通道ADC采样DMA传输定时器TIMER触发

这是一个能让你解放双手的ADC采样配置。因为你只需要在程序开始的时候配置好定时器、DMA、ADC,剩下的,就等着采集完成后在中断中处理AD相关数据就行了。 前面也写过STM32的基于DMA的AD转换功能,但不够完善。

STM32的ADC采样功能一直很强大,它又引入了DMA,同时定时器还能做为ADC开始转换的触发源,不得不说,真的好使!当然了,其它家的cotex-m核的MCU也有类似功能,这里只是以ST的芯片为例,做为演示。

本文实现的AD功能为:通过定时器每隔一段时间,自动触发ADC转换,并通过DMA自动把转换后的值存入某变量或数组,存储完成后触发中断。接下来说一下具体的配置和代码,以及调试时的注意事项。

一、创建工程

使用STM32CubeMX创建工程,芯片选择STM32G030F6Px。创建后,使能下载调试接口:SW。

二、时钟树配置

STM32G030系列,在使用内部RC做为时钟源的情况下,最高可以运行在64MHZ。这里,我们选择内部RC做为时钟源,默认16MHZ,然后使用PLL倍频使其达到64MHZ。

三、配置定时器3

如图所示,这里对定时器的时钟源(我们要用64MHZ)做了640分频,分频后频率为100KHZ。计数周期2000,在100KHZ频率下对应20ms。下面的:

Triger Event Selection TRGO :Update Event

表示,每次TIMER3计数溢出更新时,做为一个触发事件。

注意:这里虽然用到了定时器中断,但是TIM3中的NVIC Settings中的中断可以使能,也可以不使能。个人测试,都能实现效果。

四、ADC采样配置

4.1 DMA配置

这里使用ADC1的通道0来采集数据,使能通道0后,先把DMA功能打开。模式为循环,数据宽度为半字:Half Word。其它的,没什么要改的。如下图所

### STM32 HAL定时器中断触发ADC数据采集 #### 配置环境与初始化设置 为了实现STM32H7系列微控制器利用HAL通过定时器中断触发ADC进行数据采集,首先需要完成基本的硬件抽象层(HAL)初始化工作。这包括但不限于时钟配置、GPIO引脚定义以及相关外设(如TIMx, ADCy)的基础设定。 对于具体的定时器ADC的选择取决于实际应用需求,在此假设使用`TIM1`作为触发源,并且采用`ADC1`执行模拟信号转换操作[^1]。 ```c // 初始化全局变量用于存储ADC采样的结果 uint32_t uhADCxConvertedValue[NUMBER_OF_CHANNELS]; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); /* ADC Initialization function */ static void MX_TIM1_Init(void); /* TIM1 Initialization function */ int main(void){ HAL_Init(); SystemClock_Config(); // 设置系统时钟 MX_GPIO_Init(); // GPIO初始化 MX_ADC1_Init(); // ADC初始化 MX_TIM1_Init(); // 定时器初始化 // 启动ADC并准备DMA传输 if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)uhADCxConvertedValue, NUMBER_OF_CHANNELS) != HAL_OK){ Error_Handler(__FILE__, __LINE__); } // 开启定时器更新事件以触发ADC转换 HAL_TIM_Base_Start_IT(&htim1); while (1){} } ``` 上述代码片段展示了如何启动基于DMA的数据传输机制来处理来自ADC的结果数组`uhADCxConvertedValue[]`,并通过调用`HAL_TIM_Base_Start_IT()`函数使能定时器溢出中断服务程序(ISR),从而间接驱动ADC开始新一轮的测量过程[^2]。 #### 实现细节说明 - **定时器配置**:当计数达到预设的最大值后会产生一次上溢/下溢事件,进而激活相应的ISR;在此期间如果已经设置了自动重装载,则会立即重新加载周期数值继续计数。 - **ADC配置**:需指定输入通道数量(`NUMBER_OF_CHANNELS`)及其对应的物理连接端口(PA0~PAxx), 并确保这些参数正确无误地传递给底层驱动逻辑以便后续读取真实世界中的电信号强度变化情况。 - **DMA支持**:借助于直接内存访问(DMA)技术可以显著减少CPU占用率的同时提高效率——每当有新的样本被成功获取之后都会自动转移到预先分配好的缓冲区内等待进一步分析或显示出来[^3]. #### 中断服务例程 下面给出的是一个简单的定时器中断回调函数模板: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ static uint8_t counter = 0; if(htim->Instance==TIM1){ // 当前仅考虑单次触发的情况; 若希望连续多次则移除条件判断语句即可. if(counter++ == 0){ // 手动触发ADC转换 HAL_ADC_Start(&hadc1); // 或者更推荐的方式是在MXCube中勾选"Timer Triggered Conversion" // 这样就不必在这里显式调用了 }else{ counter=0; } } } ``` 这段代码实现了每当中断发生时,首次进入该ISR将会尝试发起一轮完整的ADC扫描动作,而后的次数则保持不变直到下一个完整的时间间隔到来为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值