5.14 PWR 使用说明

本章说明 N32G033 标准外设库中 PWR 驱动的文件组成、9 个公开函数,以及 PVD、STOP 2 个示例。电源模式、可编程电压监测器与各模式下的外设状态请配合用户手册的“电源控制(PWR)”章节阅读,芯片已知问题以勘误手册为准。

5.14.1 相关文件

相对路径 作用
firmware/n32g033_std_periph_driver/inc/n32g033_pwr.h 定义 PVD 电压档位、PVD/NRST 滤波宽度、STOP 进入方式、调试外设等宏,并按电压监测、复位过滤与看门狗、低功耗与写保护、调试外设四个区段声明 9 个公开函数
firmware/n32g033_std_periph_driver/src/n32g033_pwr.c 实现上述 9 个函数:PVD 使能、滤波与阈值、NRST 滤波、STOP 进入、写保护、标志查询与调试外设配置
projects/n32g033_EVAL/examples/PWR/ PWR 示例根目录,含 PVD、STOP 2 个示例
projects/n32g033_EVAL/examples/PWR/PVD/ 该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt
projects/n32g033_EVAL/bsp/inc/、projects/n32g033_EVAL/bsp/src/ 板级公共文件,示例通过 log.h 使用串口日志

5.14.2 API 参考

搜索 API共 9 个函数

以下 9 个公开函数按 n32g033_pwr.h 的声明顺序分为 4 组;每个条目给出功能摘要与 n32g033_pwr.c 中该函数正上方的注释原文。

电压监测

PWR_PvdEnable、PWR_PVDFilterWidthSet、PWR_PVDLevelConfig、PWR_GetFlagStatus

复位过滤与看门狗

PWR_NRSTFilterWidthSet、PWR_EnableIWDGReset

低功耗与写保护

PWR_EnterSTOPMode、PWR_CTRL2WriteProtectionEnable

调试外设配置

DBG_ConfigPeriph

void PWR_PvdEnable(FunctionalState Cmd)使能或关闭可编程电压监测器(PVD)。
源码注释
name    PWR_PvdEnable.
fun     Enables or disables the Power Voltage Detector(PVD).
param   Cmd:
          - ENABLE
          - DISABLE
return  none
void PWR_PVDFilterWidthSet(uint8_t filter_value)调整 PVD 滤波控制计数值。
源码注释
name    PWR_PVDFilterWidthSet.
fun     Adjusting the PVD Filter Control Count value.
param   filter_value(Filter Width = (1/fLSI) * filter_value):
        -0 ~ 0x1F
return  none
void PWR_PVDLevelConfig(uint32_t level)配置可编程电压监测器(PVD)监测的电压阈值。
源码注释
name    PWR_PVDLevelConfig.
fun     Configures the voltage threshold detected by the Power Voltage Detector(PVD).
param   level (The input parameters must be the following values):
          - PWR_PVD_LEVEL_2V0
          - PWR_PVD_LEVEL_2V2
          - PWR_PVD_LEVEL_2V4
          - PWR_PVD_LEVEL_2V6
          - PWR_PVD_LEVEL_2V8
          - PWR_PVD_LEVEL_3V0
          - PWR_PVD_LEVEL_3V2
          - PWR_PVD_LEVEL_3V4
          - PWR_PVD_LEVEL_3V6
          - PWR_PVD_LEVEL_3V8
          - PWR_PVD_LEVEL_4V0
          - PWR_PVD_LEVEL_4V2
          - PWR_PVD_LEVEL_4V4
          - PWR_PVD_LEVEL_4V6
          - PWR_PVD_LEVEL_4V8
return  none
void PWR_NRSTFilterWidthSet(uint16_t filter_value)调整 NRST 滤波控制计数值。
源码注释
name    PWR_NRSTFilterWidthSet.
fun     Adjusting the NRST Filter Control Count value.
param   filter_value(Filter Width = (1/fSYSCLK) * filter_value):
        -0 ~ 0xF
return  none
void PWR_EnterSTOPMode(uint8_t enter_mode)进入 STOP 模式。
源码注释
name    PWR_EnterSTOPMode.
fun     Enters STOP mode.
param   enter_mode (The input parameters must be the following values):
          - PWR_STOPENTRY_WFI (enter STOP mode with WFI instruction)
          - PWR_STOPENTRY_WFE (enter STOP mode with WFE instruction)
