芯海休眠唤醒

 

这个电路要钱,降本需要去掉这个电路,让软件完全实现开关机的功能。

1、当按键按下的时候,K1下面接地,R12下面为低电平,同时BAT在左边供电,为高电平,Q2MOS管导通,给板子供电。

2、当按键按下的时候,我们软件把EN脚拉高,三极管Q1的左边为高电平,下面为低电平,导通,所以R12下面为低电平,这个时候,就不需要按键按下了,松开也能让电池给板子供电。

3、如果要做软件的休眠唤醒,就需要把Q2MOS管给去掉,接一个0欧姆的电阻,这个时候电池插上板子,板子就直接上电了,之后就是一直在供电,和之前的断电方案有很大差别,所以我们需要不用功能的时候,把板子设置为深睡模式,低功耗模式,待机模式,避免我们不用它的时候,板子的芯片还在大功率耗电。(板子在休眠的时候,芯片还是通电的,在进行低功耗耗电)

4、打开例程记得要从最开始的大文件夹开始打开,不然例程里面的一些函数,你搜索不到。

5、


#define LED_PORT 				GPIOA
#define LED_PIN					GPIO_PIN_5
#define LED_GPIO_CLK_ENABLE()	__RCU_AHB_CLK_ENABLE(RCU_AHB_PERI_GPIOA)
#define LED_GPIO_CLK_DISABLE()	__RCU_AHB_CLK_DISABLE(RCU_AHB_PERI_GPIOA)

#define KEY_PORT 				GPIOA
#define KEY_PIN					GPIO_PIN_11
#define KEY_EXTI_LINE			EXTI_LINE_11
#define KEY_EXTI_PORT			SYSCFG_EXTI_PORT_PA
#define KEY_EXTI_PIN			SYSCFG_EXTI_PIN_11
#define KEY_EXTI_IRQn           IRQn_EXTI4_15
#define KEY_GPIO_CLK_ENABLE()	__RCU_AHB_CLK_ENABLE(RCU_AHB_PERI_GPIOA)
#define KEY_GPIO_CLK_DISABLE()	__RCU_AHB_CLK_DISABLE(RCU_AHB_PERI_GPIOA)	


void cs_eval_led_init(void)
{
    LED_GPIO_CLK_ENABLE();
    
    gpio_mode_set(LED_PORT, LED_PIN, GPIO_MODE_OUT_PP(GPIO_SPEED_HIGH));
    
    __GPIO_PIN_RESET(LED_PORT, LED_PIN);
}


void cs_eval_key_init(void)
{
    KEY_GPIO_CLK_ENABLE();
    gpio_mode_set(KEY_PORT, KEY_PIN, GPIO_MODE_IN_FLOAT);
}


/**
  * @brief  Turns selected LED On.
  * @param  Led: Specifies the Led to be set on. 
  * @return None
  */
void cs_eval_led_on(void)
{
	__GPIO_PIN_SET(LED_PORT, LED_PIN);
}

/**
  * @fn void EXTI4_15_IRQHandler(void)
  * @brief  This function handles External lines 11 interrupt request.
  * @param  None
  * @return None
  */
void EXTI4_15_IRQHandler(void)
{
    if(__EXTI_FLAG_STATUS_GET(EXTI_LINE_11) != RESET)
    { 
        key_status = 1;
        __EXTI_FLAG_CLEAR(EXTI_LINE_11); //Clear the EXTI(PA11) line  bit  
    }
}

/**
  * @brief  Toggles the selected LED.
  * @param  Led: Specifies the Led to be toggled. 
  * @return None
  */
void cs_eval_led_toggle(void)
{	
	LED_PORT->DO ^= LED_PIN;
}


/**
  * @brief  Turns selected LED Off.
  * @param  Led: Specifies the Led to be set off. 
  * @return None
  */
void cs_eval_led_off(void)
{
	__GPIO_PIN_RESET(LED_PORT, LED_PIN);
}

/**
 * @fn static void deep_sleep_measure(void)
 * @brief  Configures peripherals and enter deep sleep.
 * @param  None
 * @return None
 */
