示例代码
如下是F103的ADC1通道1的DMA使用(PA1引脚),连续自动转换(校准通道不需要初始化引脚,其余和普通ADC通道初始化一样)。
#define ADC_BUF_SIZE 2
uint16_t ADC_Buf[ADC_BUF_SIZE]; // ADC原始值
uint16_t ADC_Data[ADC_BUF_SIZE]; // 通过校准后的ADC值
float voltage[ADC_BUF_SIZE]; // 转换后的实际电压
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1 , ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
// ADC引脚初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// ADC1配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 工作模式:独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 浏览模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // ADC工作在单次转化模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = ADC_BUF_SIZE; // 通道数量
ADC_Init(ADC1, &ADC_InitStructure);
//设置指定ADC的规则组通道,设置通道对应的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_71Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_71Cycles5);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_Cmd(ADC1, ENABLE); // 使能ADC
ADC_ResetCalibration(ADC1); // 校验复位
while(ADC_GetResetCalibrationStatus(ADC1)); // 等待复位完成
ADC_StartCalibration(ADC1); // 开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1)); // 等待校验完成
ADC_DMACmd(ADC1, ENABLE); // 使能ADC的DMA功能
DMA_DeInit(DMA1_Channel1); // 外设地址
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buf; // 内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 传输方向:外设 -> 内存
DMA_InitStructure.DMA_BufferSize = ADC_BUF_SIZE; // 传输长度
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设递增:关闭
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存递增:打开
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;// 数据宽度:16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; // 优先级:高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 内存-内存:否
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE); // 使能通道
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 启动转换
}
// 将ADC转换成0~3.3V实际电压
void voltage_converter(void)
{
for(uint8_t i=0;i<ADC_BUF_SIZE-1;i++)
{
ADC_Data[i] = ADC_Buf[i]*1489/ADC_Buf[ADC_BUF_SIZE-1]; // 使用校准通道校准
voltage[i] = ADC_Data[i]*3.3f/4095.0f; // 转换成实际电压
}
}
|