return  none
void PWR_CTRL2WriteProtectionEnable(void)使能 PWR_CTRL2 寄存器的写保护。
源码注释
name    PWR_CTRL2WriteProtectionEnable.
fun     Enable the PWR_CTRL2 registers write protection.
param   none
return  none
note    This register has write protection.Before writing PWR_CTRL2, PWR_CTRL2WriteProtectionEnable()
        function must be called, and then write real value to PWR_CTRL2
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG)检查指定的 PWR 标志是否置位。
源码注释
name    PWR_GetFlagStatus.
fun     Checks whether the specified PWR flag is set or not.
param   flag (The input parameters must be the following values):
          - PWR_PVDO_FLAG       PVD Output flag
return  SET or RESET.
void DBG_ConfigPeriph(uint32_t DBG_Periph, FunctionalState Cmd)配置 MCU 处于调试模式时指定外设的运行状态。
源码注释
name    DBG_ConfigPeriph.
fun     Configures the specified peripheral run when the MCU under Debug mode.
param   DBG_Periph (The input parameters must be the following values):
          - PWR_DBG_IWDG    IWDG stopped when Core is halted
          - PWR_DBG_TIM1    TIM1 counter stopped when Core is halted
          - PWR_DBG_TIM3    TIM3 counter stopped when Core is halted
          - PWR_DBG_TIM4    TIM4 counter stopped when Core is halted
          - PWR_DBG_I2C1    I2C1 SMBUS timeout mode stopped stopped when Core is halted
          - PWR_DBG_I2C2    I2C2 SMBUS timeout mode stopped stopped when Core is halted
          - PWR_DBG_TIM6    TIM6 counter stopped when Core is halted
param   Cmd:
          - ENABLE
          - DISABLE
return  none
void PWR_EnableIWDGReset(FunctionalState Cmd)配置 IWDG 计数器归零时是否产生复位请求。
源码注释
name    PWR_EnableIWDGReset.
fun     Configure whether to generate a reset request when the IWDG counter reaches 0.
param   Cmd:
          - ENABLE
          - DISABLE
return  none.

5.14.3 Demo 示例说明

本节说明 PWR 的 2 个示例:PVD 把 VDD 电压与设定阈值比较并在越限时进入中断,STOP 进入低功耗模式并由按键引脚唤醒后继续运行。

5.14.3.1 PVD 电压监测中断

工程目录: projects/n32g033_EVAL/examples/PWR/PVD/

使能电源管理时钟→配置电压越限对应的外部中断线→使能中断通道→设定监测电压阈值并开启监测→电压越限时进入中断服务并打印提示

项目 源码解读
功能 打开 PVD 并把监测阈值设为 2.4 V,当 VDD 越过阈值时经外部中断线进入 PVD 中断。
源码组成 src/main.c 含 EXTI_Configuration、NVIC_Configuration;
src/n32g033_it.c 含 PVD_IRQHandler;
inc/main.h 给出声明与外设头文件;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 中断线:EXTI 线 7 对应 PVD 输出,上升沿与下降沿触发;
中断通道:PVD_IRQn 优先级 0;
阈值:PWR_PVD_LEVEL_2V4;
时钟:HSI 64 MHz,打印口 PA9-115200。
程序与数据路径 main → log_init 初始化日志 → RCC_EnableAPBPeriphClk 打开 PWR 时钟 → EXTI_Configuration 清线 7 标志并按上升下降沿配置 → NVIC_Configuration 使能 PVD_IRQn → PWR_PVDLevelConfig 设阈值 → PWR_PvdEnable 开启监测 → 越限时进入 PVD_IRQHandler。
主要 API PWR_PVDLevelConfig、PWR_PvdEnable、PWR_GetFlagStatus
验证方法 编译烧录到评估板后把电压调低到设定阈值以下;
串口打印 Enter PVD interrupt。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
PVD 事件在芯片内部连接到外部中断线 7,需同时配置外部中断与中断通道。
核心代码解读与移植

示例先打开 PWR 时钟,再配置电压越限对应的外部中断与中断通道,设置阈值后开启监测,越限时进入中断服务。

数据路径: RCC_EnableAPBPeriphClk 开 PWR 时钟 → EXTI_Configuration 清线 7 标志并设触发沿 → NVIC_Configuration 使能 PVD_IRQn → PWR_PVDLevelConfig 写阈值档位 → PWR_PvdEnable 置 PVDEN → 电压越限 → PVD_IRQHandler 清标志

1. 先打开 PWR 的 APB 时钟。 PVD 属于电源管理单元,配置前必须先使能 PWR 时钟。

src/main.csrc/main.c · main
    /* Enable PWR and BKP clock */
    RCC_EnableAPBPeriphClk(RCC_APB_PERIPH_PWR, ENABLE);

改到其他工程时,若未使能 PWR 时钟,对 PWR 寄存器的写操作不会生效。

