stm32 看門狗 BKP(HAL庫)
阿新 • • 發佈:2018-11-09
(一)概述
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); } }