Estoy estudiando la programación de ADC en STM32 F407 Discovery y empiezo con el caso más simple: conversión única. (conectado a ADC1) Estoy usando StdPeriph En el caso normal, cuando no uso la interrupción y lo hago en while (1) en main (), todo funciona, pero cuando quiero activar el Convertidor analógico a digital, el valor de la medición de entrada se establece en 0
void ADC_Config(){
//purposly omitted
}
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){
}
}