1. 程式人生 > >stm32 看門狗 BKP(HAL庫)

stm32 看門狗 BKP(HAL庫)

(一)概述

stm32有兩個看門狗:硬體看門狗(LSI 40KHz,時間精度不高)和視窗看門狗(APB1)。

(二)硬體看門狗實現程式碼

IWDG_HandleTypeDef hiwdg;

// 硬體看門狗初始化
static void MX_IWDG_Init(IWDG_HandleTypeDef *pHiwdg)
{
    pHiwdg->Instance = IWDG;
    pHiwdg->Init.Prescaler = IWDG_PRESCALER_4;
    pHiwdg->Init.Reload = 0xFFF; // Tout = ((4 * 2^prer) * rlr) / 40 = 409ms,看門狗溢位時間

    if (HAL_IWDG_Init(pHiwdg) != HAL_OK)
    {
        Error_Handler();
    }
}

int main(void)
{
     ........
     MX_IWDG_Init(&hiwdg);
     ........
     HAL_IWDG_Start(&hiwdg);

    while (1)
    {
        ........
        HAL_IWDG_Refresh(&hiwdg);
    }
    
}

(三)初始上電獲取硬體看門狗復位狀態

if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET)
{
    
}/* 硬體看門狗復位 */

__HAL_RCC_CLEAR_RESET_FLAGS();

(四)看門狗復位後IO狀態的保持方法

法一:硬體方式,鎖存器。

法二:軟體方式,當需要關注的IO狀態改變時,立馬存在Flash中,初始上電判斷復位型別是硬體看門狗,就進行Flash讀取和IO操作。該方式的缺點:由於stm32的Flash寫操作是頁寫,每次寫之前,都要先擦除,而且Flash的寫次數有限,故經常寫,Flash經常寫的區域有可能被寫壞。

法三:軟體方式,BKP+初始判斷處理。

// 寫備份暫存器
void BKP_Write(uint16_t *pSourceData, uint32_t num)
{
    volatile uint32_t *pDestData;

    RCC->APB1ENR |= (1 << 27 | 1 << 28);  // 電源介面時鐘/備份時鐘開啟
    PWR->CR |= 1 << 8;                    // 允許寫入後備暫存器

    pDestData = &(BKP->DR11);

    for (uint32_t i = 0; i < num; i++)
    {
        *(pDestData + i) = *(pSourceData + i);
    }
}

// 讀備份暫存器
void BKP_Read(uint16_t *pReadData, uint32_t num)
{
    volatile uint32_t *pSourceData;

    pSourceData = &(BKP->DR11);

   for (uint32_t i = 0; i < num; i++)
    {
        *(pReadData+ i) = *(pSourceData + i);
    }

}