2. 配置电压越限对应的外部中断线。 PVD 输出在内部连接到 EXTI 线 7,先清挂起位再设上升与下降沿触发。

src/main.csrc/main.c · EXTI_Configuration
    EXTI_InitType EXTI_InitStructure;

    /* Configure EXTI Line16(PVD Output) to generate an interrupt on rising and
       falling edges */
    EXTI_ClrITPendBit(EXTI_LINE7);
    EXTI_InitStructure.EXTI_Line    = EXTI_LINE7;
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_InitStructure);

换芯片或改触发方式时,只需调整 EXTI_Line 与 EXTI_Trigger,其余字段保持不变。

3. 使能中断通道并设定阈值、开启监测。 NVIC 使能 PVD 中断后,写阈值档位并置 PVDEN 位。

src/main.csrc/main.c · NVIC_Configuration
    NVIC_InitType NVIC_InitStructure;

    /* Enable the PVD Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = PVD_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority           = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
src/main.csrc/main.c · main
    /* Configure the PVD Level to 2.4V ,from 2V ~ 4.8V,one step mean add 200mv*/
    PWR_PVDLevelConfig(PWR_PVD_LEVEL_2V4);

    /* Enable the PVD Output */
    PWR_PvdEnable(ENABLE);

阈值档位与用户手册的 PLS 编码一一对应,换用其他电压值时改宏即可。

4. 在中断服务函数里清挂起位。 确认线 7 置位后打印提示并清标志,避免反复进入中断。

src/n32g033_it.csrc/n32g033_it.c · PVD_IRQHandler
void PVD_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_LINE7) != RESET)
    {
        log_info("\r\n Enter PVD interrupt \r\n");
        /* Clear the Key Button EXTI line pending bit */
        EXTI_ClrITPendBit(EXTI_LINE7);
        
    }
}

中断服务函数名要与启动文件中的向量名一致,移植时若改用事件方式则无需该处理函数。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_pwr.h

5.14.3.2 STOP 低功耗进入与唤醒

工程目录: projects/n32g033_EVAL/examples/PWR/STOP/

使能电源管理时钟并初始化日志→配置按键引脚的外部中断作为唤醒源→主循环延时后进入 STOP 模式→按键触发中断唤醒→唤醒后重配系统时钟并继续打印

项目 源码解读
功能 主循环延时后进入 STOP 模式,由 PA0 按键经外部中断唤醒,唤醒后重新配置系统时钟继续运行。
源码组成 src/main.c 含 SetSysClockToHSI、KeyInputExtiInit;
src/n32g033_it.c 含 EXTI0_6_IRQHandler;
inc/main.h 定义按键端口引脚;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 唤醒引脚:PA0 按键,上升沿触发;
中断通道:EXTI0_6_IRQn 优先级 0x01;
进入方式:PWR_STOPENTRY_WFI;
时钟:HSI 64 MHz,打印口 PA9-115200。
程序与数据路径 main → RCC_EnableAPBPeriphClk 打开 PWR 时钟 → log_init → KeyInputExtiInit 把 PA0 接到外部中断线 0 → 循环 SysTick_Delay_Ms 后 PWR_EnterSTOPMode 进入 STOP → 按键唤醒后 SetSysClockToHSI 重配时钟 → log_init 后继续打印。
主要 API PWR_EnterSTOPMode、PWR_GetFlagStatus
验证方法 烧录上电后串口打印 PWR_STOP INIT,随后打印 STOP ENTRY 表示已进入 STOP;
按下 PA0 按键后打印 STOP EXIT,表示从停止处被唤醒继续执行。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
STOP 模式下 HSI 关闭,唤醒后需重新配置串口所需的系统时钟。
核心代码解读与移植

示例把按键引脚接到外部中断作为唤醒源,主循环延时后进入 STOP,唤醒后重新配置时钟继续运行。

数据路径: RCC_EnableAPBPeriphClk 开 PWR 时钟 → log_init 初始化日志 → KeyInputExtiInit 配置 PA0 外部中断 → 循环 SysTick_Delay_Ms → PWR_EnterSTOPMode 进入 STOP → 按键唤醒 SetSysClockToHSI 重配时钟 → log_init

1. 打开 PWR 时钟并初始化日志与唤醒源。 进入低功耗前先使能 PWR 时钟,再初始化串口日志与按键中断。

src/main.csrc/main.c · main
    /* Enable PWR Clock */
    RCC_EnableAPBPeriphClk(RCC_APB_PERIPH_PWR, ENABLE);
    /* Initialize LEDs on n32g033-EVAL board */
    log_init();
    log_info("\n PWR_STOP INIT ");
    /* Initialize Key button Interrupt to wakeUp stop */
    KeyInputExtiInit(KEY_INPUT_PORT, KEY_INPUT_PIN);

