基于RT-Thread(RTT)的HAL库+ADC+DMA多通道采集

前言

在使用到RTT的ADC设备框架进行AD的多通道采集时,发现数据会跳变,觉得可能是没有加DMA的缘故,但RTT好像没有对应的DMA接口函数(或者我没找到),故尝试不使用RTT的ADC设备框架,直接使用HAL库对ADC进行DMA的配置


一、创建工程

在这里插入图片描述

二、打开CubeMX进行配置

在这里插入图片描述

三、使用外部高速时钟

在这里插入图片描述

四、配置调试下载接口

在这里插入图片描述

五、打开异步串口一,因为创建工程的时候默认使用了串口一,所以这里进行配置

在这里插入图片描述

六、配置ADC,开启ADC转换通道

在这里插入图片描述

七、打开ADC的DMA模式

在这里插入图片描述

八、选择ADC1

在这里插入图片描述

九、选择DMA的模式,DMA的模式有两种:Normal(普通)和Circular(循环)。

在Normal模式下,DMA传输将在传输完指定的数据量后停止。这意味着当DMA传输完成后,它需要重新配置和启动以进行下一次传输。Normal模式适用于需要一次性传输固定数量数据的情况。

相比之下,Circular模式下的DMA传输会循环执行,不会停止。当传输完成后,DMA会立即重新开始传输,无需重新配置和启动。这种模式适用于需要连续传输数据的情况,例如音频流或连续的数据采样。
在这里插入图片描述

十、配置时钟,直接拉满

在这里插入图片描述

十一、生成代码

在这里插入图片描述

十二、将如下CubeMX生成的代码均进行一一复制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十三、将上面复制的代码均一一粘贴到board.c的末尾

在这里插入图片描述

十四、在board.c文件的前面,加上这两句

在这里插入图片描述

十五、将CubeMX生成的这段代码进行注释

在这里插入图片描述

十六、编译一下,无报错

在这里插入图片描述

十七、把board.c文件中的这两个函数前面的static关键字去掉

在这里插入图片描述

十八、在board.c的ADC1初始化中,将每个Rank添加对应的通道,这里CubeMX默认生成的只有通道0,如果你不自己添加,待会你读出来的值全是一样的,因为所有Rank都对应到通道0去了

在这里插入图片描述

十九、在主函数中写入如下代码

/*
 * Copyright (c) 2006-2024, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-01-26     RT-Thread    first version
 */

#include <rtthread.h>

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

extern ADC_HandleTypeDef hadc1;
rt_uint16_t adc_val[4]={0};            //adc采样值

int main(void)
{
    MX_DMA_Init();
    MX_ADC1_Init();


    HAL_NVIC_DisableIRQ(DMA1_Channel1_IRQn); //禁用DMA通道1中断


     while (1)
    {

         HAL_ADC_Start_DMA(&hadc1, (rt_uint32_t*) &adc_val, 4);  //启动ADC1的DMA转换,将转换结果存贮到AD_Value的数组里

         //打印输出
         rt_kprintf("%d,%d,%d,%d\n", adc_val[0], adc_val[1], adc_val[2], adc_val[3]);




        rt_thread_mdelay(50);

    }


}

二十、编译一下,无报错

在这里插入图片描述

二十一、我采集的是遥控器遥感的数据,经测试,数据正确。

在这里插入图片描述

二十二、值得一提的是,这里的禁用DMA通道1的中断,看起来好像不太对,按理说应该开启DMA中断才对呀,数据转换完成触发中断进行处理,我是这么想的,不过经过实测,如果把这句代码注释掉,程序就会卡死,也就说如果不禁用这个中断,程序就会卡死,我暂时也不知道为什么,在此记录一下

在这里插入图片描述

  • 43
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

先睡个好觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值