RT-Thread Studio学习(十九)双通道同步ADC+TIM+DMA
一、简介
本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用ADC设备。硬件及开发环境如下:
- OS WIN10
- STM32F407VET6
- STM32CubeMX v6.10.0
- STM32Cube MCU Package for STM32F4 Series v1.28.2
- RT-Thread Studio v2.2.9
- RT-Thread Source Code v5.1.0
- STM32F4 chip support packages v0.2.3
二、新建RT-Thread项目并使用外部时钟
打开RT-Thread Studio软件新建基于芯片的项目,并使用外部时钟系统,具体参见《RT-Thread Studio学习(一)使用外部时钟系统》。
三、启用ADC
- 打开ADC驱动框架
在RT-Thread Setting
中借助图形化配置工具打开软件ADC的驱动框架,如下图所示:
- 定义ADC相关的宏
在board.h
文件中使能宏定义:
#define BSP_USING_ADC1
#define BSP_USING_ADC2
在.\cubemx\Inc\stm32f4xx_hal_conf.h
中使能宏定义:
#define HAL_ADC_MODULE_ENABLED
- 复制ADC初始化函数
双击RT-Thread Studio工程中的cubemx.ioc文件,使能ADC1和ADC2,具体如下图:
对应的DMA设置为:
ADC2的设置为:
对应DMA的设置为:
ADC1的模拟输入对应引脚PB0,ADC2的模拟输入对应PA2。
ADC1和ADC2使用TIM8进行触发,其配置如下:
四、修改代码
在Sconscript中添加如下代码,可以省去将HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)
等函数复制到board.c
的步骤。
src = Split('''
Src/stm32f4xx_hal_msp.c
Src/main.c
Src/gpio.c
Src/tim.c
Src/adc.c
Src/dma.c
修改main.c
文件,添加DMA中断等相关函数
extern TIM_HandleTypeDef htim3;
extern ADC_HandleTypeDef hadc3;
void DMA2_Stream4_IRQHandler(void)
{
/* enter interrupt */
rt_interrupt_enter();
HAL_DMA_IRQHandler(&hdma_adc1);
/* leave interrupt */
rt_interrupt_leave();
}
void DMA2_Stream2_IRQHandler(void)
{
/* enter interrupt */
rt_interrupt_enter();
HAL_DMA_IRQHandler(&hdma_adc2);
/* leave interrupt */
rt_interrupt_leave();
}
/**
* ADC转换完成回调函数
*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
if( hadc == &hadc1)
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_1);
HAL_TIM_Base_Stop(&htim8);
// 在此添加发送数据代码
HAL_TIM_Base_Start(&htim8);
}
}
void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
{
rt_kprintf("HAL_ADC_ErrorCallback.");
}
在main
函数中添加代码:
int main(void)
{
...
MX_GPIO_Init();
MX_DMA_Init(); // DMA初始化必须要在前面
MX_ADC1_Init();
MX_ADC2_Init();
MX_TIM8_Init();
HAL_ADCEx_MultiModeStart_DMA(&hadc1, databuffer,40000); // 低16位为ADC1的采样结果
HAL_ADCEx_MultiModeStart_DMA(&hadc2, databuffer,40000); // 高16位为ADC2的采样结果
HAL_TIM_Base_Start(&htim8); // 一定要在ADC开启后在开启触发
...
}
五、测试
将引脚PB0和PA5短接,引脚PA2和PA6短接,运行结果如下:
示波器观察到的如下:
对比两者结果,几乎没有相位差。