STM32Cube学习笔记-ADC_DMA调试

    ADC是模拟信号采样,将模拟信号转换为数字信号。使用过ADC采样的都知道,ADC采样包括的内容很多,包括什么通道啦,中断啊,采样周期啦,采样模式啦,不规则采样啦,连续采样啦,不连续采样啦,扫描啦等等这些,还要涉及到DMA通道这些,真的很多的内容。我的能力有限,只能说一些自己知道的东西。

    本文章要完成的目标:

    1.一路通道的数据ADC采样,把数据采样结果打印到串口调试助手上;

    2.使用ADC中断的形式。ADC转换结束进入中断函数;

    3.使用ADC_DMA的方式,把数据采样结果打印到串口调试助手上。

    硬件:野火STM32F429挑战者开发板;软件:STM32Cube MX、Keil 5、串口调试助手。

    咱们先去配置STM32Cube MX,查到开发板使用的ADC采样引脚为PC3。

然后开始配置STM32Cube的ADC,本文基于本博客的上一篇文章《STM32Cube学习笔记-CAN通讯调试》进行开发。

看这个配置图,左边,PC3选择的是ADC1,选择的是IN13.参数设置:首先是独立模式;时钟频率默认;STM32F4的adc转换进行的是12位转换,选择右对齐;Scan模式禁止,因为只有一路转换所以就不需要Scan,选择连续转换模式,现在没有使能DMA,转换通过为1路,转换由软件触发,没有不规则采样的情况。配置成这样生成代码,我们去看代码。

和之前的程序相比,只是多了一个MX_ADC1_Init();

我们去查看库函数。

我找到很多的函数,包括初始化函数、启动停止函数,有关中断的函数、有关DMA的函数、获取ADC结果的函数、还有一些回调函数。

那么根据经验我们先去main函数的初始化中启动ADC函数,然后把转换结果放到一个中间变量里,尝试一下可不可以转换。

然后打印的结果是一个定值,当我旋转电位器采样值不变,说明失败了。

然后考虑了是不是应该采样一次启动一次,采样结束然后停止,然后修改了while循环中的语句。

结果是变化的,说明采样正确,第一步完成!

第二步,ADC中断,当完成一次ADC采样后,将LED灯闪烁一次。

我们配置了ADC的全局中断,然后生成代码分析。

在stm32f4xx_it.c文件中找到了void ADC_IRQHandler(void)。

我们去找HAL_ADC_IRQHandler()函数。

找到了这样一句,转换完成后的回调函数,也是一个以__weak开头的函数,我们直接在main中重写这个函数。

现在初始化中开启中断。

让LED灯闪烁起来。

编译下载后LED灯开始闪烁,闪烁的频率和ADC结果打印的频率相同,说明现在是采样一次进一次中断。

第三步是通过STM32CubeMX配置ADC_DMA。

有关DMA的知识请自行从CSDN上学习,很多大佬介绍的非常非常详细。

生成代码进行分析。

在初始化中多了一个MX_DMA_Init()的函数,其他基本相同,那么在初始化开启ADC的DMA通道。ADC中断保留,while循环的ADC采样删除。

通过试验,只是开启DMA,不关闭是不行的,因此需要和ADC采样相同的操作。

是一个蛮大的值,需要进行转换。

然后在ADC中断函数中,因为定义的是跳变,所以指示灯一直亮着,我怀疑是采样频率太高导致的,修改中断函数,因为LED初始化完成后是点亮的状态,那么设置当进入到中断后熄灭。

试验结果是LED灯熄灭了,证明了设想的正确性。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值