stm32f4 wakeup interrupt
Christian Mauderer
list at c-mauderer.de
Sat Apr 27 14:40:37 UTC 2019
Am 24.04.19 um 10:00 schrieb Jython:
> HI, ALL!
> why the code stuck in wakeup handler while the RTC gets time work fine
> i have checked some days, but no register error found, i suspect that
> the handler function is the issue
>
>
> // code
> rtems_isr rtc_wakeup_handler(rtems_vector_number vector)
> {
>
> uint32_t STM32F4_RTC_ISR = (*(volatile uint32_t *)(0x4000280C));
>
> // clear 10bit
> if(STM32F4_RTC_ISR & (1<<10))
> {
> //printk("wak\n");
> STM32F4_RTC_ISR &= ~(1<<10);
> STM32F4_RTC_ISR &= 0xfffffbff;
> }
>
> volatile uint32_t EXIT_PR = *(volatile uint32_t*)0x40013C14;
> printk("before clr %08x\n", EXIT_PR);
> EXIT_PR |= 1<<22;
>
> int i;
> for(i = 0; i < 1000; i++) i = i + 1 - 1;
> printk(" %08x\n", EXIT_PR);
> }
>
>
> the printed log attached, why the EXIT_PR bit22 not cleared
>
>
Hello Jython,
your EXIT_PR seems to be slightly odd. What you do:
volatile uint32_t EXIT_PR = *(volatile uint32_t*)0x40013C14;
This means you read the content of 0x40013C14 and write it to a 32 bit
value.
Later you do
EXIT_PR |= 1<<22;
This changes the _copy_ of the value.
What you most likely want to do is the following:
volatile uint32_t *EXIT_PR = (volatile uint32_t*)0x40013C14;
*EXIT_PR |= 1<<22;
This would change the value at 0x40013C14 and not only your copy.
By the way: You tried to do a busy wait. That's not a good idea in an
interrupt. The way you implemented it, the compiler most likely even
just removes it:
int i;
for(i = 0; i < 1000; i++) i = i + 1 - 1;
The compiler most likely notices that this statement has no effect. If
you would like to implement a busy wait that way, you should use a
volatile int.
Note that RTEMS has a rtems_counter_delay_nanoseconds() function. That
is a busy wait loop. It is based on the CPU counter and provides a
method for short busy waits for example during driver initialization.
But again: Please don't use busy waits in Interrupts. It's not a good
idea and will lead to problems sooner or later.
Best regards
Christian Mauderer
More information about the users
mailing list