stm32f4 __wfi
Christian Mauderer
list at c-mauderer.de
Thu Jun 20 14:47:25 UTC 2019
On 20/06/2019 16:43, Jython wrote:
> sleep function at the ending of loop, the loop did not begin intermediate
So just that I understand it correctly: Your have a loop in a task that
sends your processor to sleep at the end of the loop. Then you wake up
the processor via an interrupt and the interrupt handler is executed.
But you don't reach the loop again?
I think I remember some discussion where you wanted to put a sleep into
your idle loop? Maybe you have a double sleep?
>
> On Thursday, June 20, 2019, Christian Mauderer <list at c-mauderer.de
> <mailto:list at c-mauderer.de>> wrote:
>
> On 20/06/2019 13:25, Jython wrote:
> > do have service routine, handler can printk log, SLEEPONEXIT is 0
>
> So your handler is called? But it seems that the processor wakes up
> then. How does the "won't stop sleep mode" look like?
>
> >
> > On Thu, Jun 20, 2019 at 5:19 PM Christian Mauderer
> <list at c-mauderer.de <mailto:list at c-mauderer.de>
> > <mailto:list at c-mauderer.de <mailto:list at c-mauderer.de>>> wrote:
> >
> > On 20/06/2019 10:57, Jython wrote:
> > > a GPIO EXTI line,
> > > rtems idle phrase called __wfi, does it make stm32 enter
> standby mode?
> > > so key can not wake up it from sleep function
> >
> > Please take a look at the reference manual of your chip. Most
> likely
> > it's "RM0090 Rev 18" but make sure that's the right part number:
> >
> >
> https://www.st.com/resource/en/reference_manual/dm00031020.pdf
> <https://www.st.com/resource/en/reference_manual/dm00031020.pdf>
> >
> > On page 127 there is a description of "Entering low-power mode":
> >
> > "Low-power modes are entered by the MCU by executing the
> WFI (Wait
> > For Interrupt), or WFE (Wait for Event) instructions, or
> when the
> > SLEEPONEXIT bit in the Cortex ®-M4 with FPU System Control
> > register is set on Return from ISR."
> >
> > There is also a description for "Exiting low-power mode". For
> WFI "any
> > peripheral interrupt acknowledged by the NVIC can wake up the
> device."
> > So your interrupt has to be set up.
> >
> > Your code seems to enable the interrupt. But have you registered a
> > interrupt service routine? Otherwise you might get problems
> with an
> > unhandled interrupt on wakeup.
> >
> > I only skimmed through the power controller chapter. But it
> seems that
> > if you have SLEEPDEEP bit set, you will enter a deeper sleep mode
> > where peripheral clocks can be disabled. In that state it's
> possible
> > that only special pins (like the WKUP) can wake up the processor
> > again. Please have a detailed look at that chapter to find out all
> > traps.
> >
> > Best regards
> >
> > Christian
> >
> > >
> > >
> > > void keys_init()
> > > {
> > > // config gpio
> > > stm32f4_gpio_set_config(&io_key1); // PA12
> > > stm32f4_gpio_set_config(&io_key2);
> > > stm32f4_gpio_set_config(&io_key3);
> > > stm32f4_gpio_set_config(&io_key4);
> > >
> > >
> > > // SYSCFGEN and exit map
> > > (*(uint32_t*)0x40023844) |= 1<<14;
> > >
> > > SYSCFG_EXTICR3 = 0;
> > > SYSCFG_EXTICR4 = 0;
> > >
> > >
> > >
> > > // EXIT INIT
> > > EXTI_IMR |= (1<<12);
> > > EXTI_RTSR |= (1<<12);
> > >
> > > EXTI_IMR |= (1<<11);
> > > EXTI_RTSR |= (1<<11);
> > >
> > > EXTI_IMR |= (1<<10);
> > > EXTI_RTSR |= (1<<10);
> > >
> > > EXTI_IMR |= (1<<9);
> > > EXTI_RTSR |= (1<<9);
> > >
> > >
> > > //NVIC_Init
> > > //NVIC it group2
> > >
> > > SCB_AIRCR = 0x05FA0000 | 0x500;
> > > // ip Interrupt priority register x
> > >
> > > //(*(volatile uint8_t*)0xE000E417) = 0xe0; //23
> > > //(*(volatile uint8_t*)0xE000E428) = 0xe0; // 40
> > > (*(volatile uint8_t*)0xE000E417) = 0x50; //23
> > > (*(volatile uint8_t*)0xE000E428) = 0x50; // 40
> > >
> > >
> > >
> > > // 23 40 Interrupt set-enable register x (NVIC_ISERx)
> > > // nvic enable interrupter number
> > > // 0xE000E100
> > > (*(volatile uint32_t*)0xE000E100) |= (1<<23);
> > > (*(volatile uint32_t *)0xE000E104) |= (1<< (40%32));
> > > }
> > >
> > >
> > > On Thu, Jun 20, 2019 at 4:05 PM Christian Mauderer
> > <list at c-mauderer.de <mailto:list at c-mauderer.de>
> <mailto:list at c-mauderer.de <mailto:list at c-mauderer.de>>
> > > <mailto:list at c-mauderer.de <mailto:list at c-mauderer.de>
> <mailto:list at c-mauderer.de <mailto:list at c-mauderer.de>>>> wrote:
> > >
> > > On 20/06/2019 05:28, Jython wrote:
> > > > hi, it seems that exit key interrupt won't stop sleep
> mode, why?
> > > >
> > > > [...]
> > > >
> > >
> > > What do you mean by "exit key interrupt"? I don't know the
> > STM32F4 that
> > > well. So please give some more details.
> > >
> > > I would expect that either only specific interrupt
> sources can
> > wake up
> > > the processor from a deep sleep mode or that you can
> configure
> > which
> > > peripherals are still active. If your "exit key" is a GPIO
> > line with
> > > interrupt capability you should have a look at whether the
> > module is
> > > still active.
> > >
> > > Best regards
> > >
> > > Christian
> > >
> > > _______________________________________________
> > > users mailing list
> > > users at rtems.org <mailto:users at rtems.org>
> <mailto:users at rtems.org <mailto:users at rtems.org>>
> > <mailto:users at rtems.org <mailto:users at rtems.org>
> <mailto:users at rtems.org <mailto:users at rtems.org>>>
> > > http://lists.rtems.org/mailman/listinfo/users
> <http://lists.rtems.org/mailman/listinfo/users>
> > >
> >
>
More information about the users
mailing list