文章目录
一、ADC简介
TM32F767xx系列有3个ADC,这些ADC可以独立使用,也可以使用双重/三重模式(提高采样率)。STM32F767的ADC是12位逐次逼近型的模拟数字转换器。它有19个通道,可测量16个外部源、2个内部源和Vbat通道的信号。我使用的是STM32F767IGT6。
1、ADC采样频率
不要让ADC的时钟超过36M,否则将导致结果准确度下降。STM32F767的ADC最大工作频率是36Mhz,而ADC时钟(ADCCLK)来自APB2,APB2频率一般是108Mhz,我们设置ADCPRE=01,即4分频,这样得到ADCCLK频率为27Mhz
2、ADC转换时间
ADC的转换时间: 总转换时间(Tcovn)=采样时间+12个周期
例如,当ADCCLK=27Mhz的时候,并设置3个周期的采样时间,则得到:Tcovn=3+12=15个周期=0.55us。
stm32f767的采样时间周期可以在stm32f7xx_hal_adc.h中选择,可以选择3~480个周期的采样时间。如下图所示:
3、ADC寄存器
ADC里面用到的寄存器有很多,常用的有以下几个,具体使用方法就不一一介绍了
4、ADC引脚与外部通道对应关系
二、DMA简介
DMA 全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。
DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。
STM32最多有2个DMA控制器,2个DMA控制器总共有16个数据流(每个控制器8个)。每个DMA控制器都用于管理一个或者多个外设的存储器访问请求。
三、代码配置
1、ADC、DMA初始化配置
我将它们都配置在了adc.c文件中,代码如下所示:
#include "adc.h"
#include "delay.h"
#include "usart.h"
#include "sdram.h"
#include "led.h"
#include "lcd.h"
#define M 8 //定义M
#define N 4
u16 value[N][M];
uint32_t ADC_ConvertedValueRead[4];
uint32_t ADC_ConvertedValue[4];
ADC_HandleTypeDef ADC1_Handler; //ADC句柄
DMA_HandleTypeDef ADC1TxDMA_Handler; //DMA句柄
//初始化ADC
void MY_ADC_Init(void)
{
ADC_ChannelConfTypeDef ADC1_ChanConf;
//GPIO初始化
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_ADC1_CLK_ENABLE();