基于野火F407开发板实现电源管理-睡眠模式
1.创建新工程,工程目录如下
2.创建bsp_exti.c,bsp_exti.h,main.c这三个新文件
bsp_exti.c代码如下:
#include "./exti/bsp_exti.h"
static void NVIC_Config(void)
{
//定义结构体
NVIC_InitTypeDef NVIC_InitStructure;
//定义NVIC优先组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//编写NVIC结构体成员
//编写KEY1引脚中断
NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//编写KEY2引脚中断
NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI_GPIO_Config(void)
{
//编写EXTI和GPIO结构体成员
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitSturecture;
//开启时钟
RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK | KEY2_INT_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
//配置中断
NVIC_Config();
//编写GPIO结构体成员
//按键KEY1
GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(KEY1_INT_GPIO_PORT,&GPIO_InitStructure);
//编写EXTI结构体成员
EXTI_InitSturecture.EXTI_Line = KEY1_INT_EXTI_LINE;
EXTI_InitSturecture.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitSturecture.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitSturecture.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitSturecture);
//将KEY1引脚连接到SYSCFG
SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);
//编写GPIO结构体成员
//按键KEY2
GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
GPIO_Init(KEY2_INT_GPIO_PORT,&GPIO_InitStructure);
//编写EXTI结构体成员
EXTI_InitSturecture.EXTI_Line = KEY2_INT_EXTI_LINE;
EXTI_InitSturecture.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitSturecture.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitSturecture.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitSturecture);
//将KEY2引脚连接到SYSCFG
SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,KEY2_INT_EXTI_PINSOURCE);
}
bsp_exti.h代码如下:
#ifndef __EXTI_H
#define __EXTI_H
#include "stm32f4xx.h"
//引脚定义
/*******************************************************/
#define KEY1_INT_GPIO_PORT GPIOA
#define KEY1_INT_GPIO_CLK RCC_AHB1Periph_GPIOA
#define KEY1_INT_GPIO_PIN GPIO_Pin_0
#define KEY1_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOA
#define KEY1_INT_EXTI_PINSOURCE EXTI_PinSource0
#define KEY1_INT_EXTI_LINE EXTI_Line0
#define KEY1_INT_EXTI_IRQ EXTI0_IRQn
#define KEY1_IRQHandler EXTI0_IRQHandler
#define KEY2_INT_GPIO_PORT GPIOC
#define KEY2_INT_GPIO_CLK RCC_AHB1Periph_GPIOC
#define KEY2_INT_GPIO_PIN GPIO_Pin_13
#define KEY2_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOC
#define KEY2_INT_EXTI_PINSOURCE EXTI_PinSource13
#define KEY2_INT_EXTI_LINE EXTI_Line13
#define KEY2_INT_EXTI_IRQ EXTI15_10_IRQn
#define KEY2_IRQHandler EXTI15_10_IRQHandler
void EXTI_GPIO_Config(void);
#endif /* __EXTI_H */
main.c代码如下:
#include "stm32f4xx.h"
#include "./usart/bsp_debug_usart.h"
#include "./led/bsp_led.h"
#include "./exti/bsp_exti.h"
static void Delay(__IO uint32_t nCount);
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
LED_GPIO_Config();
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
Debug_USART_Config();
EXTI_GPIO_Config();
printf("\r\n 欢迎使用野火 STM32 F407 开发板。\r\n");
printf("\r\n 野火F407 睡眠模式例程\r\n");
printf("\r\n 实验说明:\r\n");
printf("\r\n 1.本程序中,绿灯表示STM32正常运行,红灯表示睡眠状态,蓝灯表示刚从睡眠状态被唤醒\r\n");
printf("\r\n 2.程序运行一段时间后自动进入睡眠状态,在睡眠状态下,可使用KEY1或KEY2唤醒\r\n");
printf("\r\n 3.本实验执行这样一个循环:\r\n ------》亮绿灯(正常运行)->亮红灯(睡眠模式)->按KEY1或KEY2唤醒->亮蓝灯(刚被唤醒)-----》\r\n");
printf("\r\n 4.在睡眠状态下,DAP下载器无法给STM32下载程序,\r\n 可按KEY1、KEY2唤醒后下载,\r\n 或按复位键使芯片处于复位状态,然后在电脑上点击下载按钮,再释放复位按键,即可下载\r\n");
while(1)
{
//正常执行任务
printf("\r\n STM32正常运行,绿灯亮起");
LED_GREEN;
Delay(0x3FFFFFF);
//进入睡眠低功耗模式,执行任务完毕
printf("\r\n 进入睡眠模式,按下KEY1或KEY2引脚唤醒");
//使用红灯指示进入睡眠模式
LED_RED;
//进入睡眠模式
__WFI();
//等待中断被唤醒
//中断唤醒亮蓝灯
LED_BLUE;
Delay(0x1FFFFFF);
printf("\r\n 睡眠模式退出 \r\n");
}
}
static void Delay(__IO uint32_t nCount)
{
for (; nCount != 0; nCount--);
}
3.代码编译成功,烧录进开发板