Hat jemand eine Idee, warum beim STM32F103C8 ein Bit-Toggle per XOR in
einem Timer-Interrupt nicht funktioniert?
1 | void TIM2_IRQHandler() {
|
2 | GPIOC->ODR ^= GPIO_ODR_ODR13;
|
3 | TIM2->SR &= ~TIM_SR_UIF;
|
4 | }
|
Entsprechendes Assembly (sieht okay aus):
1 | 71: GPIOC->ODR ^= GPIO_ODR_ODR13;
|
2 | 0x0800031A 6801 LDR r1,[r0,#0x00]
|
3 | 0x0800031C F4815100 EOR r1,r1,#0x2000
|
4 | 0x08000320 6001 STR r1,[r0,#0x00]
|
Sobald ich mit dem Debugger durchsteppe, funktioniert es auch. Nur im
laufenden Betrieb nicht.
Das hier dagegen funktioniert auch im Betrieb:
1 | void TIM2_IRQHandler() {
|
2 | if(is_led_on) {
|
3 | GPIOC->ODR &= (uint16_t)( ~GPIO_ODR_ODR13 );
|
4 | is_led_on = false;
|
5 | } else {
|
6 | GPIOC->ODR |= GPIO_ODR_ODR13;
|
7 | is_led_on = true;
|
8 | }
|
9 | TIM2->SR &= ~TIM_SR_UIF;
|
10 | }
|
Für den jeweiligen Fall erhalte ich die angehängten Messungen mit einem
Logic Analyzer.
Das funktioniert übrigens auch:
1 | while(true) {
|
2 | GPIOC->ODR ^= GPIO_ODR_ODR13;
|
3 | wait(1000000);
|
4 | GPIOC->ODR ^= GPIO_ODR_ODR13;
|
5 | wait(1000000);
|
6 | }
|