1.ADC概念
ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器
2 STM32各系列ADC的主要特性
3.F4框图
4.转换序列与转换时间
A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组)
规则组最多可以有16个转换,注入组最多有4个转换
4.1规则组和注入组执行优先级对比
4.2转换时间
5.触发源
6.中断
7.单次转换模式和连续转换模式与扫描模式
单次转换模式和连续转换模式
扫描模式
8 结构体
typedef struct
{
ADC_TypeDef Instance; / ADC 寄存器基地址 /
ADC_InitTypeDef Init; / ADC 参数初始化结构体变量 */
DMA_HandleTypeDef DMA_Handle; / DMA 配置结构体 */
……
} ADC_HandleTypeDef;
typedef struct
{
uint32_t DataAlign; /* 设置数据的对齐方式 /
uint32_t ScanConvMode; / 扫描模式 /
FunctionalState ContinuousConvMode; / 开启单次转换模式或者连续转换模式 / uint32_t NbrOfConversion; / 设置转换通道数目 /
FunctionalState DiscontinuousConvMode; / 是否使用规则通道组间断模式 /
uint32_t NbrOfDiscConversion; / 配置间断模式的规则通道个数 /
uint32_t ExternalTrigConv; / ADC 外部触发源选择 */
} ADC_InitTypeDef;
typedef struct
{
uint32_t Channel; /* ADC 转换通道*/
uint32_t Rank; /* ADC 转换顺序 /
uint32_t SamplingTime; / ADC 采样周期 */
} ADC_ChannelConfTypeDef;
9. 多通道采集实验配置步骤
10 实战
10.1 adc.h
#ifndef __ADC_H
#define __ADC_H
#include "./SYSTEM/sys/sys.h"
//1.开启 ADCx 和通道输出的 GPIO 时钟,配置该 IO 口的复用功能输出
//1.1 ADC及引脚定义 ADC复用PA5口
#define ADC_ADCX_CHY_GPIO_PORT GPIOA
#define ADC_ADCX_CHY_GPIO_PIN GPIO_PIN_5
#define ADC_ADCX_CHY_GPIO_CLK_ENABLE() do{
__HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) //PA口时钟使能
#define ADC_ADCX ADC1
#define ADC_ADCX_CHY ADC_CHANNEL_5 //通道Y, 0 <= Y <= 17
#define ADC_ADCX_ADCX_GPIO_CLK_ENABLE() do{
__HAL_RCC_ADC1_CLK_ENABLE(); }while(0) // PA口时钟使能
#define ADC_CH_NUM 6 //转换的通道数目
///* ADC DMA采集 DMA数据流相关 定义
// * 注意: 这里我们的通道还是使用上面的定义.
#define ADC_ADCX_DMASx DMA2_Stream4
#define ADC_ADCX_DMASx_Chanel DMA_CHANNEL_0 //ADC1_DMA请求源
#define ADC_ADCX_DMASx_IRQn DMA2_Stream4_IRQn //DMA2_Stream4_IRQn
#define ADC_ADCX_DMASx_IRQHandler DMA2_Stream4_IRQHandler
#define ADC_ADCX_DMASx_IS_TC() ( DMA2->HISR & (1 << 5) ) //判断 DMA2_Stream4 传输完成标志, 这是一个假函数形式, * 不能当函数使用, 只能用在if等语句里面
#define ADC_ADCX_DMASx_CLR_TC() do{
DMA2->HIFCR |= 1 << 5; }while(0) //清除 DMA2_Stream4 传输完成标志
void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime); /* ADC通道设置 */
void adc_dma_enable( uint16_t ndtr); /* 使能一次ADC DMA采集传输 */
void adc_nch_dma_init(uint32_t tmr); /* ADC多通道 DMA采集初始化 */
void adc_nch_dma_gpio_init(void); /* ADC多通道 GPIO初始化 */
void adc_nch_dma_enable(uint16_t ndtr); /* 使能一次ADC DMA多通道采集传输 */