/*************************************************************
Function : ADConvert_GPIO_Init
Description: ADC的引脚配置
Input : none
return : none
*************************************************************/
static void ADConvert_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //ADC通道0与通道1对应的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*************************************************************
Function : ADConvert_ADC1_Init
Description: ADC1初始化
Input : none
return : none
*************************************************************/
static void ADConvert_ADC1_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_DeInit(ADC1);//将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode =ENABLE;//模数转换工作在扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//模数转换工作在连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发转换关闭
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2;//顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
//ADC1,ADC通道x,规则采样顺序值为y,采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1, ENABLE);//打开ADC1
ADC_DMACmd(ADC1, ENABLE);//打开ADC1的DMA支持
ADC_ResetCalibration(ADC1);//开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
ADC_StartCalibration(ADC1);//开始AD校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//连续转换开始,ADC通过DMA方式不断的更新RAM区
}
#define ADC1_DR_Address 0x4001244C //ADC1的数据寄存器地址
u16 AD_Value[2];
/*************************************************************
Function : ADConvert_DMA_Init
Description: DMA初始化
Input : none
return : none
*************************************************************/
static void ADConvert_DMA_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
DMA_DeInit(DMA1_Channel1);//将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//DMA外设ADC基地址 (u32)&ADC1->DR也可以
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;//DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//内存作为数据传输的目的地
DMA_InitStructure.DMA_BufferSize = 2;//DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道 x拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure);//根据DMA_InitStruct中指定的参数初始化DMA的通道
DMA_Cmd(DMA1_Channel1, ENABLE);//启动DMA通道
}
/*************************************************************
Function : ADConvert_Init
Description: ADC初始化
Input : none
return : none
*************************************************************/
void ADConvert_Init(void)
{
ADConvert_GPIO_Init();
ADConvert_ADC1_Init();
ADConvert_DMA_Init();
}
#ifndef __ADCONVERT_H__
#define __ADCONVERT_H__
#include "stm32f10x.h"
void ADConvert_Init(void);
#endif
extern u16 AD_Value[2];
/*************************************************************
Function : main
Description: main入口
Input : none
return : none
*************************************************************/
int main(void)
{
BSP_Init();
ADConvert_Init();
PRINTF("\nmain() is running!\r\n");
while(1)
{
LED1_Toggle();
printf("ADC1_IN0:AD=%d volt=%1.1fV\r\n", AD_Value[0], 3.3*AD_Value[0]/4096);
printf("ADC1_IN1:AD=%d volt=%1.1fV\r\n", AD_Value[1], 3.3*AD_Value[1]/4096);
Delay_ms(1000);
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』