PVD (Programmable Votage Detector) ,即可編程電壓監測器
PVD可以檢測電壓變化並觸發中斷,一般用於判斷斷電並進行數據保存
工程是使用STM32CubeMx生成的,在STM32CubeMx找了大半天,沒找到可以PVD配置的地方
找到官方例程:Repository\STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Examples\PWR\PWR_PVD
直接搬磚
/** PVD配置函數,從例程直接複製過來,在Main函數中調用配置PVD
* @brief Configures the PVD resources.
* @param None
* @retval None
*/
void PVD_Config(void)
{
/*##-1- Enable Power Clock #################################################*/
__HAL_RCC_PWR_CLK_ENABLE();
/*##-2- Configure the NVIC for PVD #########################################*/
HAL_NVIC_SetPriority(PVD_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(PVD_IRQn);
/* Configure the PVD Level to 3 and generate an interrupt on rising and falling
edges(PVD detection level set to 2.5V, refer to the electrical characteristics
of you device datasheet for more details) */
PWR_PVDTypeDef sConfigPVD;
sConfigPVD.PVDLevel = PWR_PVDLEVEL_7;
sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING;
HAL_PWR_ConfigPVD(&sConfigPVD);
/* Enable the PVD Output */
HAL_PWR_EnablePVD();
}
/** PVD (Programmable Votage Detector) ,即可編程電壓監測器,PVD中斷回調,在這個函數中添加自己需要的斷電時處理的內容
* @brief PWR PVD interrupt callback
* @retval None
*/
void HAL_PWR_PVDCallback(void)
{
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_PWR_PVDCallback could be implemented in the user file
*/
// 斷電時點亮一下LED,會亮一瞬間
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
}
/** 由於沒有STM32CubeMx找到配置PVD的地方,這裏需要手動添加PVD_IRQHandler的實現
* @brief This function handles the PVD Output interrupt request.
* @param None
* @retval None
*/
void PVD_IRQHandler(void)
{
HAL_PWR_PVD_IRQHandler();
}
PVD_IRQHandler是必須要添加的,如果STM32CubeMx能配置PVD,這個函數應該能自動添加的
太依賴STM32CubeMx了,開始時寫了PVD_Config()和HAL_PWR_PVDCallback(),然後測試一直進不去中斷,最後在例程的stm32f1xx_it.c文件中看到PVD_IRQHandler的實現,而自己的工程裏卻沒有,加上後就一切搞定了
然後在HAL_PWR_PVDCallback()函數中寫入flash,發現擦除完section後沒有寫入成功,時間不太夠,估計要加個電容
=============================================================
找到STM32CubeMx配置PVD的地方了,在NVIC中,PVD interrupt through EXTI line 16,之前之所找不到因爲我之前勾選了show only enable interrupts選項,沒顯示出來,重新生成工程,打開stm32f1xx_it.c可以看到PVD_IRQHandler()函數代碼已經自動生成了