STM32H750XB_RT-THREAD/42-PWR—电源管理/PWR—待机模式/User/main.c
2025-07-21 14:34:29 +08:00

197 lines
5.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2019-xx-xx
* @brief 野火H750 PWR—待机模式
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 H750 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "main.h"
#include "stm32h7xx.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_debug_usart.h"
#include "./key/bsp_key.h"
#include "./delay/core_delay.h"
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
/* 初始化系统时钟为480MHz */
SystemClock_Config();
/* 初始化LED */
LED_GPIO_Config();
/* 初始化调试串口一般为串口1 */
DEBUG_USART_Config();
/*初始化按键,不需要中断,仅初始化KEY2即可只用于唤醒的PA0引脚不需要这样初始化*/
Key_GPIO_Config();
printf("\r\n 欢迎使用野火 STM32H750 开发板。\r\n");
printf("\r\n 野火H750 待机模式例程\r\n");
printf("\r\n 实验说明:\r\n");
printf("\r\n 1.本程序中,绿灯表示本次复位是上电或引脚复位,红灯表示即将进入待机状态,蓝灯表示本次是待机唤醒的复位\r\n");
printf("\r\n 2.长按KEY2按键后会进入待机模式\r\n");
printf("\r\n 3.在待机模式下按KEY1按键可唤醒唤醒后系统会进行复位程序从头开始执行\r\n");
printf("\r\n 4.可通过检测WU标志位确定复位来源\r\n");
printf("\r\n 5.在待机状态下DAP下载器无法给STM32下载程序需要唤醒后才能下载");
//检测复位来源
if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) == SET)
{
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
LED_BLUE;
printf("\r\n 待机唤醒复位 \r\n");
}
else
{
LED_GREEN;
printf("\r\n 非待机唤醒复位 \r\n");
}
while(1)
{
// K2 按键长按进入待机模式
if(KEY2_LongPress())
{
printf("\r\n 即将进入待机模式进入待机模式后可按KEY1唤醒唤醒后会进行复位程序从头开始执行\r\n");
LED_RED;
HAL_Delay(1000);
/*清除WU状态位*/
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
/* 使能WKUP引脚的唤醒功能 使能PA0*/
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1_HIGH);
//暂停滴答时钟,防止通过滴答时钟中断唤醒
HAL_SuspendTick();
/* 进入待机模式 */
HAL_PWR_EnterSTANDBYMode();
}
}
}
/**
* @brief 用于检测按键是否被长时间按下
* @param 无
* @retval 1 :按键被长时间按下 0 :按键没有被长时间按下
*/
static uint8_t KEY2_LongPress(void)
{
uint8_t downCnt =0; //记录按下的次数
uint8_t upCnt =0; //记录松开的次数
while(1) //死循环由return结束
{
HAL_Delay(20); //延迟一段时间再检测
if(HAL_GPIO_ReadPin( KEY2_GPIO_PORT, KEY2_PIN ) == SET) //检测到按下按键
{
downCnt++; //记录按下次数
upCnt=0; //清除按键释放记录
if(downCnt>=50) //按下时间足够
{
return 1; //检测到按键被时间长按下
}
}
else
{
upCnt++; //记录释放次数
if(upCnt>5) //连续检测到释放超过5次
{
return 0; //按下时间太短,不是按键长按操作
}
}// if(HAL_GPIO_ReadPin
}//while
}
/**
* @brief System Clock 配置
* system Clock 配置如下:
* System Clock source = PLL (HSE)
* SYSCLK(Hz) = 480000000 (CPU Clock)
* HCLK(Hz) = 240000000 (AXI and AHBs Clock)
* AHB Prescaler = 2
* D1 APB3 Prescaler = 2 (APB3 Clock 120MHz)
* D2 APB1 Prescaler = 2 (APB1 Clock 120MHz)
* D2 APB2 Prescaler = 2 (APB2 Clock 120MHz)
* D3 APB4 Prescaler = 2 (APB4 Clock 120MHz)
* HSE Frequency(Hz) = 25000000
* PLL_M = 5
* PLL_N = 192
* PLL_P = 2
* PLL_Q = 2
* PLL_R = 2
* VDD(V) = 3.3
* Flash Latency(WS) = 4
* @param None
* @retval None
*/
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** 启用电源配置更新
*/
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
/** 配置主内稳压器输出电压
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/** 初始化CPU、AHB和、APB总线时钟
*/
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 = 5;
RCC_OscInitStruct.PLL.PLLN = 192;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
/** 初始化CPU、AHB和、APB总线时钟
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
}
}
/*********************************************END OF FILE**********************/