[riot-users] Cortex Kinetis KW2xD Low Power Modes

Joakim Nohlgård joakim.nohlgard at eistec.se
Mon May 21 14:50:44 CEST 2018


Hi Olivier,
Thanks for the offer of helping! Could you write a short review on
each of the PRs that you have used/tested to let others know what the
state is and whether anything is not working as intended?
A review from a non-maintainer can not be used to approve and merge
PRs, but it does give an indication to the people with the proper
access that a PR is ready or if it needs more work.

Also, if you have a FRDM-KW41Z board, the PR
https://github.com/RIOT-OS/RIOT/pull/9147 needs a review, and is a
fairly small fix.

Best regards,
Joakim

On Mon, May 21, 2018 at 9:09 AM, Olivier Fauchon <ofauchon2204 at gmail.com> wrote:
> Hi Joakim,
>
> You were right...
>
>  Low power mode were blocked by PIT timers (PM_BLOCK at init)
> So I switched my board to LPTMR (board/pba-d-01-kw2x).
>
> With this change I could reduce power consumption from 10 mA  to ~1mA,
> and xtimers were still working
>
> Note I rebased your  pr/kinetis-pm branch  to upstream/RIOT/master to work
> on latest code.
>
> As soon as I cleanup  my work, I'll send a PR for LPTMR on  "pba-d-01-kw2x".
>
> And I'll review your other  "timer refactoring" PRs ASAP.
>
> Feel free to ask if you need more testing and help so your PRs get merged.
>
> Thanks.
> Olivier
>
>
>
>
>
>
>
> Le sam. 19 mai 2018 à 22:51, Joakim Nohlgård <joakim.nohlgard at eistec.se> a
> écrit :
>>
>> My guess is that your board uses xtimer with the PIT timer hardware, try
>> using the LPTMR instead. See the frdm-kw41z configuration for an example
>> config (board.h, periph_conf.h). I think Mulle has a config example as well
>> but it is disabled by default.
>> You might find the timer refactoring PRs helpful [1], [2], [3] (any help
>> with testing and reviewing is welcome!)
>> You might also have the UART RX blocking power modes if you don't
>> configure the llwu pin in the UART config. Clocking mode will affect the
>> reliability of the UART in low power mode, some clock modes take too long to
>> recover from sleep mode so you will miss the first few characters on RX. Use
>> FEI if unsure.
>>
>> Best regards,
>> Joakim
>>
>> [1]: https://github.com/RIOT-OS/RIOT/pull/8933
>> [2]: https://github.com/RIOT-OS/RIOT/pull/8814
>> [3]: https://github.com/RIOT-OS/RIOT/pull/8830
>>
>> /Joakim
>>
>> On Sat, May 19, 2018, 22:24 Olivier Fauchon <ofauchon2204 at gmail.com>
>> wrote:
>>>
>>> Joakim, Matthew,
>>>
>>> Thanks for your help.
>>>
>>> @Joakim: I cloned your repository, I checkout the pr/kinetis-pm branch
>>> and rebase from master
>>> Then I turned ENABLE_LEDS 1 in pm.c to facilitate debugging.
>>>
>>> I build a sample application with a very simple main() loop:
>>>
>>> while (1){
>>>    printf("*** pause 5s ***\n");
>>>    xtimer_sleep(5);
>>> }
>>>
>>> With this setup, I could run the above code, but the MCU is  idling in
>>> KINETIS_PM_WAIT mode
>>> (Lowest power saving ?).
>>>
>>> Maybe I missed something in my Makefiles  or includes (llwu, pm_layered
>>> ?) to enable the advanced power saving modes ?
>>>
>>> Are there changes to make on the board I use (pba-d-01-kw2x) too  ?
>>>
>>> Do you have a test application I can use as a reference implementation ?
>>>
>>> Thanks
>>>
>>> Olivier Fauchon
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> 2018-05-16 20:07 GMT+02:00 Joakim Nohlgård <joakim.nohlgard at eistec.se>:
>>>>
>>>> Hi Olivier,
>>>> Welcome to RIOT!
>>>> There is a pull request to integrate stop modes for the Kinetis CPUs
>>>> [1]. There's no VLPR or VLPW yet, but STOP, VLPS, and LLS are working. It
>>>> does need a rebase though.
>>>> We could use some help reviewing this and some other related Kinetis
>>>> pull requests [2], [3], [4] if you would like to help with this. Feel free
>>>> to open new PRs for any other improvements you may have.
>>>>
>>>> [1]: https://github.com/RIOT-OS/RIOT/pull/7897
>>>> [2]: https://github.com/RIOT-OS/RIOT/pull/8930
>>>> [3]: https://github.com/RIOT-OS/RIOT/pull/8933
>>>> [4]: https://github.com/RIOT-OS/RIOT/pull/8814
>>>>
>>>> Best regards,
>>>> Joakim
>>>>
>>>> On Wed, May 16, 2018, 09:01 Matthew Blue <matthew.blue.neuro at gmail.com>
>>>> wrote:
>>>>>
>>>>> Hi Olivier,
>>>>>
>>>>> Unfortunately, it seems that low power management hasn't gotten a lot
>>>>> of love for most platforms yet. The basic API is in place though, if
>>>>> you
>>>>> wish to implement it on your platform.
>>>>>
>>>>> Relevant files:
>>>>> sys/include/pm_layered.h
>>>>> sys/pm_layered/pm.c
>>>>> drivers/include/periph/pm.h
>>>>> drivers/periph_common/pm.c
>>>>>
>>>>> The PR that introduced power management:
>>>>> https://github.com/RIOT-OS/RIOT/pull/6160
>>>>>
>>>>> This command will let you find a few areas where the API has been used:
>>>>> grep -r -e 'pm_[un]*block' -e pm_set
>>>>>
>>>>> In general I think the idea is to number the power modes such that you:
>>>>> * Start by giving your lowest power mode 0
>>>>> * Then find the next lowest power mode that supports features that are
>>>>>   a superset of the features supported by 0, and make that mode 1
>>>>> * Repeat until you run out of power modes.
>>>>>
>>>>> You then write a function pm_set in cpu/*/periph/pm.c that implements
>>>>> switching the power modes. And also you set up anything that can't run
>>>>> in a certain power mode to pm_block that mode, and then to pm_unblock
>>>>> when it stops running. I think the kernel then handles the rest.
>>>>>
>>>>> There may be some details I missed, because I am not super-familiar
>>>>> with the system, but this should give you a good start.
>>>>>
>>>>> Good luck!
>>>>> Matthew Blue
>>>>>
>>>>>
>>>>> On Wed, 16 May 2018 08:06:45 +0200
>>>>> Olivier Fauchon <ofauchon2204 at gmail.com> wrote:
>>>>>
>>>>> > Hello,
>>>>> >
>>>>> > I'm using RIOT with KW2xD Kinetis MCU for Wireless sensors.
>>>>> >
>>>>> > I could observe that the board's current is 10mA when idle which is
>>>>> > too high for long battery
>>>>> > operation.
>>>>> >
>>>>> > The application note :
>>>>> > http://cache.freescale.com/files/32bit/doc/app_note/AN4503.pdf),
>>>>> > says there are Very Low Power Run / Wait / Stop modes.
>>>>> >
>>>>> > There are at lease these functions to integrate in RIOT Kernel.
>>>>> >
>>>>> > void enter_vlpr(void); => Enter low power run mode
>>>>> > void exit_vlpr(void);  => Go back in regular power run mode
>>>>> > void enter_vlps(void); => Go to low power sleep
>>>>> >
>>>>> > What is the correct way to integrate this low power mode in Riot
>>>>> > Power
>>>>> > management?
>>>>> > Are there existing implementation for these low power modes for other
>>>>> > MCUs to take in example ?
>>>>> >
>>>>> > Thanks
>>>>> >
>>>>> > Olivier
>>>>>
>>>>> _______________________________________________
>>>>> users mailing list
>>>>> users at riot-os.org
>>>>> https://lists.riot-os.org/mailman/listinfo/users
>>>>
>>>>
>>>> _______________________________________________
>>>> users mailing list
>>>> users at riot-os.org
>>>> https://lists.riot-os.org/mailman/listinfo/users
>>>>
>>>
>>> _______________________________________________
>>> users mailing list
>>> users at riot-os.org
>>> https://lists.riot-os.org/mailman/listinfo/users
>>
>> _______________________________________________
>> users mailing list
>> users at riot-os.org
>> https://lists.riot-os.org/mailman/listinfo/users
>
>
> _______________________________________________
> users mailing list
> users at riot-os.org
> https://lists.riot-os.org/mailman/listinfo/users
>


More information about the users mailing list