STM32のブラウンアウトリセット

STM32マイコンにはブラウンアウトリセット(BOR)の機能がある。ブラウンアウトリセットとは、ざっくり言うと電源電圧が(パワーダウンするほどでもないが)ちょっと下がったときにリセットをかけることである。この機能はデフォルトではOFFになっており、オプションバイトの設定により3段階の閾値電圧でのブラウンアウトリセットが有効になる。具体的な電圧はマイコンのデータシートを参照されたい。


オプションバイトとは、特別な不揮発メモリであり、リセットやフラッシュメモリ保護などに関する設定がここに保持される。オプションバイトはその性質上、書き換えのために特別な手続きを踏む必要がある。


HALライブラリを使ったブラウンアウトリセット設定のコードを示す。簡単のため異常系の処理は省略してある。きちんと処理するにはライブラリAPIの戻り値がHAL_OKかどうかを判定すること。

#include "stm32f7xx_hal.h"

void set_bor(void)
{
    // 動作確認のため、OPTCRレジスタとオプションバイトの値を読み出してみる
    volatile uint32_t optcr = FLASH->OPTCR;
    volatile uint32_t ob = *((uint32_t*)0x1FFF0000);

    // 現在のオプションバイトの設定値を取得
    FLASH_OBProgramInitTypeDef ob_config;
    HAL_FLASHEx_OBGetConfig(&ob_config);

    // ブラウンアウトリセットの設定値をチェック
    //    OB_BOR_LEVEL3: レベル3
    //    OB_BOR_LEVEL2: レベル2
    //    OB_BOR_LEVEL1: レベル1
    //    OB_BOR_OFF   : 無効 (デフォルト)
    if(ob_config.BORLevel != OB_BOR_LEVEL3){
        ob_config.BORLevel = OB_BOR_LEVEL3;
        
        // オプションバイトのアンロック
        HAL_FLASH_OB_Unlock();
        // オプションバイトの設定
        HAL_FLASHEx_OBProgram(&ob_config);
        // オプションバイトの書き換え
        HAL_FLASH_OB_Launch();
        // オプションバイトのロック
        HAL_FLASH_OB_Lock();
    }

    // 動作確認のため、OPTCRレジスタとオプションバイトの値を再度読み出してみる
    optcr = FLASH->OPTCR;
    ob = *((uint32_t*)0x1FFF0000);
}