Hallo Sisor
Erstmal vielen Dank.
Mir ist die Bedeutung in deiner Codezeile zwar noch nicht ganz klar, aber ich habs einfach mal kopiert und der Kompiler meckert nicht.
So richtig will es aber immer noch nicht. Hier mal der komplette Code. Muß ich mit dem NVIC noch irgendwas machen?
Und woher weiß der Kompiler, daß Timer-Interrupts in TIM2_IRQHandler abgearbeitet werden sollen? So richtig ist mir das
auch nicht klar. Ich hab das aus einem Beispiel, finde in der STM32F4xx aber nichts dazu. (Leider auch nichts ähnliches).
Mir reicht für den ersten Test eine Ansage vom Debugger in der ISR.
Code:
void TIM2_IRQHandler(void){
printf("TIM2 Interrupt\n");
}
void configLed(){
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //Taktversorgung Port A
GPIOA->MODER |= (GPIO_MODER_MODER5_0); //A5 => Ausgang
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_5); //A5 0> Push-Pull
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR5); //A5 ohne Pullup-Pulldown
}
void configButton(){
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; //Taktversorgung Port C
GPIOC->MODER |= GPIO_MODER_MODER0_0; //C13 => Eingang
GPIOC->PUPDR |= GPIO_PUPDR_PUPDR13_1; //C13 => Pulldown einschalten
}
void configTakt(){
RCC->CFGR |= RCC_CFGR_PPRE1_DIV16; //Takt für APB1 auf 1MHz runterteilen
}
void configTimer2(){
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //Takt für Tim2 freigeben
TIM2->PSC = 10000; //Prescaler 10.000
TIM2->CR1 |= TIM_CR1_CEN; //Timer aktivierent
TIM2->DIER |= TIM_DIER_TIE; //Trigger Interrupt enable
NVIC->ISER[TIM2_IRQn / 32] = 1 <<(TIM2_IRQn % 32);
printf("Timer2 Konfi beendet\n");
}
void configNVIC(){
}
void main(void){
configTakt();
configTimer2();
configLed();
configButton();
printf("Einstellung fertig\n");
while(1){ //Halteschleife da da Debug-Fenster sonst mit Knopf-gedrückt-Meldungen geflutet wird
}
while(1){
if(!(GPIOC->IDR & GPIO_IDR_IDR_13)){
GPIOA->BSRR |= GPIO_BSRR_BS_5; //Ausgang A5 setzen
printf("Knopf gedrückt\n");
}
else{
GPIOA->BSRR |= (GPIO_BSRR_BR_5); //Ausgang A5 zurücksetzen
printf("Knopf nicht gedrückt\n");
}
}
}
Lesezeichen