我在STM32 F407 Discovery上学习ADC编程,从最简单的情况开始 - 单次转换。 (连接到ADC1) 我正在使用StdPeriph正常情况下,当我没有使用中断并且在(1)在main()中执行它时,一切正常,但是当我想通过测量的输入值触发模数转换器时设为0
void ADC_Config(){
//purposly ommited
}
void InitializeTimer_OnehundredthSecond(){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period =99;
TIM_TimeBaseStructure.TIM_Prescaler = 8399;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_Cmd(TIM4, ENABLE);
}
void TIM4_NVIC_Config(){
NVIC_InitTypeDef NVIC_InitStructure;
// numer przerwania
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
// priorytet główny
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
// subpriorytet
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
// uruchom dany kanał
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// zapisz wypełnioną strukturę do rejestrów
NVIC_Init(&NVIC_InitStructure);
// wyczyszczenie przerwania od timera 4 (wystąpiło przy konfiguracji timera)
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
// zezwolenie na przerwania od przepełnienia dla 4
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
}
int j=0;
int volatile ADC_Result=0;
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
ADC_SoftwareStartConv(ADC1);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}
}
void ADC1_1_IRQHandler(){
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
ADC_Result = ADC_GetConversionValue(ADC1);
}
int main(){
ADC_Config();
InitializeTimer_OnehundredthSecond();
TIM4_NVIC_Config();
TIM4_IRQHandler();
ADC1_1_IRQHandler();
while(1){
}
}
答案 0 :(得分:0)
我认为你的ADC中断处理程序永远不会被调用。
如果查看启动文件(startup_stm32f407xx.s
),可以看到中断处理程序是:
DCD ADC_IRQHandler; ADC1,ADC2和ADC3s
在您的代码中,您有:
void ADC1_1_IRQHandler()
从未被调用过。所以你的变量保持为0。
将ADC1_1_IRQHandler
重命名为ADC_IRQHandler
,这应该有用。
如果这不能解决您的问题,请分享ADC_Config
。