引言
在汽车电子系统中,低功耗设计至关重要,特别是在车辆熄火后需要保持某些功能运行的场景。YTM32B1ME0x采用了先进的电源管理技术,提供多种低功耗模式,支持动态电压频率调节(DVFS),并集成了智能电源管理单元,能够在保证系统性能的同时最大化电池续航时间。
电源管理系统概览
电源域架构
YTM32B1ME0x采用多电源域设计:
| 电源域 | 电压范围 | 主要功能 | 低功耗特性 |
|---|---|---|---|
| VDD | 2.7V-3.6V | 主电源域 | 可关断 |
| VDDA | 2.7V-3.6V | 模拟电源 | 独立控制 |
| VBAT | 1.65V-3.6V | 备份电源 | 超低功耗 |
| VDD_USB | 3.0V-3.6V | USB电源 | 按需供电 |
| VREF | 内部参考 | ADC参考 | 可关断 |
功耗模式概览
┌─────────────────────────────────────┐ │ 电源管理控制器 │ │ Power Management Unit │ └─────────────────┬───────────────────┘ │ ┌─────────────────────────────┼─────────────────────────────┐ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 运行 │ │ 睡眠 │ │ 停止 │ │ 模式 │ │ 模式 │ │ 模式 │ │ RUN │ │ SLEEP │ │ STOP │ └─────────┘ └─────────┘ └─────────┘ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 80MHz │ │ CPU停止 │ │ 时钟停止│ │ 全功能 │ │ 外设运行│ │ RAM保持 │ │ ~50mA │ │ ~10mA │ │ ~100μA │ └─────────┘ └─────────┘ └─────────┘ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 待机 │ │ 关机 │ │ VBAT │ │ 模式 │ │ 模式 │ │ 域 │ │ STANDBY │ │SHUTDOWN │ │ BACKUP │ └─────────┘ └─────────┘ └─────────┘ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 深度睡眠│ │ 完全关断│ │ RTC运行 │ │ ~10μA │ │ ~1μA │ │ ~2μA │ └─────────┘ └─────────┘ └─────────┘
低功耗模式详解
睡眠模式(SLEEP)
睡眠模式是最浅的低功耗模式,CPU停止执行但外设继续运行:
// 睡眠模式配置
typedef struct {
bool sleep_on_exit; // 中断返回后继续睡眠
bool deep_sleep_enable; // 深度睡眠使能
uint32_t wakeup_sources; // 唤醒源配置
sleep_callback_t enter_callback; // 进入睡眠回调
sleep_callback_t exit_callback; // 退出睡眠回调
} sleep_config_t;
// 进入睡眠模式
void enter_sleep_mode(sleep_config_t *config) {
// 保存当前状态
save_cpu_context();
// 配置睡眠参数
if (config->sleep_on_exit) {
SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
}
// 配置唤醒源
configure_wakeup_sources(config->wakeup_sources);
// 调用进入睡眠回调
if (config->enter_callback) {
config->enter_callback();
}
// 进入睡眠模式
__WFI(); // Wait For Interrupt
// 唤醒后执行
if (config->exit_callback) {
config->exit_callback();
}
// 恢复状态
restore_cpu_context();
}
// 配置唤醒源
void configure_wakeup_sources(uint32_t wakeup_sources) {
// 配置外部中断唤醒
if (wakeup_sources & WAKEUP_SOURCE_EXTI) {
EXTI->IMR |= EXTI_IMR_MR0; // 使能EXTI0中断
}
// 配置定时器唤醒
if (wakeup_sources & WAKEUP_SOURCE_TIMER) {
TIM2->DIER |= TIM_DIER_UIE; // 使能定时器中断
}
// 配置UART唤醒
if (wakeup_sources & WAKEUP_SOURCE_UART) {
UART1->CR1 |= UART_CR1_RXNEIE; // 使能接收中断
}
// 配置RTC唤醒
if (wakeup_sources & WAKEUP_SOURCE_RTC) {
RTC->CR |= RTC_CR_ALRAIE; // 使能RTC闹钟中断
}
}
// 睡眠模式功耗优化
void optimize_sleep_power(void) {
// 关闭不必要的外设时钟
RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN);
RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM4EN);
RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN | RCC_APB2ENR_USART1EN);
// 配置GPIO为模拟输入以减少漏电流
configure_gpio_for_low_power();
// 禁用不必要的中断
disable_non_wakeup_interrupts();
// 降低系统时钟频率
reduce_system_clock_frequency();
}
// GPIO低功耗配置
void configure_gpio_for_low_power(void) {
GPIO_InitTypeDef gpio_config;
// 配置未使用的GPIO为模拟输入
gpio_config.Mode = GPIO_MODE_ANALOG;
gpio_config.Pull = GPIO_NOPULL;
gpio_config.Speed = GPIO_SPEED_LOW;
// 配置GPIOC未使用引脚
gpio_config.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
HAL_GPIO_Init(GPIOC, &gpio_config);
// 配置输出引脚为低电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
}
停止模式(STOP)
停止模式下,主时钟停止,但RAM内容保持,功耗进一步降低:
// 停止模式配置
typedef struct {
stop_mode_t stop_mode; // 停止模式类型
bool flash_power_down; // Flash掉电
bool regulator_low_power; // 调节器低功耗模式
uint32_t wakeup_sources; // 唤醒源
stop_callback_t enter_callback; // 进入回调
stop_callback_t exit_callback; // 退出回调
} stop_config_t;
// 进入停止模式
void enter_stop_mode(stop_config_t *config) {
// 保存外设状态
save_peripheral_state();
// 配置停止模式参数
configure_stop_mode(config);
// 调用进入停止回调
if (config->enter_callback) {
config->enter_callback();
}
// 清除唤醒标志
PWR->CR |= PWR_CR_CWUF;
// 设置停止模式
PWR->CR &= ~PWR_CR_PDDS; // 选择停止模式
if (config->regulator_low_power) {
PWR->CR |= PWR_CR_LPDS; // 低功耗调节器
}
if (config->flash_power_down) {
PWR->CR |= PWR_CR_FPDS; // Flash掉电
}
// 设置深度睡眠
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
// 进入停止模式
__WFI();
// 唤醒后恢复
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
// 恢复系统时钟
restore_system_clock();
// 恢复外设状态
restore_peripheral_state();
// 调用退出停止回调
if (config->exit_callback) {
config->exit_callback();
}
}
// 配置停止模式
void configure_stop_mode(stop_config_t *config) {
// 配置唤醒源
configure_stop_wakeup_sources(config->wakeup_sources);
// 配置RTC唤醒
if (config->wakeup_sources & WAKEUP_SOURCE_RTC) {
configure_rtc_wakeup();
}
// 配置外部中断唤醒
if (config->wakeup_sources & WAKEUP_SOURCE_EXTI) {
configure_exti_wakeup();
}
// 配置UART唤醒
if (config->wakeup_sources & WAKEUP_SOURCE_UART) {
configure_uart_wakeup();
}
}
// RTC唤醒配置
void configure_rtc_wakeup(void) {
// 使能PWR时钟
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
// 使能备份域访问
PWR->CR |= PWR_CR_DBP;
// 配置RTC时钟源
RCC->BDCR |= RCC_BDCR_RTCSEL_LSI; // 选择LSI作为RTC时钟
RCC->BDCR |= RCC_BDCR_RTCEN; // 使能RTC
// 配置RTC唤醒定时器
RTC->WPR = 0xCA; // 解锁写保护
RTC->WPR = 0x53;
RTC->CR &= ~RTC_CR_WUTE; // 禁用唤醒定时器
while (!(RTC->ISR & RTC_ISR_WUTWF)); // 等待写入允许
RTC->WUTR = 32768 - 1; // 1秒唤醒(32768Hz LSI)
RTC->CR |= RTC_CR_WUTIE; // 使能唤醒中断
RTC->CR |= RTC_CR_WUTE; // 使能唤醒定时器
RTC->WPR = 0xFF; // 锁定写保护
// 配置EXTI线22(RTC唤醒)
EXTI->IMR |= EXTI_IMR_MR22;
EXTI->RTSR |= EXTI_RTSR_TR22;
NVIC_EnableIRQ(RTC_WKUP_IRQn);
}
// 外设状态保存
void save_peripheral_state(void) {
peripheral_state_t *state = get_peripheral_state();
// 保存GPIO状态
state->gpio_moder[0] = GPIOA->MODER;
state->gpio_moder[1] = GPIOB->MODER;
state->gpio_moder[2] = GPIOC->MODER;
state->gpio_odr[0] = GPIOA->ODR;
state->gpio_odr[1] = GPIOB->ODR;
state->gpio_odr[2] = GPIOC->ODR;
// 保存定时器状态
state->tim2_cr1 = TIM2->CR1;
state->tim2_arr = TIM2->ARR;
state->tim2_psc = TIM2->PSC;
// 保存UART状态
state->uart1_cr1 = UART1->CR1;
state->uart1_cr2 = UART1->CR2;
state->uart1_brr = UART1->BRR;
// 保存时钟配置
state->rcc_cfgr = RCC->CFGR;
state->rcc_cr = RCC->CR;
}
// 外设状态恢复
void restore_peripheral_state(void) {
peripheral_state_t *state = get_peripheral_state();
// 恢复时钟配置
RCC->CR = state->rcc_cr;
RCC->CFGR = state->rcc_cfgr;
// 等待时钟稳定
while (!(RCC->CR & RCC_CR_PLLRDY));
// 恢复GPIO状态
GPIOA->MODER = state->gpio_moder[0];
GPIOB->MODER = state->gpio_moder[1];
GPIOC->MODER = state->gpio_moder[2];
GPIOA->ODR = state->gpio_odr[0];
GPIOB->ODR = state->gpio_odr[1];
GPIOC->ODR = state->gpio_odr[2];
// 恢复定时器状态
TIM2->CR1 = state->tim2_cr1;
TIM2->ARR = state->tim2_arr;
TIM2->PSC = state->tim2_psc;
// 恢复UART状态
UART1->CR1 = state->uart1_cr1;
UART1->CR2 = state->uart1_cr2;
UART1->BRR = state->uart1_brr;
}
待机模式(STANDBY)
待机模式是最深的低功耗模式,除了备份域外所有内容都会丢失:
// 待机模式配置
typedef struct {
bool wakeup_pin_enable; // 唤醒引脚使能
bool rtc_alarm_enable; // RTC闹钟唤醒使能
uint32_t wakeup_pin_polarity; // 唤醒引脚极性
standby_callback_t enter_callback; // 进入待机回调
} standby_config_t;
// 进入待机模式
void enter_standby_mode(standby_config_t *config) {
// 保存关键数据到备份寄存器
save_critical_data_to_backup();
// 配置待机模式
configure_standby_mode(config);
// 调用进入待机回调
if (config->enter_callback) {
config->enter_callback();
}
// 清除唤醒标志
PWR->CR |= PWR_CR_CWUF;
// 设置待机模式
PWR->CR |= PWR_CR_PDDS;
// 设置深度睡眠
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
// 进入待机模式(不会返回)
__WFI();
}
// 配置待机模式
void configure_standby_mode(standby_config_t *config) {
// 使能PWR时钟
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
// 配置唤醒引脚
if (config->wakeup_pin_enable) {
PWR->CSR |= PWR_CSR_EWUP; // 使能唤醒引脚
// 配置唤醒引脚极性
if (config->wakeup_pin_polarity == WAKEUP_PIN_RISING) {
// 上升沿唤醒(默认)
} else {
// 下降沿唤醒需要额外配置
configure_wakeup_pin_falling_edge();
}
}
// 配置RTC闹钟唤醒
if (config->rtc_alarm_enable) {
configure_rtc_alarm_wakeup();
}
}
// 保存关键数据到备份寄存器
void save_critical_data_to_backup(void) {
// 使能备份域访问
PWR->CR |= PWR_CR_DBP;
// 保存系统状态
RTC->BKP0R = get_system_state();
// 保存配置参数
RTC->BKP1R = get_system_config();
// 保存运行时间
RTC->BKP2R = get_system_uptime();
// 保存错误计数
RTC->BKP3R = get_error_count();
// 保存唤醒原因
RTC->BKP4R = WAKEUP_REASON_STANDBY;
// 禁用备份域访问
PWR->CR &= ~PWR_CR_DBP;
}
// 从待机模式唤醒后的处理
void handle_standby_wakeup(void) {
// 检查复位原因
if (RCC->CSR & RCC_CSR_SFTRSTF) {
// 软件复位
handle_software_reset();
} else if (RCC->CSR & RCC_CSR_PORRSTF) {
// 上电复位
handle_power_on_reset();
} else if (PWR->CSR & PWR_CSR_SBF) {
// 从待机模式唤醒
handle_wakeup_from_standby();
}
// 清除复位标志
RCC->CSR |= RCC_CSR_RMVF;
PWR->CR |= PWR_CR_CSBF;
}
// 从待机模式唤醒处理
void handle_wakeup_from_standby(void) {
// 使能备份域访问
PWR->CR |= PWR_CR_DBP;
// 读取保存的数据
uint32_t system_state = RTC->BKP0R;
uint32_t system_config = RTC->BKP1R;
uint32_t system_uptime = RTC->BKP2R;
uint32_t error_count = RTC->BKP3R;
uint32_t wakeup_reason = RTC->BKP4R;
// 恢复系统状态
restore_system_state(system_state);
restore_system_config(system_config);
set_system_uptime(system_uptime);
set_error_count(error_count);
// 记录唤醒事件
log_wakeup_event(wakeup_reason, get_wakeup_source());
// 禁用备份域访问
PWR->CR &= ~PWR_CR_DBP;
// 执行唤醒后初始化
perform_wakeup_initialization();
}
// 检测唤醒源
wakeup_source_t get_wakeup_source(void) {
if (PWR->CSR & PWR_CSR_WUF) {
// 唤醒引脚唤醒
return WAKEUP_SOURCE_PIN;
} else if (RTC->ISR & RTC_ISR_ALRAF) {
// RTC闹钟唤醒
return WAKEUP_SOURCE_RTC_ALARM;
} else {
// 其他唤醒源
return WAKEUP_SOURCE_UNKNOWN;
}
}
动态电压频率调节(DVFS)
DVFS系统实现
// DVFS配置结构
typedef struct {
uint32_t cpu_freq_levels[4]; // CPU频率等级
uint32_t voltage_levels[4]; // 电压等级
uint32_t level_count; // 等级数量
uint32_t transition_delay_us; // 切换延时
dvfs_policy_t policy; // 调节策略
dvfs_callback_t change_callback; // 频率变化回调
} dvfs_config_t;
// DVFS状态
typedef struct {
uint32_t current_level; // 当前等级
uint32_t target_level; // 目标等级
uint32_t current_freq; // 当前频率
uint32_t current_voltage; // 当前电压
bool transition_in_progress; // 切换进行中
uint32_t transition_count; // 切换次数
uint32_t last_transition_time; // 上次切换时间
} dvfs_state_t;
// DVFS初始化
void dvfs_init(dvfs_config_t *config) {
dvfs_state_t *state = get_dvfs_state();
// 初始化状态
state->current_level = 0;
state->target_level = 0;
state->current_freq = config->cpu_freq_levels[0];
state->current_voltage = config->voltage_levels[0];
state->transition_in_progress = false;
state->transition_count = 0;
// 配置电压调节器
configure_voltage_regulator();
// 配置PLL
configure_pll_for_dvfs();
// 设置初始频率和电压
set_cpu_frequency_voltage(config->cpu_freq_levels[0],
config->voltage_levels[0]);
// 保存配置
set_dvfs_config(config);
}
// 设置DVFS等级
dvfs_status_t dvfs_set_level(uint32_t level) {
dvfs_config_t *config = get_dvfs_config();
dvfs_state_t *state = get_dvfs_state();
if (level >= config->level_count) {
return DVFS_STATUS_INVALID_LEVEL;
}
if (state->transition_in_progress) {
return DVFS_STATUS_BUSY;
}
if (level == state->current_level) {
return DVFS_STATUS_OK;
}
// 开始频率切换
state->target_level = level;
state->transition_in_progress = true;
// 执行频率切换
perform_frequency_transition(level);
return DVFS_STATUS_OK;
}
// 执行频率切换
void perform_frequency_transition(uint32_t target_level) {
dvfs_config_t *config = get_dvfs_config();
dvfs_state_t *state = get_dvfs_state();
uint32_t target_freq = config->cpu_freq_levels[target_level];
uint32_t target_voltage = config->voltage_levels[target_level];
uint32_t current_freq = state->current_freq;
uint32_t current_voltage = state->current_voltage;
// 频率上升:先升电压,后升频率
if (target_freq > current_freq) {
// 1. 升高电压
if (target_voltage > current_voltage) {
set_core_voltage(target_voltage);
delay_us(config->transition_delay_us);
}
// 2. 升高频率
set_cpu_frequency(target_freq);
delay_us(config->transition_delay_us);
}
// 频率下降:先降频率,后降电压
else {
// 1. 降低频率
set_cpu_frequency(target_freq);
delay_us(config->transition_delay_us);
// 2. 降低电压
if (target_voltage < current_voltage) {
set_core_voltage(target_voltage);
delay_us(config->transition_delay_us);
}
}
// 更新状态
state->current_level = target_level;
state->current_freq = target_freq;
state->current_voltage = target_voltage;
state->transition_in_progress = false;
state->transition_count++;
state->last_transition_time = get_system_time();
// 调用回调函数
if (config->change_callback) {
config->change_callback(target_level, target_freq, target_voltage);
}
}
// 设置CPU频率
void set_cpu_frequency(uint32_t frequency) {
uint32_t pll_mul;
uint32_t ahb_div;
uint32_t apb1_div;
uint32_t apb2_div;
// 根据目标频率计算分频系数
calculate_clock_dividers(frequency, &pll_mul, &ahb_div, &apb1_div, &apb2_div);
// 配置PLL倍频系数
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_PLLMUL) |
RCC_CFGR_PLLMUL(pll_mul);
// 配置AHB分频
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_HPRE) |
RCC_CFGR_HPRE_DIV(ahb_div);
// 配置APB1分频
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_PPRE1) |
RCC_CFGR_PPRE1_DIV(apb1_div);
// 配置APB2分频
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_PPRE2) |
RCC_CFGR_PPRE2_DIV(apb2_div);
// 重新启动PLL
RCC->CR &= ~RCC_CR_PLLON;
while (RCC->CR & RCC_CR_PLLRDY);
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY));
// 更新系统时钟
SystemCoreClockUpdate();
}
// 设置核心电压
void set_core_voltage(uint32_t voltage_mv) {
// 通过PWR控制器设置电压
uint32_t vos_scale;
if (voltage_mv >= 1800) {
vos_scale = PWR_REGULATOR_VOLTAGE_SCALE1; // 1.8V
} else if (voltage_mv >= 1500) {
vos_scale = PWR_REGULATOR_VOLTAGE_SCALE2; // 1.5V
} else {
vos_scale = PWR_REGULATOR_VOLTAGE_SCALE3; // 1.2V
}
// 使能PWR时钟
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
// 设置电压调节器输出电压
PWR->CR = (PWR->CR & ~PWR_CR_VOS) | vos_scale;
// 等待电压稳定
while (PWR->CSR & PWR_CSR_VOSF);
}
// 自适应DVFS策略
void adaptive_dvfs_task(void *param) {
dvfs_config_t *config = get_dvfs_config();
system_load_t system_load;
uint32_t target_level;
while (1) {
// 获取系统负载
get_system_load(&system_load);
// 根据负载确定目标频率等级
target_level = calculate_target_level(&system_load, config);
// 设置DVFS等级
dvfs_set_level(target_level);
vTaskDelay(pdMS_TO_TICKS(100)); // 100ms调节周期
}
}
// 计算目标频率等级
uint32_t calculate_target_level(system_load_t *load, dvfs_config_t *config) {
uint32_t cpu_utilization = load->cpu_utilization;
uint32_t target_level;
// 基于CPU利用率的简单策略
if (cpu_utilization > 80) {
target_level = config->level_count - 1; // 最高频率
} else if (cpu_utilization > 60) {
target_level = config->level_count - 2; // 次高频率
} else if (cpu_utilization > 40) {
target_level = config->level_count - 3; // 中等频率
} else {
target_level = 0; // 最低频率
}
// 考虑实时任务需求
if (load->realtime_tasks > 0) {
target_level = MAX(target_level, 2); // 实时任务至少中等频率
}
// 考虑中断负载
if (load->interrupt_load > 50) {
target_level = MAX(target_level, 1); // 高中断负载需要较高频率
}
return MIN(target_level, config->level_count - 1);
}
// 获取系统负载
void get_system_load(system_load_t *load) {
static uint32_t last_idle_time = 0;
static uint32_t last_total_time = 0;
uint32_t current_idle_time = get_idle_task_time();
uint32_t current_total_time = get_total_system_time();
uint32_t idle_delta = current_idle_time - last_idle_time;
uint32_t total_delta = current_total_time - last_total_time;
// 计算CPU利用率
if (total_delta > 0) {
load->cpu_utilization = 100 - (idle_delta * 100 / total_delta);
} else {
load->cpu_utilization = 0;
}
// 获取实时任务数量
load->realtime_tasks = get_realtime_task_count();
// 获取中断负载
load->interrupt_load = get_interrupt_load_percentage();
// 获取内存使用率
load->memory_usage = get_memory_usage_percentage();
last_idle_time = current_idle_time;
last_total_time = current_total_time;
}
智能电源管理
电源管理策略
// 电源管理策略
typedef struct {
power_policy_t policy; // 电源策略
uint32_t idle_timeout_ms; // 空闲超时时间
uint32_t sleep_timeout_ms; // 睡眠超时时间
uint32_t standby_timeout_ms; // 待机超时时间
bool auto_dvfs_enable; // 自动DVFS使能
bool peripheral_auto_gate; // 外设自动门控
power_event_callback_t callback; // 电源事件回调
} power_management_policy_t;
// 电源管理状态
typedef struct {
power_state_t current_state; // 当前电源状态
uint32_t last_activity_time; // 上次活动时间
uint32_t idle_duration; // 空闲持续时间
uint32_t wakeup_count; // 唤醒次数
uint32_t power_cycles; // 电源周期数
float average_power_consumption; // 平均功耗
peripheral_power_state_t peripheral_states[MAX_PERIPHERALS];
} power_management_state_t;
// 智能电源管理初始化
void intelligent_power_management_init(power_management_policy_t *policy) {
power_management_state_t *state = get_power_management_state();
// 初始化状态
state->current_state = POWER_STATE_RUN;
state->last_activity_time = get_system_time();
state->idle_duration = 0;
state->wakeup_count = 0;
state->power_cycles = 0;
state->average_power_consumption = 0.0;
// 初始化外设电源状态
init_peripheral_power_states(state->peripheral_states);
// 配置电源管理策略
set_power_management_policy(policy);
// 启动电源管理任务
xTaskCreate(power_management_task, "PowerMgmt", 512, NULL,
configMAX_PRIORITIES - 1, NULL);
// 配置活动检测
configure_activity_detection();
}
// 电源管理任务
void power_management_task(void *param) {
power_management_policy_t *policy = get_power_management_policy();
power_management_state_t *state = get_power_management_state();
while (1) {
uint32_t current_time = get_system_time();
// 更新空闲持续时间
state->idle_duration = current_time - state->last_activity_time;
// 根据策略决定电源状态
power_state_t target_state = determine_target_power_state(policy, state);
// 执行电源状态切换
if (target_state != state->current_state) {
transition_power_state(target_state);
}
// 外设电源管理
if (policy->peripheral_auto_gate) {
manage_peripheral_power();
}
// 自动DVFS
if (policy->auto_dvfs_enable) {
auto_adjust_dvfs();
}
// 更新功耗统计
update_power_consumption_stats();
vTaskDelay(pdMS_TO_TICKS(100)); // 100ms管理周期
}
}
// 确定目标电源状态
power_state_t determine_target_power_state(power_management_policy_t *policy,
power_management_state_t *state) {
uint32_t idle_time = state->idle_duration;
switch (policy->policy) {
case POWER_POLICY_PERFORMANCE:
// 性能优先,保持运行状态
return POWER_STATE_RUN;
case POWER_POLICY_BALANCED:
// 平衡模式
if (idle_time > policy->standby_timeout_ms) {
return POWER_STATE_STANDBY;
} else if (idle_time > policy->sleep_timeout_ms) {
return POWER_STATE_STOP;
} else if (idle_time > policy->idle_timeout_ms) {
return POWER_STATE_SLEEP;
} else {
return POWER_STATE_RUN;
}
case POWER_POLICY_POWER_SAVE:
// 省电优先
if (idle_time > policy->sleep_timeout_ms / 2) {
return POWER_STATE_STOP;
} else if (idle_time > policy->idle_timeout_ms / 2) {
return POWER_STATE_SLEEP;
} else {
return POWER_STATE_RUN;
}
default:
return POWER_STATE_RUN;
}
}
// 电源状态切换
void transition_power_state(power_state_t target_state) {
power_management_state_t *state = get_power_management_state();
power_state_t current_state = state->current_state;
if (current_state == target_state) {
return;
}
// 记录电源状态切换
log_power_state_transition(current_state, target_state);
switch (target_state) {
case POWER_STATE_SLEEP:
prepare_for_sleep();
enter_sleep_mode(get_sleep_config());
break;
case POWER_STATE_STOP:
prepare_for_stop();
enter_stop_mode(get_stop_config());
break;
case POWER_STATE_STANDBY:
prepare_for_standby();
enter_standby_mode(get_standby_config());
break;
case POWER_STATE_RUN:
// 从低功耗模式恢复到运行模式
restore_from_low_power();
break;
}
state->current_state = target_state;
state->power_cycles++;
}
// 外设电源管理
void manage_peripheral_power(void) {
power_management_state_t *state = get_power_management_state();
for (int i = 0; i < MAX_PERIPHERALS; i++) {
peripheral_power_state_t *peri_state = &state->peripheral_states[i];
if (peri_state->enabled) {
uint32_t idle_time = get_system_time() - peri_state->last_access_time;
// 如果外设长时间未使用,关闭其时钟
if (idle_time > peri_state->auto_gate_timeout &&
peri_state->power_state == PERIPHERAL_POWER_ON) {
disable_peripheral_clock(i);
peri_state->power_state = PERIPHERAL_POWER_GATED;
log_peripheral_power_event(i, PERIPHERAL_EVENT_CLOCK_GATED);
}
}
}
}
// 活动检测
void configure_activity_detection(void) {
// 配置GPIO中断检测用户活动
configure_gpio_activity_detection();
// 配置UART接收中断检测通信活动
configure_uart_activity_detection();
// 配置定时器检测系统活动
configure_timer_activity_detection();
// 配置DMA完成中断检测数据传输活动
configure_dma_activity_detection();
}
// 记录系统活动
void record_system_activity(activity_source_t source) {
power_management_state_t *state = get_power_management_state();
state->last_activity_time = get_system_time();
// 如果系统处于低功耗状态,唤醒系统
if (state->current_state != POWER_STATE_RUN) {
wakeup_from_low_power(source);
}
// 记录活动源
log_activity_event(source, get_system_time());
}
// 从低功耗模式唤醒
void wakeup_from_low_power(activity_source_t source) {
power_management_state_t *state = get_power_management_state();
state->wakeup_count++;
// 恢复系统时钟
restore_system_clock();
// 恢复外设状态
restore_peripheral_states();
// 更新电源状态
state->current_state = POWER_STATE_RUN;
// 记录唤醒事件
log_wakeup_event(source, get_system_time());
// 调用唤醒回调
power_management_policy_t *policy = get_power_management_policy();
if (policy->callback) {
policy->callback(POWER_EVENT_WAKEUP, source);
}
}
``` if
(config->sleep_on_exit) {
SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
}
if (config->deep_sleep_enable) {
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
}
// 配置唤醒源
configure_wakeup_sources(config->wakeup_sources);
// 调用进入睡眠回调
if (config->enter_callback) {
config->enter_callback();
}
// 进入睡眠模式
__WFI(); // 等待中断
// 唤醒后执行
if (config->exit_callback) {
config->exit_callback();
}
// 恢复CPU状态
restore_cpu_context();
}
// 配置唤醒源
void configure_wakeup_sources(uint32_t wakeup_sources) {
// 配置外部中断唤醒
if (wakeup_sources & WAKEUP_SOURCE_EXTI) {
EXTI->IMR |= EXTI_IMR_MR0; // 使能EXTI0中断
NVIC_EnableIRQ(EXTI0_IRQn);
}
// 配置RTC唤醒
if (wakeup_sources & WAKEUP_SOURCE_RTC) {
RTC->CR |= RTC_CR_WUTIE; // 使能RTC唤醒中断
NVIC_EnableIRQ(RTC_WKUP_IRQn);
}
// 配置UART唤醒
if (wakeup_sources & WAKEUP_SOURCE_UART) {
UART1->CR3 |= UART_CR3_WUFIE; // 使能UART唤醒中断
NVIC_EnableIRQ(UART1_IRQn);
}
// 配置CAN唤醒
if (wakeup_sources & WAKEUP_SOURCE_CAN) {
CAN1->IER |= CAN_IER_WKUIE; // 使能CAN唤醒中断
NVIC_EnableIRQ(CAN1_RX0_IRQn);
}
}
// 睡眠模式功耗优化
void optimize_sleep_power(void) {
// 关闭不必要的时钟
RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN);
// 降低GPIO驱动强度
configure_gpio_low_power();
// 关闭不必要的外设
disable_unused_peripherals();
// 配置模拟开关
configure_analog_switches_for_low_power();
}
停止模式(STOP)
停止模式下,CPU和大部分外设时钟停止,但RAM内容保持:
// 停止模式配置
typedef struct {
stop_mode_t stop_level; // 停止模式级别
bool flash_power_down; // Flash掉电
bool regulator_low_power; // 调节器低功耗模式
uint32_t wakeup_sources; // 唤醒源
uint32_t io_retention_mask; // IO保持掩码
} stop_config_t;
// 停止模式级别
typedef enum {
STOP_MODE_0, // 停止模式0 - 最快唤醒
STOP_MODE_1, // 停止模式1 - 平衡模式
STOP_MODE_2 // 停止模式2 - 最低功耗
} stop_mode_t;
// 进入停止模式
void enter_stop_mode(stop_config_t *config) {
// 保存外设状态
save_peripheral_context();
// 配置停止模式参数
configure_stop_mode_parameters(config);
// 配置唤醒源
configure_stop_wakeup_sources(config->wakeup_sources);
// 配置IO保持
configure_io_retention(config->io_retention_mask);
// 进入停止模式
PWR->CR1 |= PWR_CR1_PDDS; // 设置深度睡眠
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI(); // 等待中断唤醒
// 唤醒后恢复
restore_system_after_stop();
}
// 配置停止模式参数
void configure_stop_mode_parameters(stop_config_t *config) {
// 选择停止模式级别
switch (config->stop_level) {
case STOP_MODE_0:
PWR->CR1 &= ~PWR_CR1_LPMS; // 停止模式0
break;
case STOP_MODE_1:
PWR->CR1 = (PWR->CR1 & ~PWR_CR1_LPMS) | PWR_CR1_LPMS_0; // 停止模式1
break;
case STOP_MODE_2:
PWR->CR1 = (PWR->CR1 & ~PWR_CR1_LPMS) | PWR_CR1_LPMS_1; // 停止模式2
break;
}
// 配置Flash掉电
if (config->flash_power_down) {
PWR->CR1 |= PWR_CR1_FPDS;
}
// 配置调节器低功耗模式
if (config->regulator_low_power) {
PWR->CR1 |= PWR_CR1_LPDS;
}
}
// 配置IO保持
void configure_io_retention(uint32_t retention_mask) {
// 配置GPIOA保持
if (retention_mask & IO_RETENTION_GPIOA) {
PWR->PUCRA = 0xFFFF; // 上拉使能
PWR->PDCRA = 0x0000; // 下拉禁用
}
// 配置GPIOB保持
if (retention_mask & IO_RETENTION_GPIOB) {
PWR->PUCRB = 0xFFFF;
PWR->PDCRB = 0x0000;
}
// 配置GPIOC保持
if (retention_mask & IO_RETENTION_GPIOC) {
PWR->PUCRC = 0xFFFF;
PWR->PDCRC = 0x0000;
}
}
// 停止模式后恢复
void restore_system_after_stop(void) {
// 恢复系统时钟
SystemClock_Config();
// 恢复外设时钟
restore_peripheral_clocks();
// 恢复外设状态
restore_peripheral_context();
// 重新初始化必要的外设
reinitialize_critical_peripherals();
}
待机模式(STANDBY)
待机模式是最深的低功耗模式,除了备份域外所有内容都会丢失:
// 待机模式配置
typedef struct {
bool wakeup_pin1_enable; // 唤醒引脚1使能
bool wakeup_pin2_enable; // 唤醒引脚2使能
bool rtc_alarm_enable; // RTC闹钟唤醒
bool rtc_wakeup_enable; // RTC周期唤醒
wakeup_pin_polarity_t pin1_polarity; // 引脚1极性
wakeup_pin_polarity_t pin2_polarity; // 引脚2极性
} standby_config_t;
// 进入待机模式
void enter_standby_mode(standby_config_t *config) {
// 保存关键数据到备份寄存器
save_critical_data_to_backup_registers();
// 配置唤醒引脚
configure_standby_wakeup_pins(config);
// 配置RTC唤醒
if (config->rtc_alarm_enable || config->rtc_wakeup_enable) {
configure_rtc_standby_wakeup(config);
}
// 清除唤醒标志
PWR->SCR |= PWR_SCR_CWUF;
// 进入待机模式
PWR->CR1 |= PWR_CR1_PDDS;
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI(); // 系统不会从这里返回
}
// 配置待机唤醒引脚
void configure_standby_wakeup_pins(standby_config_t *config) {
if (config->wakeup_pin1_enable) {
PWR->CR3 |= PWR_CR3_EWUP1; // 使能唤醒引脚1
if (config->pin1_polarity == WAKEUP_PIN_FALLING) {
PWR->CR4 |= PWR_CR4_WP1; // 下降沿唤醒
}
}
if (config->wakeup_pin2_enable) {
PWR->CR3 |= PWR_CR3_EWUP2; // 使能唤醒引脚2
if (config->pin2_polarity == WAKEUP_PIN_FALLING) {
PWR->CR4 |= PWR_CR4_WP2; // 下降沿唤醒
}
}
}
// 保存关键数据到备份寄存器
void save_critical_data_to_backup_registers(void) {
// 使能备份域访问
PWR->CR1 |= PWR_CR1_DBP;
// 保存系统状态信息
RTC->BKP0R = get_system_state_word();
RTC->BKP1R = get_error_flags();
RTC->BKP2R = get_configuration_checksum();
RTC->BKP3R = get_runtime_hours();
RTC->BKP4R = STANDBY_MAGIC_NUMBER; // 标识从待机模式唤醒
// 禁用备份域访问
PWR->CR1 &= ~PWR_CR1_DBP;
}
// 待机模式唤醒处理
void handle_standby_wakeup(void) {
// 检查是否从待机模式唤醒
if (PWR->SR1 & PWR_SR1_SBF) {
// 清除待机标志
PWR->SCR |= PWR_SCR_CSBF;
// 读取备份寄存器数据
restore_critical_data_from_backup();
// 执行唤醒后初始化
perform_post_standby_initialization();
}
}
// 从备份寄存器恢复数据
void restore_critical_data_from_backup(void) {
// 使能备份域访问
PWR->CR1 |= PWR_CR1_DBP;
// 检查魔数
if (RTC->BKP4R == STANDBY_MAGIC_NUMBER) {
// 恢复系统状态
uint32_t system_state = RTC->BKP0R;
uint32_t error_flags = RTC->BKP1R;
uint32_t config_checksum = RTC->BKP2R;
uint32_t runtime_hours = RTC->BKP3R;
// 验证数据完整性
if (verify_backup_data_integrity(config_checksum)) {
restore_system_state(system_state);
restore_error_flags(error_flags);
set_runtime_hours(runtime_hours);
} else {
// 数据损坏,执行默认初始化
perform_default_initialization();
}
// 清除魔数
RTC->BKP4R = 0;
}
// 禁用备份域访问
PWR->CR1 &= ~PWR_CR1_DBP;
}
实际外设的低功耗配置
GPIO低功耗配置
// GPIO低功耗配置
void configure_gpio_low_power(void) {
GPIO_InitTypeDef gpio_init;
// 配置未使用的GPIO为模拟输入以减少功耗
gpio_init.Mode = GPIO_MODE_ANALOG;
gpio_init.Pull = GPIO_NOPULL;
gpio_init.Speed = GPIO_SPEED_FREQ_LOW;
// GPIOA未使用引脚
gpio_init.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_7;
HAL_GPIO_Init(GPIOA, &gpio_init);
// GPIOB未使用引脚
gpio_init.Pin = GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5;
HAL_GPIO_Init(GPIOB, &gpio_init);
// GPIOC未使用引脚
gpio_init.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
HAL_GPIO_Init(GPIOC, &gpio_init);
// 配置输出引脚为低电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
}
// GPIO唤醒配置
void configure_gpio_wakeup(uint16_t pin, GPIO_TypeDef *port) {
GPIO_InitTypeDef gpio_init;
uint32_t exti_line;
IRQn_Type irq_number;
// 配置GPIO为输入模式
gpio_init.Pin = pin;
gpio_init.Mode = GPIO_MODE_IT_FALLING; // 下降沿中断
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(port, &gpio_init);
// 获取EXTI线和中断号
exti_line = get_exti_line_from_pin(pin);
irq_number = get_irq_from_exti_line(exti_line);
// 使能中断
HAL_NVIC_SetPriority(irq_number, 0, 0);
HAL_NVIC_EnableIRQ(irq_number);
}
定时器低功耗配置
// 定时器低功耗配置
void configure_timer_low_power(void) {
// 使用LPTIM(低功耗定时器)替代普通定时器
LPTIM_HandleTypeDef hlptim1;
// 配置LPTIM1
hlptim1.Instance = LPTIM1;
hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;
hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
if (HAL_LPTIM_Init(&hlptim1) != HAL_OK) {
Error_Handler();
}
// 启动LPTIM周期模式
HAL_LPTIM_PWM_Start_IT(&hlptim1, 32768, 16384); // 50%占空比,1秒周期
}
// 普通定时器低功耗配置
void configure_regular_timer_low_power(void) {
// 关闭不必要的定时器
__HAL_RCC_TIM3_CLK_DISABLE();
__HAL_RCC_TIM4_CLK_DISABLE();
__HAL_RCC_TIM15_CLK_DISABLE();
// 保留必要的定时器,但降低频率
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7999; // 降低频率到1kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 1秒周期
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK) {
Error_Handler();
}
}
UART低功耗配置
// UART低功耗配置
void configure_uart_low_power(void) {
UART_HandleTypeDef huart1;
// 配置UART1为低功耗模式
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600; // 降低波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
// 使能UART唤醒功能
HAL_UARTEx_EnableStopMode(&huart1);
// 配置唤醒中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_WUF);
}
// LPUART配置(如果芯片支持)
void configure_lpuart(void) {
UART_HandleTypeDef hlpuart1;
// 配置LPUART1
hlpuart1.Instance = LPUART1;
hlpuart1.Init.BaudRate = 9600;
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
hlpuart1.Init.StopBits = UART_STOPBITS_1;
hlpuart1.Init.Parity = UART_PARITY_NONE;
hlpuart1.Init.Mode = UART_MODE_TX_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
Error_Handler();
}
}
ADC低功耗配置
// ADC低功耗配置
void configure_adc_low_power(void) {
ADC_HandleTypeDef hadc1;
// 配置ADC1为低功耗模式
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; // 降低ADC时钟
hadc1.Init.Resolution = ADC_RESOLUTION_8B; // 降低分辨率
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = ENABLE; // 使能自动等待
hadc1.Init.LowPowerAutoPowerOff = ENABLE; // 使能自动关断
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
// 配置ADC通道
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5; // 较长采样时间
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
}
// ADC间歇采样
void adc_intermittent_sampling(void) {
static uint32_t last_sample_time = 0;
uint32_t current_time = HAL_GetTick();
// 每5秒采样一次
if (current_time - last_sample_time >= 5000) {
// 启动ADC
HAL_ADC_Start(&hadc1);
// 等待转换完成
if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {
uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
process_adc_value(adc_value);
}
// 停止ADC
HAL_ADC_Stop(&hadc1);
last_sample_time = current_time;
}
}
CAN低功耗配置
// CAN低功耗配置
void configure_can_low_power(void) {
CAN_HandleTypeDef hcan1;
// 配置CAN1
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 16;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_1TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = DISABLE;
hcan1.Init.AutoWakeUp = ENABLE; // 使能自动唤醒
hcan1.Init.AutoRetransmission = DISABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK) {
Error_Handler();
}
// 配置CAN唤醒中断
__HAL_CAN_ENABLE_IT(&hcan1, CAN_IT_WKU);
// 进入CAN睡眠模式
HAL_CAN_RequestSleep(&hcan1);
}
// CAN唤醒处理
void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan) {
// CAN唤醒后的处理
record_system_activity(ACTIVITY_SOURCE_CAN);
// 退出睡眠模式
HAL_CAN_WakeUp(hcan);
}
电源监控与管理
电压监控
// 电压监控配置
void configure_voltage_monitoring(void) {
// 配置PVD(电源电压检测)
PWR_PVDTypeDef sConfigPVD;
sConfigPVD.PVDLevel = PWR_PVDLEVEL_6; // 2.9V阈值
sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;
HAL_PWR_ConfigPVD(&sConfigPVD);
HAL_PWR_EnablePVD();
// 使能PVD中断
HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
}
// PVD中断处理
void PVD_PVM_IRQHandler(void) {
HAL_PWR_PVD_IRQHandler();
}
void HAL_PWR_PVDCallback(void) {
// 电压过低处理
if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) {
// 电压低于阈值
handle_low_voltage_condition();
} else {
// 电压恢复正常
handle_voltage_recovery();
}
}
// 低电压处理
void handle_low_voltage_condition(void) {
// 保存关键数据
save_critical_system_data();
// 关闭非必要外设
disable_non_essential_peripherals();
// 降低系统频率
reduce_system_frequency();
// 进入低功耗模式
enter_emergency_low_power_mode();
}
电流测量
// 电流测量配置
void configure_current_measurement(void) {
// 使用ADC测量分流电阻上的电压来计算电流
ADC_HandleTypeDef hadc_current;
hadc_current.Instance = ADC2;
hadc_current.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
hadc_current.Init.Resolution = ADC_RESOLUTION_12B;
hadc_current.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc_current.Init.ContinuousConvMode = ENABLE;
hadc_current.Init.DiscontinuousConvMode = DISABLE;
hadc_current.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc_current.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc_current.Init.NbrOfConversion = 1;
hadc_current.Init.DMAContinuousRequests = ENABLE;
if (HAL_ADC_Init(&hadc_current) != HAL_OK) {
Error_Handler();
}
// 配置电流测量通道
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_2; // 电流测量通道
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc_current, &sConfig) != HAL_OK) {
Error_Handler();
}
}
// 功耗计算
float calculate_power_consumption(void) {
static uint32_t current_samples[100];
static uint8_t sample_index = 0;
// 获取电流ADC值
uint32_t adc_value = get_current_adc_value();
current_samples[sample_index] = adc_value;
sample_index = (sample_index + 1) % 100;
// 计算平均电流
uint32_t sum = 0;
for (int i = 0; i < 100; i++) {
sum += current_samples[i];
}
uint32_t avg_adc = sum / 100;
// 转换为实际电流值(mA)
float voltage = (avg_adc * 3.3f) / 4096.0f; // ADC电压
float current_ma = voltage / 0.1f; // 假设0.1Ω分流电阻
// 计算功耗(mW)
float supply_voltage = 3.3f; // 供电电压
float power_mw = current_ma * supply_voltage;
return power_mw;
}
汽车应用的低功耗策略
汽车休眠管理
// 汽车休眠管理
typedef struct {
vehicle_state_t vehicle_state; // 车辆状态
uint32_t ignition_off_time; // 熄火时间
uint32_t last_activity_time; // 最后活动时间
bool can_activity_detected; // CAN活动检测
bool door_activity_detected; // 车门活动检测
uint32_t sleep_stage; // 休眠阶段
} automotive_sleep_manager_t;
// 汽车休眠阶段
typedef enum {
SLEEP_STAGE_ACTIVE, // 活跃状态
SLEEP_STAGE_EARLY_SLEEP, // 早期休眠(30秒后)
SLEEP_STAGE_INTERMEDIATE_SLEEP, // 中期休眠(5分钟后)
SLEEP_STAGE_DEEP_SLEEP, // 深度休眠(30分钟后)
SLEEP_STAGE_HIBERNATION // 休眠状态(2小时后)
} automotive_sleep_stage_t;
// 汽车休眠管理初始化
void automotive_sleep_manager_init(void) {
automotive_sleep_manager_t *manager = get_sleep_manager();
manager->vehicle_state = VEHICLE_STATE_IGNITION_ON;
manager->ignition_off_time = 0;
manager->last_activity_time = HAL_GetTick();
manager->can_activity_detected = false;
manager->door_activity_detected = false;
manager->sleep_stage = SLEEP_STAGE_ACTIVE;
// 配置车辆状态检测
configure_ignition_detection();
configure_door_detection();
configure_can_activity_detection();
// 启动休眠管理任务
xTaskCreate(automotive_sleep_task, "AutoSleep", 512, NULL, 2, NULL);
}
// 汽车休眠管理任务
void automotive_sleep_task(void *param) {
automotive_sleep_manager_t *manager = get_sleep_manager();
uint32_t current_time;
uint32_t idle_time;
while (1) {
current_time = HAL_GetTick();
// 检查点火状态
if (is_ignition_on()) {
manager->vehicle_state = VEHICLE_STATE_IGNITION_ON;
manager->sleep_stage = SLEEP_STAGE_ACTIVE;
manager->last_activity_time = current_time;
} else {
manager->vehicle_state = VEHICLE_STATE_IGNITION_OFF;
if (manager->ignition_off_time == 0) {
manager->ignition_off_time = current_time;
}
}
// 检查活动
if (check_vehicle_activity()) {
manager->last_activity_time = current_time;
}
// 计算空闲时间
idle_time = current_time - manager->last_activity_time;
// 根据空闲时间确定休眠阶段
automotive_sleep_stage_t new_stage = determine_sleep_stage(idle_time);
if (new_stage != manager->sleep_stage) {
transition_to_sleep_stage(new_stage);
manager->sleep_stage = new_stage;
}
vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒检查周期
}
}
// 确定休眠阶段
automotive_sleep_stage_t determine_sleep_stage(uint32_t idle_time) {
if (idle_time < 30000) { // 30秒
return SLEEP_STAGE_ACTIVE;
} else if (idle_time < 300000) { // 5分钟
return SLEEP_STAGE_EARLY_SLEEP;
} else if (idle_time < 1800000) { // 30分钟
return SLEEP_STAGE_INTERMEDIATE_SLEEP;
} else if (idle_time < 7200000) { // 2小时
return SLEEP_STAGE_DEEP_SLEEP;
} else {
return SLEEP_STAGE_HIBERNATION;
}
}
// 切换到休眠阶段
void transition_to_sleep_stage(automotive_sleep_stage_t stage) {
switch (stage) {
case SLEEP_STAGE_ACTIVE:
// 全功能运行
enable_all_peripherals();
set_cpu_frequency(80000000); // 80MHz
break;
case SLEEP_STAGE_EARLY_SLEEP:
// 关闭非必要外设
disable_comfort_peripherals();
set_cpu_frequency(40000000); // 40MHz
break;
case SLEEP_STAGE_INTERMEDIATE_SLEEP:
// 进一步降低功耗
disable_infotainment_peripherals();
set_cpu_frequency(16000000); // 16MHz
enter_sleep_mode(get_intermediate_sleep_config());
break;
case SLEEP_STAGE_DEEP_SLEEP:
// 深度休眠
disable_most_peripherals();
enter_stop_mode(get_deep_sleep_config());
break;
case SLEEP_STAGE_HIBERNATION:
// 最深休眠
save_critical_data_to_backup_registers();
enter_standby_mode(get_hibernation_config());
break;
}
log_sleep_stage_transition(stage);
}
// 检查车辆活动
bool check_vehicle_activity(void) {
bool activity_detected = false;
// 检查CAN总线活动
if (is_can_message_received()) {
activity_detected = true;
}
// 检查车门活动
if (is_door_opened() || is_door_closed()) {
activity_detected = true;
}
// 检查按键活动
if (is_button_pressed()) {
activity_detected = true;
}
// 检查传感器活动
if (is_sensor_activity_detected()) {
activity_detected = true;
}
return activity_detected;
}
总结
YTM32B1ME0x的低功耗设计与电源管理系统为汽车电子应用提供了全面的节能解决方案。通过多种低功耗模式、智能电源管理、动态电压频率调节和针对汽车应用的休眠策略,能够在保证系统功能的同时最大化电池续航时间。
关键特性总结:
-
多级低功耗模式: 睡眠、停止、待机模式,功耗从mA级到μA级
-
智能唤醒机制: 支持多种唤醒源,快速响应外部事件
-
外设级电源管理: 独立控制各外设的电源状态
-
动态电压频率调节: 根据负载自动调整CPU频率和电压
-
汽车级休眠策略: 分阶段休眠管理,适应汽车应用场景
-
实时电源监控: 电压检测、电流测量、功耗统计
-
数据保护机制: 备份寄存器保存关键数据
-
快速恢复能力: 从低功耗模式快速恢复到正常工作状态
这些低功耗特性使YTM32B1ME0x能够满足汽车电子系统对长期待机、快速响应和低功耗的严格要求。
在下一篇文章中,我们将探讨YTM32B1ME0x的调试与开发工具,包括JTAG/SWD调试接口、片上调试功能、性能分析工具等内容。 PWR->CR1 = (PWR->CR1 & ~PWR_CR1_LPMS_Msk) | (config->stop_level << PWR_CR1_LPMS_Pos);
// 配置Flash掉电
if (config->flash_power_down) {
PWR->CR1 |= PWR_CR1_FPDS;
}
// 配置调节器模式
if (config->regulator_low_power) {
PWR->CR1 |= PWR_CR1_LPMS_0;
}
}
// 停止模式后系统恢复 void restore_system_after_stop(void) { // 重新配置系统时钟 SystemClock_Config();
// 恢复外设时钟 restore_peripheral_clocks(); // 恢复外设状态 restore_peripheral_context(); // 重新初始化关键外设 reinitialize_critical_peripherals();
}
// IO保持配置 void configure_io_retention(uint32_t retention_mask) { // 配置GPIO保持状态 for (int port = 0; port < 8; port++) { if (retention_mask & (1 << port)) { // 使能对应端口的IO保持 PWR->PUCRA |= (1 << port); // 上拉保持 PWR->PDCRA |= (1 << port); // 下拉保持 } } }
### 待机模式(STANDBY)
待机模式是最深的低功耗模式,除了备份域外所有内容都会丢失:
```c
// 待机模式配置
typedef struct {
bool rtc_wakeup_enable; // RTC唤醒使能
bool wakeup_pin_enable; // 唤醒引脚使能
uint32_t wakeup_pin_polarity; // 唤醒引脚极性
uint32_t backup_registers[32]; // 备份寄存器数据
standby_callback_t enter_callback; // 进入待机回调
} standby_config_t;
// 进入待机模式
void enter_standby_mode(standby_config_t *config) {
// 保存关键数据到备份寄存器
save_critical_data_to_backup(config->backup_registers);
// 配置RTC唤醒
if (config->rtc_wakeup_enable) {
configure_rtc_wakeup();
}
// 配置唤醒引脚
if (config->wakeup_pin_enable) {
configure_wakeup_pins(config->wakeup_pin_polarity);
}
// 清除唤醒标志
PWR->SCR |= PWR_SCR_CWUF;
// 调用进入待机回调
if (config->enter_callback) {
config->enter_callback();
}
// 进入待机模式
PWR->CR1 |= PWR_CR1_PDDS;
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI(); // 系统将重启而不是返回
}
// 配置RTC唤醒
void configure_rtc_wakeup(void) {
// 使能RTC时钟
RCC->APB1ENR |= RCC_APB1ENR_RTCAPBEN;
// 配置RTC唤醒定时器
RTC->WPR = 0xCA; // 解锁写保护
RTC->WPR = 0x53;
// 禁用唤醒定时器
RTC->CR &= ~RTC_CR_WUTE;
while (!(RTC->ISR & RTC_ISR_WUTWF));
// 配置唤醒时钟源和周期
RTC->WUTR = 32768; // 1秒唤醒(32.768kHz LSE)
RTC->CR |= RTC_CR_WUCKSEL_2; // 选择ck_spre时钟
// 使能唤醒中断
RTC->CR |= RTC_CR_WUTIE;
RTC->CR |= RTC_CR_WUTE;
// 锁定写保护
RTC->WPR = 0xFF;
// 使能NVIC中断
NVIC_EnableIRQ(RTC_WKUP_IRQn);
}
// 配置唤醒引脚
void configure_wakeup_pins(uint32_t polarity) {
// 使能唤醒引脚1
PWR->CR3 |= PWR_CR3_EWUP1;
// 配置唤醒极性
if (polarity & WAKEUP_PIN1_RISING) {
PWR->CR4 |= PWR_CR4_WP1;
} else {
PWR->CR4 &= ~PWR_CR4_WP1;
}
// 使能唤醒引脚2
PWR->CR3 |= PWR_CR3_EWUP2;
if (polarity & WAKEUP_PIN2_RISING) {
PWR->CR4 |= PWR_CR4_WP2;
} else {
PWR->CR4 &= ~PWR_CR4_WP2;
}
}
// 待机模式唤醒处理
void handle_standby_wakeup(void) {
// 检查唤醒源
if (PWR->SR1 & PWR_SR1_WUF1) {
// 唤醒引脚1唤醒
handle_wakeup_pin1();
PWR->SCR |= PWR_SCR_CWUF1;
}
if (PWR->SR1 & PWR_SR1_WUF2) {
// 唤醒引脚2唤醒
handle_wakeup_pin2();
PWR->SCR |= PWR_SCR_CWUF2;
}
if (RTC->ISR & RTC_ISR_WUTF) {
// RTC唤醒
handle_rtc_wakeup();
RTC->ISR &= ~RTC_ISR_WUTF;
}
// 恢复关键数据
restore_critical_data_from_backup();
// 重新初始化系统
system_reinitialize_after_standby();
}
动态电压频率调节(DVFS)
DVFS系统架构
// DVFS配置结构
typedef struct {
uint32_t cpu_frequency; // CPU频率
uint32_t voltage_level; // 电压等级
uint32_t flash_latency; // Flash等待周期
uint32_t ahb_prescaler; // AHB预分频
uint32_t apb1_prescaler; // APB1预分频
uint32_t apb2_prescaler; // APB2预分频
} dvfs_config_t;
// 电压等级定义
typedef enum {
VOLTAGE_LEVEL_1 = 0, // 1.2V - 最高性能
VOLTAGE_LEVEL_2 = 1, // 1.1V - 平衡模式
VOLTAGE_LEVEL_3 = 2, // 1.0V - 低功耗模式
VOLTAGE_LEVEL_4 = 3 // 0.9V - 超低功耗
} voltage_level_t;
// DVFS性能等级
typedef struct {
const char *name;
uint32_t cpu_freq_mhz;
voltage_level_t voltage;
uint32_t power_consumption_mw;
uint32_t flash_latency;
} dvfs_performance_level_t;
// 预定义的性能等级
static const dvfs_performance_level_t performance_levels[] = {
{"High Performance", 80, VOLTAGE_LEVEL_1, 50, 2},
{"Balanced", 48, VOLTAGE_LEVEL_2, 30, 1},
{"Power Save", 24, VOLTAGE_LEVEL_3, 15, 1},
{"Ultra Low Power", 8, VOLTAGE_LEVEL_4, 5, 0}
};
// DVFS初始化
void dvfs_init(void) {
// 使能电压调节器
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
// 配置电压调节器
PWR->CR1 |= PWR_CR1_VOS_0; // 电压范围1(最高性能)
// 等待电压稳定
while (PWR->SR2 & PWR_SR2_VOSF);
// 初始化为高性能模式
dvfs_set_performance_level(0);
}
// 设置性能等级
void dvfs_set_performance_level(uint32_t level) {
if (level >= sizeof(performance_levels) / sizeof(performance_levels[0])) {
return;
}
const dvfs_performance_level_t *perf = &performance_levels[level];
// 如果需要提高电压,先调整电压
if (perf->voltage < get_current_voltage_level()) {
set_voltage_level(perf->voltage);
}
// 调整Flash等待周期
set_flash_latency(perf->flash_latency);
// 调整CPU频率
set_cpu_frequency(perf->cpu_freq_mhz);
// 如果需要降低电压,后调整电压
if (perf->voltage > get_current_voltage_level()) {
set_voltage_level(perf->voltage);
}
// 更新系统时钟变量
SystemCoreClockUpdate();
// 记录性能等级变化
log_performance_level_change(level, perf->name);
}
// 设置电压等级
void set_voltage_level(voltage_level_t voltage) {
// 配置电压调节器输出电压
PWR->CR1 = (PWR->CR1 & ~PWR_CR1_VOS_Msk) | (voltage << PWR_CR1_VOS_Pos);
// 等待电压稳定
while (PWR->SR2 & PWR_SR2_VOSF);
// 根据电压调整其他参数
adjust_parameters_for_voltage(voltage);
}
// 设置CPU频率
void set_cpu_frequency(uint32_t freq_mhz) {
uint32_t pll_m, pll_n, pll_p;
// 计算PLL参数
calculate_pll_parameters(freq_mhz, &pll_m, &pll_n, &pll_p);
// 切换到HSI
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_HSI;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI);
// 禁用PLL
RCC->CR &= ~RCC_CR_PLLON;
while (RCC->CR & RCC_CR_PLLRDY);
// 配置新的PLL参数
RCC->PLLCFGR = (pll_m << RCC_PLLCFGR_PLLM_Pos) |
(pll_n << RCC_PLLCFGR_PLLN_Pos) |
(pll_p << RCC_PLLCFGR_PLLP_Pos) |
RCC_PLLCFGR_PLLSRC_HSE;
// 使能PLL
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY));
// 切换到PLL
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
}
// 自适应DVFS
typedef struct {
uint32_t cpu_utilization; // CPU利用率
uint32_t current_level; // 当前性能等级
uint32_t target_level; // 目标性能等级
uint32_t transition_delay; // 转换延迟
uint32_t last_transition; // 上次转换时间
bool auto_scaling_enabled; // 自动调频使能
} adaptive_dvfs_t;
// 自适应DVFS任务
void adaptive_dvfs_task(void *param) {
adaptive_dvfs_t *dvfs = (adaptive_dvfs_t*)param;
while (1) {
if (dvfs->auto_scaling_enabled) {
// 测量CPU利用率
dvfs->cpu_utilization = measure_cpu_utilization();
// 根据利用率调整性能等级
uint32_t new_level = calculate_optimal_performance_level(dvfs->cpu_utilization);
if (new_level != dvfs->current_level) {
uint32_t current_time = get_system_time();
// 检查转换延迟
if (current_time - dvfs->last_transition > dvfs->transition_delay) {
dvfs_set_performance_level(new_level);
dvfs->current_level = new_level;
dvfs->last_transition = current_time;
}
}
}
vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒检查周期
}
}
// 计算最优性能等级
uint32_t calculate_optimal_performance_level(uint32_t cpu_utilization) {
if (cpu_utilization > 80) {
return 0; // 高性能模式
} else if (cpu_utilization > 50) {
return 1; // 平衡模式
} else if (cpu_utilization > 20) {
return 2; // 节能模式
} else {
return 3; // 超低功耗模式
}
}
外设功耗管理
外设时钟门控
// 外设功耗管理
typedef struct {
uint32_t ahb1_peripherals; // AHB1外设掩码
uint32_t ahb2_peripherals; // AHB2外设掩码
uint32_t apb1_peripherals; // APB1外设掩码
uint32_t apb2_peripherals; // APB2外设掩码
bool auto_clock_gating; // 自动时钟门控
} peripheral_power_config_t;
// 外设功耗状态
typedef enum {
PERIPHERAL_POWER_ON, // 外设开启
PERIPHERAL_POWER_CLOCK_GATED, // 时钟门控
PERIPHERAL_POWER_OFF // 外设关闭
} peripheral_power_state_t;
// 外设功耗管理器
typedef struct {
peripheral_power_state_t states[64]; // 外设状态数组
uint32_t usage_counters[64]; // 使用计数器
uint32_t idle_timeouts[64]; // 空闲超时
bool power_management_enabled; // 功耗管理使能
} peripheral_power_manager_t;
// 外设功耗管理初始化
void peripheral_power_manager_init(peripheral_power_manager_t *ppm) {
// 初始化所有外设为关闭状态
for (int i = 0; i < 64; i++) {
ppm->states[i] = PERIPHERAL_POWER_OFF;
ppm->usage_counters[i] = 0;
ppm->idle_timeouts[i] = DEFAULT_IDLE_TIMEOUT;
}
ppm->power_management_enabled = true;
// 启动功耗管理任务
start_peripheral_power_management_task(ppm);
}
// 请求外设电源
void request_peripheral_power(peripheral_id_t peripheral) {
peripheral_power_manager_t *ppm = get_peripheral_power_manager();
if (ppm->states[peripheral] == PERIPHERAL_POWER_OFF) {
// 开启外设时钟
enable_peripheral_clock(peripheral);
ppm->states[peripheral] = PERIPHERAL_POWER_ON;
}
// 增加使用计数
ppm->usage_counters[peripheral]++;
}
// 释放外设电源
void release_peripheral_power(peripheral_id_t peripheral) {
peripheral_power_manager_t *ppm = get_peripheral_power_manager();
if (ppm->usage_counters[peripheral] > 0) {
ppm->usage_counters[peripheral]--;
// 如果没有使用者,启动空闲定时器
if (ppm->usage_counters[peripheral] == 0) {
start_peripheral_idle_timer(peripheral);
}
}
}
// 外设功耗管理任务
void peripheral_power_management_task(void *param) {
peripheral_power_manager_t *ppm = (peripheral_power_manager_t*)param;
while (1) {
if (ppm->power_management_enabled) {
for (int i = 0; i < 64; i++) {
// 检查空闲外设
if (ppm->states[i] == PERIPHERAL_POWER_ON &&
ppm->usage_counters[i] == 0) {
if (check_peripheral_idle_timeout(i)) {
// 关闭空闲外设
disable_peripheral_clock(i);
ppm->states[i] = PERIPHERAL_POWER_CLOCK_GATED;
}
}
}
}
vTaskDelay(pdMS_TO_TICKS(100)); // 100ms检查周期
}
}
// 智能外设调度
void smart_peripheral_scheduling(void) {
// 根据系统负载调整外设优先级
uint32_t system_load = get_system_load();
if (system_load > 80) {
// 高负载:关闭非关键外设
disable_non_critical_peripherals();
} else if (system_load < 20) {
// 低负载:可以开启更多外设
enable_optional_peripherals();
}
// 动态调整外设时钟频率
adjust_peripheral_clock_frequencies(system_load);
}
电池管理与充电控制
电池监控系统
// 电池状态结构
typedef struct {
float voltage; // 电池电压
float current; // 电池电流
float temperature; // 电池温度
uint32_t capacity_mah; // 电池容量
uint32_t remaining_mah; // 剩余容量
uint8_t soc_percent; // 电量百分比
battery_state_t state; // 电池状态
bool charging; // 充电状态
bool low_battery_warning; // 低电量警告
} battery_status_t;
// 电池状态枚举
typedef enum {
BATTERY_STATE_NORMAL, // 正常状态
BATTERY_STATE_LOW, // 低电量
BATTERY_STATE_CRITICAL, // 电量严重不足
BATTERY_STATE_CHARGING, // 充电中
BATTERY_STATE_FULL, // 电量充满
BATTERY_STATE_ERROR // 电池错误
} battery_state_t;
// 充电控制结构
typedef struct {
bool charging_enabled; // 充电使能
uint32_t charge_current_ma; // 充电电流
uint32_t charge_voltage_mv; // 充电电压
uint32_t charge_timeout_min; // 充电超时
charge_mode_t charge_mode; // 充电模式
bool trickle_charge; // 涓流充电
} charge_control_t;
// 充电模式
typedef enum {
CHARGE_MODE_CC, // 恒流充电
CHARGE_MODE_CV, // 恒压充电
CHARGE_MODE_CCCV, // 恒流恒压充电
CHARGE_MODE_PULSE // 脉冲充电
} charge_mode_t;
// 电池管理系统初始化
void battery_management_init(void) {
// 初始化ADC用于电池监控
init_battery_monitoring_adc();
// 初始化充电控制GPIO
init_charge_control_gpio();
// 初始化电池状态
battery_status_t *battery = get_battery_status();
battery->state = BATTERY_STATE_NORMAL;
battery->charging = false;
battery->low_battery_warning = false;
// 启动电池监控任务
start_battery_monitoring_task();
}
// 电池监控任务
void battery_monitoring_task(void *param) {
battery_status_t *battery = get_battery_status();
while (1) {
// 读取电池电压
battery->voltage = read_battery_voltage();
// 读取电池电流
battery->current = read_battery_current();
// 读取电池温度
battery->temperature = read_battery_temperature();
// 计算电量百分比
battery->soc_percent = calculate_soc(battery->voltage, battery->current);
// 更新电池状态
update_battery_state(battery);
// 检查充电状态
check_charging_status(battery);
// 执行电池保护
execute_battery_protection(battery);
vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒监控周期
}
}
// 计算电量百分比
uint8_t calculate_soc(float voltage, float current) {
// 基于电压的SOC估算
float voltage_soc = voltage_to_soc_lookup(voltage);
// 基于库仑计数的SOC估算
static float coulomb_count = 0;
coulomb_count += current * (1.0 / 3600.0); // 1秒采样间隔
float coulomb_soc = (BATTERY_CAPACITY_MAH - coulomb_count) / BATTERY_CAPACITY_MAH * 100;
// 融合两种估算方法
float soc = (voltage_soc * 0.3 + coulomb_soc * 0.7);
// 限制范围
if (soc > 100) soc = 100;
if (soc < 0) soc = 0;
return (uint8_t)soc;
}
// 电池保护
void execute_battery_protection(battery_status_t *battery) {
// 过压保护
if (battery->voltage > BATTERY_OVERVOLTAGE_THRESHOLD) {
stop_charging();
enter_battery_protection_mode(PROTECTION_OVERVOLTAGE);
}
// 欠压保护
if (battery->voltage < BATTERY_UNDERVOLTAGE_THRESHOLD) {
enter_low_power_emergency_mode();
enter_battery_protection_mode(PROTECTION_UNDERVOLTAGE);
}
// 过流保护
if (abs(battery->current) > BATTERY_OVERCURRENT_THRESHOLD) {
disconnect_battery_load();
enter_battery_protection_mode(PROTECTION_OVERCURRENT);
}
// 过温保护
if (battery->temperature > BATTERY_OVERTEMP_THRESHOLD) {
stop_charging();
reduce_system_performance();
enter_battery_protection_mode(PROTECTION_OVERTEMP);
}
// 低温保护
if (battery->temperature < BATTERY_UNDERTEMP_THRESHOLD) {
stop_charging();
enter_battery_protection_mode(PROTECTION_UNDERTEMP);
}
}
// 充电控制
void charge_control_task(void *param) {
charge_control_t *charge = get_charge_control();
battery_status_t *battery = get_battery_status();
while (1) {
if (charge->charging_enabled && is_charger_connected()) {
switch (charge->charge_mode) {
case CHARGE_MODE_CCCV:
execute_cccv_charging(charge, battery);
break;
case CHARGE_MODE_PULSE:
execute_pulse_charging(charge, battery);
break;
default:
execute_standard_charging(charge, battery);
break;
}
}
vTaskDelay(pdMS_TO_TICKS(100)); // 100ms控制周期
}
}
// 恒流恒压充电
void execute_cccv_charging(charge_control_t *charge, battery_status_t *battery) {
if (battery->voltage < CHARGE_CV_THRESHOLD) {
// 恒流阶段
set_charge_current(charge->charge_current_ma);
set_charge_mode_cc();
} else {
// 恒压阶段
set_charge_voltage(charge->charge_voltage_mv);
set_charge_mode_cv();
// 检查充电完成
if (battery->current < CHARGE_TERMINATION_CURRENT) {
stop_charging();
battery->state = BATTERY_STATE_FULL;
}
}
}
功耗测量与优化
功耗测量系统
// 功耗测量结构
typedef struct {
float vdd_current_ma; // VDD电流
float vdda_current_ma; // VDDA电流
float vbat_current_ma; // VBAT电流
float total_power_mw; // 总功耗
uint32_t measurement_count; // 测量次数
float average_power_mw; // 平均功耗
float peak_power_mw; // 峰值功耗
uint32_t measurement_time; // 测量时间
} power_measurement_t;
// 功耗分析结构
typedef struct {
float cpu_power_percent; // CPU功耗占比
float peripheral_power_percent; // 外设功耗占比
float memory_power_percent; // 内存功耗占比
float analog_power_percent; // 模拟功耗占比
float leakage_power_percent; // 漏电功耗占比
} power_analysis_t;
// 功耗测量初始化
void power_measurement_init(void) {
// 初始化电流测量ADC
init_current_measurement_adc();
// 初始化功耗测量定时器
init_power_measurement_timer();
// 启动功耗测量任务
start_power_measurement_task();
}
// 功耗测量任务
void power_measurement_task(void *param) {
power_measurement_t *measurement = get_power_measurement();
while (1) {
// 测量各电源域电流
measurement->vdd_current_ma = measure_vdd_current();
measurement->vdda_current_ma = measure_vdda_current();
measurement->vbat_current_ma = measure_vbat_current();
// 计算总功耗
measurement->total_power_mw =
measurement->vdd_current_ma * 3.3 +
measurement->vdda_current_ma * 3.3 +
measurement->vbat_current_ma * 3.0;
// 更新统计信息
update_power_statistics(measurement);
// 执行功耗分析
perform_power_analysis();
vTaskDelay(pdMS_TO_TICKS(100)); // 100ms测量周期
}
}
// 功耗优化建议
void generate_power_optimization_suggestions(void) {
power_analysis_t *analysis = get_power_analysis();
// 分析CPU功耗
if (analysis->cpu_power_percent > 60) {
suggest_cpu_optimization();
}
// 分析外设功耗
if (analysis->peripheral_power_percent > 30) {
suggest_peripheral_optimization();
}
// 分析内存功耗
if (analysis->memory_power_percent > 20) {
suggest_memory_optimization();
}
// 分析模拟功耗
if (analysis->analog_power_percent > 15) {
suggest_analog_optimization();
}
}
// CPU功耗优化建议
void suggest_cpu_optimization(void) {
printf("CPU Power Optimization Suggestions:\n");
printf("1. Reduce CPU frequency using DVFS\n");
printf("2. Use sleep mode during idle periods\n");
printf("3. Optimize code for better efficiency\n");
printf("4. Use DMA for data transfers\n");
}
// 外设功耗优化建议
void suggest_peripheral_optimization(void) {
printf("Peripheral Power Optimization Suggestions:\n");
printf("1. Disable unused peripherals\n");
printf("2. Use clock gating for idle peripherals\n");
printf("3. Reduce peripheral clock frequencies\n");
printf("4. Use interrupt-driven instead of polling\n");
}
汽车应用功耗场景
汽车功耗管理实例
// 汽车功耗场景
typedef enum {
VEHICLE_MODE_IGNITION_OFF, // 点火关闭
VEHICLE_MODE_ACCESSORY, // 附件模式
VEHICLE_MODE_IGNITION_ON, // 点火开启
VEHICLE_MODE_ENGINE_RUNNING, // 发动机运行
VEHICLE_MODE_SLEEP, // 休眠模式
VEHICLE_MODE_DEEP_SLEEP // 深度休眠
} vehicle_mode_t;
// 汽车功耗管理器
typedef struct {
vehicle_mode_t current_mode; // 当前模式
uint32_t mode_entry_time; // 模式进入时间
uint32_t sleep_timeout; // 休眠超时
uint32_t deep_sleep_timeout; // 深度休眠超时
bool can_wakeup_enabled; // CAN唤醒使能
bool key_wakeup_enabled; // 钥匙唤醒使能
automotive_power_config_t config; // 功耗配置
} automotive_power_manager_t;
// 汽车功耗配置
typedef struct {
uint32_t ignition_off_power_budget_mw; // 点火关闭功耗预算
uint32_t sleep_power_budget_mw; // 休眠功耗预算
uint32_t deep_sleep_power_budget_mw; // 深度休眠功耗预算
uint32_t sleep_delay_minutes; // 休眠延迟
uint32_t deep_sleep_delay_hours; // 深度休眠延迟
} automotive_power_config_t;
// 汽车功耗管理初始化
void automotive_power_manager_init(automotive_power_manager_t *apm) {
apm->current_mode = VEHICLE_MODE_IGNITION_OFF;
apm->mode_entry_time = get_system_time();
apm->sleep_timeout = 30 * 60 * 1000; // 30分钟
apm->deep_sleep_timeout = 24 * 60 * 60 * 1000; // 24小时
apm->can_wakeup_enabled = true;
apm->key_wakeup_enabled = true;
// 配置功耗预算
apm->config.ignition_off_power_budget_mw = 50; // 50mW
apm->config.sleep_power_budget_mw = 10; // 10mW
apm->config.deep_sleep_power_budget_mw = 2; // 2mW
// 启动汽车功耗管理任务
start_automotive_power_management_task(apm);
}
// 汽车模式转换
void automotive_mode_transition(automotive_power_manager_t *apm, vehicle_mode_t new_mode) {
// 退出当前模式
exit_vehicle_mode(apm->current_mode);
// 记录模式转换
log_vehicle_mode_transition(apm->current_mode, new_mode);
// 更新状态
apm->current_mode = new_mode;
apm->mode_entry_time = get_system_time();
// 进入新模式
enter_vehicle_mode(new_mode);
}
// 进入车辆模式
void enter_vehicle_mode(vehicle_mode_t mode) {
switch (mode) {
case VEHICLE_MODE_IGNITION_OFF:
enter_ignition_off_mode();
break;
case VEHICLE_MODE_ACCESSORY:
enter_accessory_mode();
break;
case VEHICLE_MODE_IGNITION_ON:
enter_ignition_on_mode();
break;
case VEHICLE_MODE_ENGINE_RUNNING:
enter_engine_running_mode();
break;
case VEHICLE_MODE_SLEEP:
enter_vehicle_sleep_mode();
break;
case VEHICLE_MODE_DEEP_SLEEP:
enter_vehicle_deep_sleep_mode();
break;
}
}
// 点火关闭模式
void enter_ignition_off_mode(void) {
// 关闭非必要外设
disable_non_essential_peripherals();
// 降低CPU频率
dvfs_set_performance_level(2); // 节能模式
// 配置CAN为低功耗模式
configure_can_low_power_mode();
// 保持关键功能
keep_essential_functions_active();
// 启动休眠定时器
start_sleep_timer(30 * 60); // 30分钟后进入休眠
}
// 车辆休眠模式
void enter_vehicle_sleep_mode(void) {
// 保存关键数据
save_critical_vehicle_data();
// 关闭大部分外设
shutdown_most_peripherals();
// 保持CAN唤醒功能
configure_can_wakeup();
// 保持钥匙检测
configure_key_detection_wakeup();
// 进入停止模式
stop_config_t stop_config = {
.stop_level = STOP_MODE_2,
.flash_power_down = true,
.regulator_low_power = true,
.wakeup_sources = WAKEUP_SOURCE_CAN | WAKEUP_SOURCE_EXTI,
.io_retention_mask = 0xFF
};
enter_stop_mode(&stop_config);
}
// 车辆深度休眠模式
void enter_vehicle_deep_sleep_mode(void) {
// 保存所有必要数据到备份域
save_all_data_to_backup_domain();
// 关闭所有非关键功能
shutdown_all_non_critical_functions();
// 配置最小唤醒源
configure_minimal_wakeup_sources();
// 进入待机模式
standby_config_t standby_config = {
.rtc_wakeup_enable = true,
.wakeup_pin_enable = true,
.wakeup_pin_polarity = WAKEUP_PIN1_RISING,
.enter_callback = deep_sleep_enter_callback
};
enter_standby_mode(&standby_config);
}
// 汽车功耗管理任务
void automotive_power_management_task(void *param) {
automotive_power_manager_t *apm = (automotive_power_manager_t*)param;
while (1) {
uint32_t current_time = get_system_time();
uint32_t time_in_mode = current_time - apm->mode_entry_time;
// 检查模式转换条件
switch (apm->current_mode) {
case VEHICLE_MODE_IGNITION_OFF:
if (time_in_mode > apm->sleep_timeout) {
automotive_mode_transition(apm, VEHICLE_MODE_SLEEP);
}
break;
case VEHICLE_MODE_SLEEP:
if (time_in_mode > apm->deep_sleep_timeout) {
automotive_mode_transition(apm, VEHICLE_MODE_DEEP_SLEEP);
}
break;
}
// 监控功耗预算
monitor_power_budget(apm);
vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒检查周期
}
}
// 监控功耗预算
void monitor_power_budget(automotive_power_manager_t *apm) {
float current_power = get_current_power_consumption();
float budget = get_power_budget_for_mode(apm->current_mode);
if (current_power > budget * 1.1) { // 超出预算10%
// 执行功耗优化
execute_power_optimization_for_mode(apm->current_mode);
// 记录功耗超标事件
log_power_budget_exceeded(apm->current_mode, current_power, budget);
}
}
总结
YTM32B1ME0x的低功耗设计与电源管理系统为汽车电子应用提供了全面的功耗控制解决方案。通过多种低功耗模式、动态电压频率调节、智能外设管理、电池管理和汽车特定的功耗场景支持,能够在保证系统性能的同时最大化电池续航时间。
关键特性总结:
-
多层次低功耗模式: 睡眠、停止、待机等多种模式,功耗从50mA到1μA
-
动态电压频率调节: 自适应DVFS系统,根据负载动态调整性能和功耗
-
智能外设管理: 外设时钟门控、使用计数和空闲超时管理
-
电池管理系统: 完整的电池监控、充电控制和保护机制
-
功耗测量分析: 实时功耗监控和优化建议系统
-
汽车应用场景: 针对汽车点火、休眠等场景的专门功耗管理
-
电源域管理: 多电源域独立控制,支持部分功能保持
-
唤醒源配置: 灵活的唤醒源配置,支持CAN、RTC、外部中断等
这些功耗管理特性的综合应用,使YTM32B1ME0x能够满足汽车电子系统对低功耗的严格要求,特别是在车辆熄火后的长期待机场景中。
在下一篇文章中,我们将探讨YTM32B1ME0x的调试与开发工具,包括JTAG/SWD调试接口、跟踪功能、性能分析等开发支持特性。
1168

被折叠的 条评论
为什么被折叠?