static void deep_sleep_measure(void)
{
    /* Configure all GPIO as analog to reduce current consumption on non used IOs */
    /* Warning : Reconfiguring all GPIO will close the connetion with the debugger */

	__RCU_AHB_CLK_ENABLE(RCU_AHB_PERI_GPIOA|RCU_AHB_PERI_GPIOB|RCU_AHB_PERI_GPIOC|RCU_AHB_PERI_GPIOF);
	
	gpio_mode_set(GPIOA,GPIO_PIN_ALL,GPIO_MODE_ANALOG);
	gpio_mode_set(GPIOB,GPIO_PIN_ALL,GPIO_MODE_ANALOG);
	gpio_mode_set(GPIOC,GPIO_PIN_ALL,GPIO_MODE_ANALOG);
	gpio_mode_set(GPIOF,GPIO_PIN_ALL,GPIO_MODE_ANALOG);	
	
	__RCU_AHB_CLK_DISABLE(RCU_AHB_PERI_GPIOA|RCU_AHB_PERI_GPIOB|RCU_AHB_PERI_GPIOC|RCU_AHB_PERI_GPIOF);	
	
	cs_eval_key_init();
    cs_eval_key_exti_init();

    __RCU_APB1_CLK_ENABLE(RCU_APB1_PERI_PMU); // Enable the PMU clock
    pmu_deep_sleep_mode_enter(PMU_LDO_LOW_POWER, PMU_DSM_ENTRY_WFI); // enter STOP mode    
}


/**
  * @fn void syscfg_exti_line_config(uint8_t port, uint8_t pin)
  * @brief  Selects the GPIO pin used as EXTI Line.
  * @param  port: selects the GPIO port to be used as source for EXTI lines. It can be one of following values:
  *                 @arg SYSCFG_EXTI_PORT_PA
  *                 @arg SYSCFG_EXTI_PORT_PB
  *                 @arg SYSCFG_EXTI_PORT_PC
  *                 @arg SYSCFG_EXTI_PORT_PF
  * @param  pin: specifies the EXTI line to be configured. 
  *              It can be a value between SYSCFG_EXTI_PIN_0 ~ SYSCFG_EXTI_PIN_15.
  * @return None
  */
void syscfg_exti_line_config(uint8_t port, uint8_t pin)
{
	uint8_t idx = 0x00;
	uint8_t shift = 0x00;

    ASSERT(SYSCFG_EXTI_PORT_CHECK(port));
    ASSERT(SYSCFG_EXTI_PIN_CHECK(pin));

	idx = pin >> 2;
	shift = (pin & 0x03) * 4;
	
	MODIFY_REG(SYSCFG->EXTISRC[idx], (uint32_t)0x0F << shift, (uint32_t)port << shift);	
}


/**
  * @fn void cs_eval_key_exti_init(void)
  * @brief  key nvic init()
  * @param  None
  * @return None
  */
void cs_eval_key_exti_init(void)
{
    nvic_config_t nvic_config_struct;
    __RCU_APB2_CLK_ENABLE(RCU_APB2_PERI_SYSCFG);
    
    syscfg_exti_line_config(KEY_EXTI_PORT, KEY_EXTI_PIN); // Connect EXTI Line to GPIO pin
    // Configure EXTI line 
    __EXTI_INTR_ENABLE(KEY_EXTI_LINE);
    __EXTI_EDGE_ENABLE(EXTI_EDGE_FALLING, KEY_EXTI_LINE);

    // Enable and set EXTI Interrupt
    nvic_config_struct.IRQn = KEY_EXTI_IRQn;
    nvic_config_struct.priority = 0x00;
    nvic_config_struct.enable_flag = ENABLE;
    nvic_init(&nvic_config_struct);
}


/**
  * @fn void pmu_deep_sleep_mode_enter(uint32_t value, uint8_t flag)
  * @brief  Enters STOP mode.
  * @param  value: specifies the regulator state in STOP mode. It can be:
  *          PMU_LDO_ON or PMU_LDO_LOW_POWER().
  * @param  flag: specifies if STOP mode in entered with WFI or WFE instruction.
  *          It can be one of the following values:
  *            @arg PMU_DSM_ENTRY_WFI(enter STOP mode with WFI instruction)
  *            @arg PMU_DSM_ENTRY_WFE(enter STOP mode with WFE instruction)
  *            @arg PMU_DSM_ENTRY_SLEEPONEXIT(enter STOP mode with SLEEPONEXIT instruction)
  * @return None
  */
void pmu_deep_sleep_mode_enter(uint32_t value, uint8_t flag)
{
    ASSERT(PMU_LDO_CHECK(value));
    ASSERT(PMU_STOP_ENTRY_CHECK(flag));
  
    MODIFY_REG(PMU->CTR, PMU_CTR_LDOLM, value);
    
    /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */
    SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
    
    if(flag == PMU_DSM_ENTRY_WFI)
    {
        /* Request Wait For Interrupt */
        __WFI();
        /* Reset SLEEPDEEP bit of Cortex System Control Register */
        SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); 
    }
    else if (flag == PMU_DSM_ENTRY_WFE)
    {
        /* Request Wait For Event */
        __WFE();
        /* Reset SLEEPDEEP bit of Cortex System Control Register */
        SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);   
    }
    else
    {
        /* Set SLEEP on exit bit of Cortex-M0 System Control Register */
        SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
    }
}


