21ic问答首页 - AT32F403A 使用ADC时候出的问题。
AT32F403A 使用ADC时候出的问题。
SWJ212021-01-07
使用ADC 双模式时,程序卡在判断CAL 控制位为零的循环中,在使用ADC双模式时,由于硬件不会清除CAL控制位,可能导致程序会卡在ADC校准函数
while(ADC_GetCalibrationStatus(ADC1));
我没有双使用ADC,还事卡住。
#define Channel_Num 2
#define Sample_Num 1
u16 ADC_ConvertedValue[Sample_Num][Channel_Num];
void ADC_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num;
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;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
//DMA_Cmd(DMA1_Channel1,ENABLE);
DMA_ClearITPendingBit(DMA1_IT_TC1);//清除DMA通道x中断待处理标志位
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);
}
//ADC配置函数
void ADC_Configuration(void)
{
u16 i;
ADC_InitTypeDef ADC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //第二步:设置分频因子 ADC最大速率14M 72/6=12M
ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为默认值
//配置ADC1
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE; //扫描
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
//ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//无外部触发,即软件触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel=Channel_Num;//规则转换通道数量
ADC_Init(ADC1,&ADC_InitStructure);
//ADC1通道采样配置,使用规则通道1-3
//测试使用中断方式读数据,采样周期不能太小.实际使用时考虑加DMA处理
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_41Cycles5);//ADC8配置为通道1,周期239.5+12.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,2,ADC_SampleTime_41Cycles5);//ADC8配置为通道1,周期239.5+12.5
//初始化AD缓冲
for(i=0;i<4;i++)
{
AD_value[i]=0;
}
//使能ADC1的DMA模式
ADC_DMACmd(ADC1,ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1,ENABLE);
DELAY_1ms();//14*ADCCLK
ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部出发ADC转换
//清除ADC1校准值
ADC_ResetCalibration(ADC1);
//等待清除完成
while(ADC_GetResetCalibrationStatus(ADC1));
//开始ADC1校准
ADC_StartCalibration(ADC1);
//等待校准完成
//while(ADC_GetCalibrationStatus(ADC1));
DELAY_10ms();
DELAY_10ms();
DMA_Cmd(DMA1_Channel1,ENABLE);
//开始ADC1转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
// ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除中断标志
// ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//使能中断
}
while(ADC_GetCalibrationStatus(ADC1));
我没有双使用ADC,还事卡住。
#define Channel_Num 2
#define Sample_Num 1
u16 ADC_ConvertedValue[Sample_Num][Channel_Num];
void ADC_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num;
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;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
//DMA_Cmd(DMA1_Channel1,ENABLE);
DMA_ClearITPendingBit(DMA1_IT_TC1);//清除DMA通道x中断待处理标志位
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);
}
//ADC配置函数
void ADC_Configuration(void)
{
u16 i;
ADC_InitTypeDef ADC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //第二步:设置分频因子 ADC最大速率14M 72/6=12M
ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为默认值
//配置ADC1
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE; //扫描
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
//ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//无外部触发,即软件触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel=Channel_Num;//规则转换通道数量
ADC_Init(ADC1,&ADC_InitStructure);
//ADC1通道采样配置,使用规则通道1-3
//测试使用中断方式读数据,采样周期不能太小.实际使用时考虑加DMA处理
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_41Cycles5);//ADC8配置为通道1,周期239.5+12.5
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,2,ADC_SampleTime_41Cycles5);//ADC8配置为通道1,周期239.5+12.5
//初始化AD缓冲
for(i=0;i<4;i++)
{
AD_value[i]=0;
}
//使能ADC1的DMA模式
ADC_DMACmd(ADC1,ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1,ENABLE);
DELAY_1ms();//14*ADCCLK
ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部出发ADC转换
//清除ADC1校准值
ADC_ResetCalibration(ADC1);
//等待清除完成
while(ADC_GetResetCalibrationStatus(ADC1));
//开始ADC1校准
ADC_StartCalibration(ADC1);
//等待校准完成
//while(ADC_GetCalibrationStatus(ADC1));
DELAY_10ms();
DELAY_10ms();
DMA_Cmd(DMA1_Channel1,ENABLE);
//开始ADC1转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
// ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除中断标志
// ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//使能中断
}
赞0
评论
2021-03-18
赞0
ADC_InitStructure.ADC_NbrOfChannel=Channel_Num;//规则转换通道数量
评论
2021-03-18
触发 会不会是这句 ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部出发ADC转换
您需要登录后才可以回复 登录 | 注册