STM32拓展 低功耗案例1:睡眠模式 (hal)

STM32CubeMX设置

开串口以及中断

LED2,配置GPIO

生成项目:

keil配置自动复位和打开MicroLIB

书写代码:首先书写uart.c中重写printf

cs 复制代码
#include <stdio.h>
int fputc (int ch,FILE * file)
{
    HAL_UART_Transmit(&huart1,(uin8_t *)&ch,1,1000);
    return ch;
}

复制register代码到hal库中main.c中

cs 复制代码
    printf("低功率实验:睡眠模式...\n");
 
	// 1. 开启LED灯,延时2s,模拟正常程序执行过程
	LED_On(LED_1);
	Delay_s(2);


 
	while (1)
	{
		// 2. 进入睡眠模式
		printf("正常代码执行完毕,3s后进入睡眠模式...\n");
		Delay_s(3);
		printf("进入睡眠模式");
		enter_sleep_mode();
 
		// 3. 以下代码只有在唤醒之后才会执行
		printf("从睡眠模式中唤醒...\n");
		Delay_s(2);
	}

然后再进行修改:

cs 复制代码
  printf("尚硅谷低功率实验:睡眠模式...\n");

	// 1. 开启LED灯,延时2s,模拟正常程序执行过程
	HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
	HAL_Delay(2000);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    // 2. 进入睡眠模式
		printf("正常代码执行完毕,3s后进入睡眠模式...\n");
		HAL_Delay(3000);
		printf("进入睡眠模式\n");
		HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
		
        // 3. 以下代码只有在唤醒之后才会执行
		printf("从睡眠模式中唤醒...\n");
		HAL_Delay(2000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

但是hal库中的中断开启需要手动开启

cs 复制代码
HAL_UART_Receive_IT(&huart1, &ch, 1);

运行代码会发现不停的唤醒,因为任何中断都可以进入睡眠模式,hal中的systick中断也可以进入睡眠,解决办法是临时暂停然后恢复。

cs 复制代码
    // 暂停Systick中断
    HAL_SuspendTick();

	HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

    // 恢复Systick中断
    HAL_ResumeTick();

再次运行:会发现进入睡眠模式后只能唤醒1次,分析原因是因为,中断服务程序默认关闭中断。

解决办法,是将中断服务程序的回调函数,重写打开中断。 添加下面代码(哪里都可以)。

cs 复制代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if (huart->Instance == USART1)
  {
    printf("%c", ch);

    // 重新打开接收中断使能
    HAL_UART_Receive_IT(&huart1, &ch, 1);
  }
}

进入睡眠模式发现烧录不了程序了,解决方法是打开keil中按下图配置

相关推荐
Msshu1233 小时前
受电端快充协议芯片,支持外部MCU读取充电器功率信息,支持最大140W功率给设备供电
单片机·嵌入式硬件
嵌入式-老费4 小时前
Linux上位机开发实践(mcu模块的补充应用)
单片机·嵌入式硬件
青牛科技-Allen4 小时前
D133AL低功耗LDO稳压器:技术解析与应用设计
科技·单片机·嵌入式硬件·笔记本电脑·激光雷达电机·游戏本散热风扇
L小李要学习6 小时前
STM32学习
stm32·嵌入式硬件·学习
正点原子8 小时前
【正点原子STM32MP257连载】第二章 ATK-DLMP257B使用前准备 #串口软件 #MobaXterm
linux·stm32·单片机·嵌入式硬件
ℳ๓. Sweet8 小时前
【STM32】在FreeRTOS下使用硬件SPI收发数据出现的时序耦合问题(WK2124芯片为例)
stm32·单片机·嵌入式硬件
charlie11451419110 小时前
IMX6ULL2025年最新部署方案2在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上
linux·嵌入式硬件·qt·系统架构·嵌入式软件·移植教程
努力创造奇迹12 小时前
STM32 HAL库 实现485通信
stm32·单片机·嵌入式硬件
Tlog嵌入式12 小时前
STM32提高篇: 以太网通讯
网络·stm32·单片机·嵌入式硬件·mcu·iot
菜狗想要变强13 小时前
RVOS-7.实现抢占式多任务
linux·c语言·驱动开发·单片机·嵌入式硬件·risc-v