我正在研究STM32 F407 Discovery上的ADC编程,并从最简单的情况开始 - 单次转换。 (连接到ADC1) 我使用StdPeriph在正常情况下,当我不使用中断并在main()中执行while(1)时,一切正常,但是当我想通过interrput值触发模数转换器测量设置为0stm32 ADC中断
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){
}
}
我会建议裸体注册方法,而不是这个英国媒体报道。你在这里有一个非常好的波兰教程:https://www.elektroda.pl/rtvforum/topic3111562.html –