在线时间7 小时
UID257575
ST金币0
蝴蝶豆0
注册时间2011-1-1
初级会员
- 最后登录
- 2020-6-5
|
a0a.1 0b0c
使用遇到一个问题。规则组的转换正常。但是注入的的转换不行。软件启动触发后,进不了中断(中断已使能),后来把中断屏蔽,直接读取标志位也获取不到。程序功能配置如下:
//配置ADC
void ADC_CFG(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
//打开ADC1、GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC,ENABLE);
//配置PC0、PC1、PC2、PC3、PC4为模拟输 channel 10 11 12 13 14
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//配置为模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//ADC1与ADC2相互独立
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
//规定模数转换工作在扫描模式还是单次模式
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_InitStructure.ADC_NbrOfChannel=4;
ADC_Init(ADC1,&ADC_InitStructure);
// 设置制定 ADC 的规则组通道。配置转换顺序和转换时间 **在调用完ADC_Init()必须调用以下函数
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,2,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,3,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_12,4,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_16,4,ADC_SampleTime_55Cycles5);
ADC_InjectedSequencerLengthConfig(ADC1,1);
ADC_InjectedChannelConfig(ADC1,ADC_Channel_14,1,ADC_SampleTime_41Cycles5);
ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigConv_None);
// 使能内部温度传感器
ADC_TempSensorVrefintCmd(ENABLE);
ADC_ITConfig(ADC1,ADC_IT_JEOC,ENABLE);
ADC_DMACmd(ADC1,ENABLE);
//使能ADC1
ADC_Cmd(ADC1,ENABLE);
//重置指定的ADC校准寄存器
ADC_ResetCalibration(ADC1);
//检查指定ADC校准寄存器的设置状态
while(ADC_GetResetCalibrationStatus(ADC1));
//开始指定ADC的校准程序
ADC_StartCalibration(ADC1);
//获取指定ADC的校准状态
while(ADC_GetSoftwareStartConvStatus(ADC1));
//使能指定的ADC软件触发转换启动功能
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
主函数的部分代码:
if(flag)
{
flag=0;
ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);
}
if(ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC))
{
ADC_ClearFlag(ADC1,ADC_FLAG_JEOC);
xxx=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
flag=1;
}
仿真的时候xxx一直为0 |
|