stm32f4 wakeup interrupt

Jython googcheng at gmail.com
Mon Apr 29 01:36:55 UTC 2019


Thank you a lot ! maybe i was thinking make code more clear and then forget
the right

On Sun, Apr 28, 2019 at 3:27 PM Christian Mauderer <list at c-mauderer.de>
wrote:

> Am 27.04.19 um 16:40 schrieb Christian Mauderer:
> > 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
>
> Oh, and I just noted: You are writing a one to the register but expect
> the bit to be cleared. So it is most likely a "write one to clear"
> register (which is quite common for interrupt flags). In that case you
> maybe don't want to use a
>
>     *EXIT_PR |= 1<<22;
>
> but a
>
>     *EXIT_PR = 1<<22;
>
> Otherwise you clear other flags in that register too. Please have a look
> at the reference manual of your chip to decide that.
>
> Best regards
>
> Christian
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20190429/44dd0b42/attachment-0002.html>


More information about the users mailing list