[应用方案] 极海MCU低功耗模式应用与代码实现

[复制链接]
1033|9
 楼主| 童雨竹 发表于 2024-10-4 14:22 | 显示全部楼层 |阅读模式

最近我在一个低功耗项目中使用了极海(Geehy)MCU,经过一些测试后,发现极海MCU的低功耗模式表现不错。为了帮助大家更好地应用这个功能,我整理了一个简单的低功耗模式切换的代码实例,希望对你们有所帮助。

实现目标
  • 使用极海MCU进入低功耗模式,并在外部中断触发时唤醒。
  • 进入低功耗模式时关闭系统时钟,降低功耗。

配置步骤
  • 系统时钟配置:配置主时钟源和外部晶振。
  • 低功耗模式配置:使用极海MCU的低功耗模式寄存器,进入休眠或停止模式。
  • 中断配置:设置外部按键中断,在低功耗模式下触发MCU唤醒。

代码实现
  1. #include "geehy_mcu.h"

  2. void SystemClock_Config(void);
  3. void Enter_LowPowerMode(void);
  4. void WakeUp_Handler(void);

  5. int main(void)
  6. {
  7.     // 系统初始化
  8.     HAL_Init();
  9.     SystemClock_Config();
  10.    
  11.     // 配置外部中断
  12.     HAL_GPIO_EXTI_Callback(GPIO_PIN_0);

  13.     // 进入低功耗模式
  14.     Enter_LowPowerMode();
  15.    
  16.     while (1)
  17.     {
  18.         // 主循环空转,等待中断唤醒
  19.     }
  20. }

  21. // 配置系统时钟
  22. void SystemClock_Config(void)
  23. {
  24.     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  25.     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  26.     // 配置外部晶振
  27.     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  28.     RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  29.     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  30.     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  31.     RCC_OscInitStruct.PLL.PLLM = 8;
  32.     RCC_OscInitStruct.PLL.PLLN = 336;
  33.     RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  34.     HAL_RCC_OscConfig(&RCC_OscInitStruct);

  35.     // 配置系统时钟
  36.     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  37.     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  38.     HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
  39. }

  40. // 进入低功耗模式函数
  41. void Enter_LowPowerMode(void)
  42. {
  43.     // 禁用外设时钟,减少功耗
  44.     __HAL_RCC_GPIOA_CLK_DISABLE();
  45.     __HAL_RCC_GPIOB_CLK_DISABLE();

  46.     // 设置 MCU 进入 STOP 模式
  47.     HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  48. }

  49. // 唤醒回调函数
  50. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  51. {
  52.     if (GPIO_Pin == GPIO_PIN_0)
  53.     {
  54.         // 外部中断唤醒 MCU
  55.         WakeUp_Handler();
  56.     }
  57. }

  58. // 唤醒处理函数
  59. void WakeUp_Handler(void)
  60. {
  61.     // 重新配置系统时钟,恢复正常运行
  62.     SystemClock_Config();
  63.     // 执行唤醒后的逻辑
  64.     printf("MCU 已唤醒!\n");
  65. }

代码解释
  • Enter_LowPowerMode():这个函数通过设置电源寄存器使MCU进入STOP模式,并关闭不必要的外设时钟,从而减少功耗。
  • HAL_GPIO_EXTI_Callback():当按键或外部信号触发中断时,MCU从低功耗模式中唤醒。
  • WakeUp_Handler():唤醒后,系统重新配置时钟,并恢复正常操作。

注意事项
  • 确保外部晶振配置正确,以防止唤醒后时钟出错。
  • 根据实际项目调整低功耗模式(STOP模式或STANDBY模式)的选择。
通过这个简单的代码例子,我成功地让极海MCU在低功耗应用中实现了外部中断唤醒。希望对你们的极海MCU开发有所帮助!如果有任何问题,欢迎一起讨论!

希望这篇关于极海MCU的低功耗应用代码能对你们有所启发!


公羊子丹 发表于 2024-10-4 14:23 | 显示全部楼层
这个低功耗模式的实现看起来不错,我刚好也在研究极海MCU,回头试试你的代码!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

6272

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部