ncs v2.0.0にて、nRF52840dkでuartの有効化/無効化の制御を行ってみた。
NRF_UART0->TASKS_STOPRX = 1;
すれば大幅の節電になるが、残り20uAほどのオフセット電流を消すにはUARTを完全に沈黙させる必要がある。
BLEデバイスでの20uAはかなり大きな電流値なので、放置できない。
NRF_UART0->ENABLE = (UART_ENABLE_ENABLE_Disabled << UART_ENABLE_ENABLE_Pos);
k_sleep(K_MSEC(5000));
NRF_UART0->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos);
でいけるかなっと思ったら、戻らなくなる&300uAくらいまでアヴェレージ電流が跳ね上がることが判明。
NRF_UARTE0->ENABLE = (UARTE_ENABLE_ENABLE_Disabled << UARTE_ENABLE_ENABLE_Pos);
k_sleep(K_MSEC(5000));
NRF_UARTE0->ENABLE = (UARTE_ENABLE_ENABLE_Enabled << UARTE_ENABLE_ENABLE_Pos);
UARTEにしてみたらちょっと安定、でもしばらくすると上記の症状が再現する。
ソースコードを見直して、TASKS_STARTTX のトリガーポイントなどを整理してみたところ安定した。
100時間ほど連続運転してみたが不具合は確認できなかった。
レジスタを直接制御するので、排他処理など十分に考慮する必要があるようだ。
以上。