前言
在使用到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);}}