#include "bsp.h" #define EXIT_LINE LL_EXTI_LINE_16 pvd_irq_handle_cb pvd_irq_handle_cb_func = NULL; /** * @brief 配置PVD(电源电压检测) * * 根据给定的电源电压等级配置PVD(电源电压检测)。 * * @param pwr_level 电源电压等级 * @param call PVD中断处理回调函数 */ void pvd_configuration(uint32_t pwr_level, pvd_irq_handle_cb call) { // pvd_irq_handle_cb_func = call; // // 启用电源时钟 // LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); // // 设置PVD电平阈值,例如设置为2.4V LL_PWR_PVDLEVEL_2 // LL_PWR_SetPVDLevel(pwr_level); // // 启用PVD // LL_PWR_EnablePVD(); // // 配置PVD中断 // LL_EXTI_EnableIT_0_31(EXIT_LINE); // PVD连接到EXTI Line // LL_EXTI_EnableRisingTrig_0_31(EXIT_LINE); // LL_EXTI_EnableFallingTrig_0_31(EXIT_LINE); // // 启用PVD中断向量 // NVIC_EnableIRQ(PVD_PVM_IRQn); // NVIC_SetPriority(PVD_PVM_IRQn, 0); } /** * @brief 处理PVD中断 * * 当PVD中断触发时,该函数将被调用以处理中断事件。 * * @note 无返回值 */ void pvd_irq_handle(void) { // if (LL_EXTI_IsActiveFlag_0_31(EXIT_LINE)) // { // LL_EXTI_ClearFlag_0_31(EXIT_LINE); // if (pvd_irq_handle_cb_func != NULL) // { // pvd_irq_handle_cb_func(); // } // } } /** * @brief 禁用调试接口 * * 禁用设备的调试接口,包括关闭调试停止模式、调试待机模式和调试睡眠模式。 * 同时将 SWD 和 JTAG 接口的引脚配置为普通 GPIO。 * * @note disable_debug_interface调用后 SWD 接口会被关闭,ST-LINK 等调试工具无法通过 SWD 连接 MCU,也无法使用 STM32 ST-LINK Utility 软件 通过 ST-LINK 连接MCU解除读保护 * 解除读保护流程:Read Out Protection : 改为 Level 0 ,调整为 Level 0 后 Flash 中的程序会被自动擦除。注意:千万不要改为 Level 2 ,改成Level 2 后 MCU 将会被彻底锁死,相当于熔断保护,无法通过软件再恢复。 */ void disable_debug_interface(void) { // // 使能 SYSCFG 时钟 // LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG); // // 关闭调试接口 // LL_DBGMCU_DisableDBGStopMode(); // LL_DBGMCU_DisableDBGStandbyMode(); // LL_DBGMCU_DisableDBGSleepMode(); // // 关闭 SWD 和 JTAG 接口 // LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; // // 配置 SWDIO (PA13) 和 SWCLK (PA14) 引脚为普通 GPIO // GPIO_InitStruct.Pin = LL_GPIO_PIN_13 | LL_GPIO_PIN_14; // GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; // GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; // LL_GPIO_Init(GPIOA, &GPIO_InitStruct); // // 如果使用的是 JTAG 接口,还需要配置 JTDI (PA15), JTDO (PB3), 和 NJTRST (PB4) 引脚 // GPIO_InitStruct.Pin = LL_GPIO_PIN_15; // LL_GPIO_Init(GPIOA, &GPIO_InitStruct); // GPIO_InitStruct.Pin = LL_GPIO_PIN_3 | LL_GPIO_PIN_4; // LL_GPIO_Init(GPIOB, &GPIO_InitStruct); }