/**
 * @fn static void sysclk_config_from_deep_sleep(void)
 * @brief  Configures system clock after wake-up from DeepSleep: enable HXT, PLL
 *         and select PLL as system clock source.
 * @param  None
 * @return None
 */
static void sysclk_config_from_deep_sleep(void)
{
    __RCU_FUNC_ENABLE(HXT_CLK);
    while (__RCU_FLAG_STATUS_GET(HXT_STAB) == RESET); // Wait  HXT stabilization

    __RCU_FUNC_ENABLE(PLL_CLK); // Enable PLL
    while (__RCU_FLAG_STATUS_GET(PLL_STAB) == RESET); // Wait  PLL stabilization

    rcu_sysclk_config(RCU_SYSCLK_SEL_PLL); // Select PLL as system clock source.
    while (__RCU_SYSCLK_SRC_GET() != 0x08); // Wait till PLL is used as system clock source
}

/**
 * @fn int main(void)
 * @brief  Main program.   MCU clock setting is  configured  through SystemInit()
 *          in startup file (startup_cs32f0xx.s) before to enter to application main.
 * @param  None
 * @return None
 */
int main(void)
{
    /* Configures Systick interrupt at 1ms as hardware delay source */
    SysTick_Config(SystemCoreClock / 1000);
	
    while (1)
    {
        /* Configure LED */           
        cs_eval_led_init();        
        cs_eval_led_on();
        
        /* Configure KEY S1 as external interrupt generator */        
		cs_eval_key_init();
		cs_eval_key_exti_init();
        
        key_status = 0;
        
        /* Wait until KEY S1 is pressed to enter the Low Power mode.
           In the meantime, LED2 is blinks */        
        while(key_status == 0)
        {
            cs_eval_led_toggle();
            delay(100);
        }

        /* Make sure LED2 is turned off to reduce low power mode consumption */
        cs_eval_led_off();
        
        /* Configures peripherals and enter deep sleep */
        deep_sleep_measure();		
		
        /* Configures system clock after wake-up from deep sleep */
        sysclk_config_from_deep_sleep(); 
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/898935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【and design ProTable组件rowClassName属性进行判断修改行样式】

代码解析 注&#xff1a;行改变基于css效果 【导入css文件】 效果展示 代码块 自己导入cssrowClassName{(record)>{return record.jibie"高"?"row-style":""}}

Linux_进程终止_进程等待_进程替换

进程终止 不知道大家想过没有&#xff0c;我们写的main()函数的返回值是返回给谁的呢&#xff1f;其实是返回给父进程或者系统的。 int main() {std::cout << "hello" << std::endl;return 10; }运行该代码&#xff0c;输入hello&#xff0c;没问题&am…

I\O进程线程(Day32)

一、学习内容 进程之间的通信(nterprocess communication) 信号通信 概念 1> 信号通信中&#xff0c;多个进程只起到通知作用&#xff0c;没有数据传输的功能 2> 所谓信号通信&#xff0c;就是软件模拟的硬件的中断请求 3>原理图 信号处理方式 默认&#xff08;SIG_DF…

SpringBoot1~~~

目录 快速入门 依赖管理和自动配置 修改自动仲裁/默认版本号 starter场景启动器 自动配置 修改默认扫描包结构 修改默认配置 读取application.properties文件 按需加载原则 容器功能 Configuration Import ​编辑 Conditional ImportResource 配置绑定Configur…

华为云购买弹性云服务器(教程)

配置弹性云服务器 基础配置 实例 操作系统

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写&#xff1a;CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

信息搜集 --子域名

1.证书查询 通过ssl证书指纹在crt.sh |证书搜索网站搜索 这些就是证书一样的 2.fofa等空间测绘平台查询 3.dns查询 https://dnsdumpster.com/ 4.威胁情报中心 360 微步等等 5.枚举 暴力破解 工具推荐&#xff1a;oneforall GitHub - shmilylty/OneForAll: OneForAll是一款…

windows 上面交叉编译 适合arm架构上的linux内核系统的qt 版本,源码编译

1. 在机器上确认系统信息 cat /proc/cpuinfomodel name : ARMv7 Processor rev 5 (v7l) arm 32位 BogoMIPS : 57.14 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 CPU implementer : 0x41 CPU architecture: 7 …

【Linux】线程互斥与同步,生产消费模型(超详解)

目录 线程互斥 进程线程间的互斥相关背景概念 数据不一致问题 锁 深度理解锁 原理角度理解&#xff1a; 实现角度理解&#xff1a; 线程同步 条件变量 测试代码 生产消费模型 生产消费模型概念 编写生产消费模型 BlockingQueue &#xff08;1&#xff09;创建生产…

双十一宠物空气净化器哪款吸毛好而且噪音低?希喂、IAM、有哈真实测评

家人们谁懂啊&#xff0c;家里怎么会有一只这么爱掉毛的小猫咪啊&#xff0c;看着香香软软的&#xff0c;谁知道掉起毛来六亲不认啊&#xff0c;搞得我这个老母亲筋疲力尽啊&#xff0c;每天只想着清理它掉下来的浮毛&#xff0c;主要是还特别难清理。 所以后面入手了能吸毛的…

OpenAI o1复现:自动构造prm训练数据-OmegaPRM

作者&#xff1a;cmathx 原文&#xff1a;https://zhuanlan.zhihu.com/p/1477078851 openai o1复现中&#xff0c;有个比较关键的问题&#xff0c;怎么样自动化构造prm模型的训练数据&#xff1f;本文主要从代码层面&#xff0c;来解析OmegaPRM原理。 论文 Improve Mathemat…

Discuz | 起尔开发 传奇开服表游戏公益服发布论坛网站插件

Discuz | 起尔开发 传奇开服表游戏公益服发布论坛网站插件 插件下载&#xff1a;源码 - 起尔开发的插件下载 演示地址&#xff1a;discuz.72jz.com 标黄和非标黄自动分开 在标黄时间内显示在上面置顶&#xff0c;标黄过期后自动显示在下面白色区域。 后台可以设置非标黄默认…

四、多线程带来的的⻛险-线程安全

4.1 观察线程不安全 运行以下代码&#xff1a; package demo02;public class Test {private static int count 0;public static void main(String[] args) throws Exception {Thread t1 new Thread(() -> {for (int i 0; i < 50_000; i) {count;}});Thread t2 new …

通过Docker Compose构建自己的Java项目

通过Docker Compose构建自己的Java项目 前置条件 安装了Docker,未安装的请移步:CentOS7 / CentOS8 安装 Docker-ce安装了Docker-Compose,未安装的请移步:在CentOS7、CentOS8系统下安装Docker Compose1. 配置阿里云镜像仓库 为了提高Docker镜像的下载速度,我们可以配置阿…

版本工具报错:Error Unity Version Control

NotConfiguredClientException: Unity VCS client is not correctly configured for the current user:Client config file.

python 爬虫 入门 三、登录以及代理。

目录 一、登录 &#xff08;一&#xff09;、登录4399 1.直接使用Cookie 2.使用账号密码进行登录 可选观看内容&#xff0c;使用python对密码进行加密&#xff08;无结果代码&#xff0c;只有过程分析&#xff09; 二、代理 免费代理 后续&#xff1a;协程&#xff0c;…

TitanIDE:解锁编程教学新范式

在高校软件工程类课程教育中&#xff0c;传统编程教学方式正面临着多重痛点&#xff1a; 环境配置繁琐&#xff1a;软件工程类课程往往需要学生自行配置复杂的开发环境。但是&#xff0c;学校硬件设备条件差异、软件兼容性问题等因素&#xff0c;导致学生学习效率低下&#xf…

热销王西圣H1头戴式耳机—全平台售罄断货:揭秘抢购潮究其原因?

西圣xisem作为国内平价享轻奢的领军品牌&#xff0c;就在今年它家的头戴式蓝牙耳机性价比标杆—西圣H1&#xff0c;凭借其发烧级的千元音质、降噪与满级的旗舰配置性能&#xff0c;不仅惊艳了整个耳机圈&#xff0c;还在仅仅的几个月内&#xff0c;西圣H1头戴式耳机已经火爆断货…

python 使用gradio启动程序报错

问题一&#xff1a;localhost is not accessible 解决办法&#xff1a; export no_proxy"localhost,127.0.0.1,::1"

C#学习笔记(三)

C#学习笔记&#xff08;三&#xff09; 第 二 章 命名空间和类、数据类型、变量和代码规范二、类的组成和使用分析1. 基本概念2. 类的内容组成3. 方法的初步理解 第 二 章 命名空间和类、数据类型、变量和代码规范 二、类的组成和使用分析 1. 基本概念 类是程序的基本单元&a…