当前位置: 首页 > news >正文

基于野火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结构体
NVIC_InitTypeDef NVIC_InitStructure;
//定义中断优先组
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)
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;

    //开启时钟
RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK | KEY2_INT_GPIO_CLK,ENABLE);

    //使用外部中断时必须开启SYSCFG时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

//配置NVIC
NVIC_Config();

    //编写GPIO结构体成员
//KEY1按键的GPIO
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);

    //将KEY1连接到SYSCFG
SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);

    //将KEY1引脚连接EXTI中断源
EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

    //编写KEY2的结构体成员
GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
GPIO_Init(KEY2_INT_GPIO_PORT,&GPIO_InitStructure);

    //将KEY2连接到SYSCFG
SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,KEY2_INT_EXTI_PINSOURCE);

    //将KEY2连接到EXTI中断
EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

}
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);
static void SYSCLKConfig_STOP(void);
/**
* @brief  主函数
* @param  无
* @retval 无
*/
int main(void)
{
RCC_ClocksTypeDef clock_status_wakeup, clock_status_config;
uint8_t clock_source_wakeup, clock_source_config;

  LED_GPIO_Config();

  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");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运行正常,绿灯亮起\r\n");
LED_GREEN;
Delay(0x3FFFFFF);

        /*任务执行完毕,进入停止模式*/
printf("\r\n 进入停止模式,按KEY1或KEY2引脚能唤醒\r\n");
LED_RED;
/*如果进入停止模式,FLASH要进入掉电状态*/
PWR_FlashPowerDownCmd(ENABLE);
/*进入停止模式,将电压调节器设为低功耗模式,等待中断唤醒*/
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
//等待中断被唤醒,按下KEY1或KEY2按键
/*被唤醒*/
//获取刚被唤醒时的状态
clock_source_wakeup = RCC_GetSYSCLKSource();
//时钟频率
RCC_GetClocksFreq(&clock_status_wakeup);
//重启HSE,PLLCLK
SYSCLKConfig_STOP();
//获取配置后的时钟状态
clock_source_config = RCC_GetSYSCLKSource();
RCC_GetClocksFreq(&clock_status_config);
printf("\r\n 重新配置后的状态:\r\n");
printf("SYSCLK频率:%d,\r\n HCLK频率:%d,\r\n PCLK1频率:%d,\r\n PCLK2频率:%d,\r\n 时钟源:%d\n",
clock_status_config.SYSCLK_Frequency,
clock_status_config.HCLK_Frequency,
clock_status_config.PCLK1_Frequency,
clock_status_config.PCLK2_Frequency,
clock_source_config);
printf("\r\n刚唤醒的时钟状态:\r\n");
printf(" SYSCLK频率:%d,\r\n HCLK频率:%d,\r\n PCLK1频率:%d,\r\n PCLK2频率:%d,\r\n 时钟源:%d (0表示HSI,8表示PLLCLK)\n", 
clock_status_wakeup.SYSCLK_Frequency, 
clock_status_wakeup.HCLK_Frequency, 
clock_status_wakeup.PCLK1_Frequency, 
clock_status_wakeup.PCLK2_Frequency, 
clock_source_wakeup);
LED_BLUE;
Delay(0x1FFFFFF);
printf("\r\n 已退出停止模式 \r\n");
}    
}


static void SYSCLKConfig_STOP(void)
{
//使能HSE
RCC_HSEConfig(RCC_HSE_ON);

  //等待HSE准备就绪
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET)
{

  }
//使能PLL
RCC_PLLCmd(ENABLE);

  //等待PLL准备就绪
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
{
}
//选择PLL作为系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//等待PLL被选择为系统时钟
while (RCC_GetSYSCLKSource()!=0x08)
{

}

}

static void Delay(__IO uint32_t nCount)
{
for(;nCount != 0;nCount--);
}

3.代码编译成功,烧录进开发板


文章转载自:

http://k67xeIuB.xpkfx.cn
http://zXjhn9G4.xpkfx.cn
http://n0IeRkO2.xpkfx.cn
http://eweS3l9k.xpkfx.cn
http://54phOPCP.xpkfx.cn
http://kodCpAXC.xpkfx.cn
http://B4QC17bP.xpkfx.cn
http://EUyJTJO4.xpkfx.cn
http://nKXQo5Gm.xpkfx.cn
http://ItJ8B4d1.xpkfx.cn
http://S0jdMIQJ.xpkfx.cn
http://OZi1o8Ss.xpkfx.cn
http://iWGBl5EA.xpkfx.cn
http://SI90MxSU.xpkfx.cn
http://zdhfsCvS.xpkfx.cn
http://fuAS3fQv.xpkfx.cn
http://SZ9ezfIQ.xpkfx.cn
http://GcLx7ZbU.xpkfx.cn
http://E1VycPdA.xpkfx.cn
http://pYorMpj2.xpkfx.cn
http://hjkiTRl0.xpkfx.cn
http://aBQKVbuY.xpkfx.cn
http://BjoaBwGX.xpkfx.cn
http://TsnC4hAG.xpkfx.cn
http://OuL4l5jn.xpkfx.cn
http://DIeOw4fe.xpkfx.cn
http://4KwuKfHX.xpkfx.cn
http://TUwSTovU.xpkfx.cn
http://6Zmi5Jwi.xpkfx.cn
http://KeeMdnoQ.xpkfx.cn
http://www.dtcms.com/a/374890.html

相关文章:

  • Linux中 Swap 有哪些作用
  • Transformer架构:深度学习中的革命性模型
  • 解决window下共享资源报“不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接“问题
  • 自然语言处理 (NLP) 基础:词向量、模型与应用
  • C++设计模式之单例模式
  • C# ---ToLookUp
  • CSS in JS 的演进:Styled Components, Emotion 等的对比与选择
  • mybatis-plus多租户兼容多字段租户标识
  • Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
  • 华为云盘同步、备份和自动上传功能三者如何区分
  • 设计模式第一章(建造者模式)
  • Vue3入门到实战,最新版vue3+TypeScript前端开发教程,笔记02
  • 【Vue】Vue2 与 Vue3 内置组件对比
  • XSS 跨站脚本攻击剖析与防御 - 第一章:XSS 初探
  • vue 去掉el-dropdown 悬浮时出现的边框
  • 常见的排序算法总结
  • [优化算法]神经网络结构搜索(一)
  • php 使用html 生成pdf word wkhtmltopdf 系列2
  • 大数据毕业设计选题推荐-基于大数据的海洋塑料污染数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • 【计算机网络 | 第11篇】宽带接入技术及其发展历程
  • 探索Java并发编程--从基础到高级实践技巧
  • Made in Green环保健康产品认证怎么做?
  • yum list 和 repoquery的区别
  • 解决HTML/JS开发中的常见问题与实用资源
  • Angular 面试题及详细答案
  • AI与AR融合:重塑石化与能源巡检的未来
  • 增强现实光学系统_FDTD_zemax_speos_学习(1)
  • 开学季干货——知识梳理与经验分享
  • Alex Codes团队并入OpenAI Codex:苹果生态或迎来AI编程新篇章
  • The learning process of Decision Tree Model|决策树模型学习过程