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

  1. 打开ADC驱动框架
    RT-Thread Setting 中借助图形化配置工具打开软件ADC的驱动框架,如下图所示:
    在这里插入图片描述
  2. 定义ADC相关的宏
    board.h文件中使能宏定义:
#define BSP_USING_ADC1
#define BSP_USING_ADC2

.\cubemx\Inc\stm32f4xx_hal_conf.h中使能宏定义:

#define HAL_ADC_MODULE_ENABLED
  1. 复制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短接,运行结果如下:
在这里插入图片描述
示波器观察到的如下:

PE2作为调试引脚,用逻辑分析仪观察结果如下:
对比两者结果,几乎没有相位差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值