初中生
最后登录1970-1-1
在线时间 小时
注册时间2023-1-5
|
单独的DMA和ADC实验都是正常的,加在一起后,串口无法打印数据。
uint16_t AD_Value[4]={0,0,0,0};
void AD_Init(void)
{
//开启adc时钟,使能GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE );
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//预分频,主频72M,adc最高14M
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式,防止干扰,ADC专属模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ;//连续转换还是单次转换,单次转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐,高4位为0
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发源,该处使用软件触发,则无外部触发
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式,一个ADC转换
ADC_InitStructure.ADC_NbrOfChannel = 1;//扫描模式下,使用的通道数
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;//扫描转换模式,非扫描
//规则化通道,16通道,但只有一位数据可读,避免数据覆盖,使用DMA转运数据
//通道0,序列1,55.5转换时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);
ADC_Init(ADC1,&ADC_InitStructure);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR ;//外设起始地址
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据宽度,设置为半字节模式
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设是否自增,数组,需要自增传输下一个存储空间,失能为同一存储空间
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;//存储起始地址
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储数据宽度
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储是否自增
DMA_InitStructure.DMA_BufferSize = 1;//传输计数器
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//传输方向,外设到存储
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//硬件触发还是软件触发
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//是否使用自动重装
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA
ADC_DMACmd(ADC1,ENABLE);
ADC_Cmd(ADC1,ENABLE);
//开启转换,要求校准
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1) == SET );//
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1) == SET);
}
void AD_GetValue(void)
{
DMA_Cmd(DMA1_Channel1,DISABLE);//失能DMA
DMA_SetCurrDataCounter(DMA1_Channel1,4);
DMA_Cmd(DMA1_Channel1,ENABLE);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET );
DMA_ClearFlag(DMA1_FLAG_TC1);
}
extern uint16_t AD_Value[4];
int main(void)
{
Serial_Init();
AD_Init();
while(1)
{
AD_GetValue();
printf("%c",AD_Value[0]);
}
}
|
|