KEY_INPUT_PORT 与 KEY_INPUT_PIN 在 inc/main.h 中定义为 GPIOA 与 0 号引脚,换引脚时改这两个宏即可。

2. 主循环延时后进入 STOP,唤醒后重配时钟。 每次循环先延时,打印后进入 STOP;被唤醒后立刻把系统时钟切回 HSI 再初始化日志。

src/main.csrc/main.c · main
    while (1)
    {
        /* Insert a long delay */
        SysTick_Delay_Ms(2000);

        log_info("\n STOP ENTRY ");
        PWR_EnterSTOPMode(PWR_STOPENTRY_WFI);
        SetSysClockToHSI(RCC_SYSCLK_PRES_DIV1);
        log_init();
        log_info("\n STOP EXIT ");
    }

唤醒后必须重新配置时钟,否则串口波特率会与主频不匹配而打印乱码。

3. 把按键引脚接到外部中断线并设优先级。 按键引脚配为浮空输入,经外部中断线 0 上升沿触发,EXTI0_6_IRQn 优先级 0x01。

src/main.csrc/main.c · KeyInputExtiInit
    /*Configure key EXTI Line to key input  Pin*/
    GPIO_ConfigEXTILine(GPIOA_PORT_SOURCE, GPIO_PIN_SOURCE0);

    /*Configure key EXTI line*/
    EXTI_InitStructure.EXTI_Line = EXTI_LINE0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_InitStructure);

    /*Set key input interrupt priority*/
    NVIC_InitStructure.NVIC_IRQChannel                   = EXTI0_6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority           = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

外部中断源与引脚号的组合要按用户手册的 EXTI 映射修改,中断通道名在启动文件中固定。

4. 唤醒后在中断服务函数里清挂起位。 确认线 0 置位后清标志,使下次按键仍能唤醒。

src/n32g033_it.csrc/n32g033_it.c · EXTI0_6_IRQHandler
void EXTI0_6_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_LINE0) != RESET)
    {
        /* Clear the Key Button EXTI line pending bit */
        EXTI_ClrITPendBit(EXTI_LINE0);
    }
}

若改用事件唤醒,则不需要使能中断通道,也无需该中断服务函数。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_pwr.h

5.14.4 注意与排障

场景 检查与建议 来源
PVD 阈值与迟滞 用户手册 PWR 章写明 PVD 阈值在 2.0 V 到 5 V 之间有 15 个档位可选,电压迟滞为 ±100 mV;
选档后实际告警点会随迟滞上下浮动。
用户手册
PVD 滤波 用户手册 PWR 章写明 PVD 支持基于 LSI 的可编程滤波,1~32 个 cycle,约 30~1024 µs 可配,默认约 300 µs;
滤波计数值与 LSI 频率相关。
用户手册
进入 STOP 的前置条件 用户手册 PWR 章写明进入 STOP 模式前需设置 SCB_SCR.SLEEPDEEP=1;
正在进行的 FLASH 或 APB 访问会把进入时间延后到访问完成。
用户手册
STOP 模式下的外设 用户手册 PWR 章写明 STOP 模式下 HSI 关闭、LSI 开启,SRAM 与寄存器内容保持;
进入 STOP 前应关闭 ADC 以免额外功耗。
用户手册
EXTI 唤醒源 用户手册 PWR 章写明任何经 EXTI 的中断或事件都能唤醒 STOP,所有 GPIO 都可配置到 EXTI0~6;
按键唤醒需保证引脚已接到对应外部中断线。
用户手册
PWR_CTRL2 写保护 用户手册 PWR 章写明 PWR_CTRL2 有写保护,修改前需先写入 32 位键值 0x5710_3616 再写实际值;
驱动中由写保护使能函数完成该解锁。
用户手册
DBG_CTRL 访问条件 用户手册 PWR 章写明 DBG_CTRL 只有 POR/PDR 才能复位,且只有连上调试器后软件才可写访问;
配置调试外设停止功能需在调试会话中进行。
用户手册

勘误手册 V1.0.0(2025.9.25)针对 A 版芯片,未列出 PWR 相关条目。

国民技术开发套件文档中心

按芯片系列在线查阅国民技术 MCU 开发套件的芯片资料、SDK、驱动 API 与 Demo 示例说明。

© 2026 国民技术股份有限公司 版权所有粤ICP备11069485号本站使用不含 Cookie 的匿名访问统计