最近我在一个低功耗项目中使用了极海(Geehy)MCU,经过一些测试后,发现极海MCU的低功耗模式表现不错。为了帮助大家更好地应用这个功能,我整理了一个简单的低功耗模式切换的代码实例,希望对你们有所帮助。
实现目标- 使用极海MCU进入低功耗模式,并在外部中断触发时唤醒。
- 进入低功耗模式时关闭系统时钟,降低功耗。
配置步骤- 系统时钟配置:配置主时钟源和外部晶振。
- 低功耗模式配置:使用极海MCU的低功耗模式寄存器,进入休眠或停止模式。
- 中断配置:设置外部按键中断,在低功耗模式下触发MCU唤醒。
代码实现#include "geehy_mcu.h"
void SystemClock_Config(void);
void Enter_LowPowerMode(void);
void WakeUp_Handler(void);
int main(void)
{
// 系统初始化
HAL_Init();
SystemClock_Config();
// 配置外部中断
HAL_GPIO_EXTI_Callback(GPIO_PIN_0);
// 进入低功耗模式
Enter_LowPowerMode();
while (1)
{
// 主循环空转,等待中断唤醒
}
}
// 配置系统时钟
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 配置外部晶振
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 配置系统时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}
// 进入低功耗模式函数
void Enter_LowPowerMode(void)
{
// 禁用外设时钟,减少功耗
__HAL_RCC_GPIOA_CLK_DISABLE();
__HAL_RCC_GPIOB_CLK_DISABLE();
// 设置 MCU 进入 STOP 模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
// 唤醒回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
// 外部中断唤醒 MCU
WakeUp_Handler();
}
}
// 唤醒处理函数
void WakeUp_Handler(void)
{
// 重新配置系统时钟,恢复正常运行
SystemClock_Config();
// 执行唤醒后的逻辑
printf("MCU 已唤醒!\n");
}
代码解释- Enter_LowPowerMode():这个函数通过设置电源寄存器使MCU进入STOP模式,并关闭不必要的外设时钟,从而减少功耗。
- HAL_GPIO_EXTI_Callback():当按键或外部信号触发中断时,MCU从低功耗模式中唤醒。
- WakeUp_Handler():唤醒后,系统重新配置时钟,并恢复正常操作。
注意事项- 确保外部晶振配置正确,以防止唤醒后时钟出错。
- 根据实际项目调整低功耗模式(STOP模式或STANDBY模式)的选择。
通过这个简单的代码例子,我成功地让极海MCU在低功耗应用中实现了外部中断唤醒。希望对你们的极海MCU开发有所帮助!如果有任何问题,欢迎一起讨论!
希望这篇关于极海MCU的低功耗应用代码能对你们有所启发!
|