RT-Thread Studio学习(十八)ADC+TIM+DMA
- 一、简介
- 二、新建RT-Thread项目并使用外部时钟
- 三、启用ADC
- 四、修改代码
- 五、测试
一、简介
本文将基于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_ADC3
在.\cubemx\Inc\stm32f4xx_hal_conf.h
中使能宏定义:
#define HAL_ADC_MODULE_ENABLED
- 复制ADC初始化函数
双击RT-Thread Studio工程中的cubemx.ioc文件,使能ADC3,具体如下图:
ADC3的4个模拟输入分别对应引脚PC0、PC1、PC2和PC3。
ADC3的参数设置如下图:
DMA的参数设置如下:
ADC3使用TIM3进行触发,TIM3的配置如下:
四、修改代码
在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_Stream0_IRQHandler(void)
{/* USER CODE BEGIN DMA2_Stream0_IRQn 0 */rt_interrupt_enter();/* USER CODE END DMA2_Stream0_IRQn 0 */HAL_DMA_IRQHandler(&hdma_adc3);/* USER CODE BEGIN DMA2_Stream0_IRQn 1 */rt_interrupt_leave();/* USER CODE END DMA2_Stream0_IRQn 1 */
}/*** ADC转换完成回调函数*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if( hadc == &hadc3){HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_2);uint32_t adcValue=0, Volt;for(uint8_t i=0; i<4;i++){// The buffer contains the conversion results of 4 channels.adcValue=buffer[i];Volt=3300*adcValue;Volt=Volt>>12;rt_kprintf("ADC[%d] = %ld.%03ld\r\n",i,Volt/1000,Volt%1000 );}}
}void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
{rt_kprintf("HAL_ADC_ErrorCallback.");
}
在main
函数中添加代码:
int main(void)
{
...MX_GPIO_Init();MX_DMA_Init(); // DMA初始化必须要在前面MX_ADC3_Init();MX_TIM3_Init();HAL_ADC_Start_DMA(&hadc3, buffer, 4); // Start ADC3, DMA modeHAL_TIM_Base_Start(&htim3); // Start TIM3
...
}
五、测试
将引脚PC1和3V3短接,运行结果如下:
PE2作为调试引脚,用逻辑分析仪观察结果如下:
间距为2.968s,与TIM3设定的参数吻合。