mpu6050 +STM32 休眠唤醒问题+低功耗

2019-09-10来源: eefocus关键字:mpu6050  STM32  休眠唤醒  低功耗

这几天在调STM32+MPU6050实现   低功耗唤醒功


功能描述: 

1.  平时没有数据的时候,mcu处于 stop模式下,

2.  利用RTC实现定时唤醒,

3.以上功能中已经实现 mcu低功耗唤醒      及RTC定时唤醒。


下一步要尝试   mpu6050 有数据时唤醒单片机,平时单片机处于低功耗状态


如果有朋友也在做  mpu6050低功耗唤醒单片机的功能希望能够一起交流。


这里附上qq :1812669090  如果 要低功耗  和定时唤醒的代码欢迎和我联系


首先说一下STM32低功耗模式


这张表意思看一下就行,我这里用的是停止模式,理由很简单,任一中断都能唤醒,只不过唤醒后的配置相对待机模式要麻烦一点。


那么,第一个问题来了  我们的单片机如何才能进入到低功耗?这个时候,你应该考虑一个问题,在什么位置进入低功耗?这个需要根据你的项目需求是什么,如果你的项目需要单片机一上来进入低功耗,那就把 进入低功耗的指令放在main函数的最前面,当然这种情况几乎是不存在的因为我们在进入低功耗之前  肯定要做一些初始化配置。好了,接下来切入正题进入低功耗。在这之前你应该做好 


RCC_Enter_Stop();

这个函数里面封装了进入低功耗的指令,是我自己写的,我们来看一下函数里面的内容:


void RCC_Enter_Stop(void)

{

    

// RCC_PLLCmd(DISABLE); //关闭时钟

  MY_GPIO_AN();//将没有用的IO设置为  模拟输入模式

RTC_ClearFlag(RTC_FLAG_WUTF);//将RTC唤醒中断清除 

 

  Delay_ms(500);

/* Enable Wakeup Counter */

    RTC_WakeUpCmd(ENABLE);//在进入低功耗之前首先 要设置自己的唤醒源

    //这个不一定是RTC 要依据自己的唤醒源

 

    /* Enter Stop Mode */

    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//重点来了这个就是进入STOP

//模式的指令   这个函数是库函数,  咱们不用管

 

    /* Enable Wakeup Counter */

  //  RTC_WakeUpCmd(DISABLE);  //关闭RTC的计数器 为什么? 应为之后要对他进行配置 配置完成之

//后再去开启

    

    /* After wake-up from STOP reconfigure the system clock */

    /* Enable HSE */

    RCC_HSEConfig(RCC_HSE_ON);

//将外部32.768KHZ的外部时钟打开,因为在进入低功耗之后时钟被切换

//成了内部低频时钟, 所以想要让单片机回到正常工作模式 必须要从新打开时钟

   

 /* Wait till HSE is ready */

    while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)

    {}   //等待时钟稳定

    

    /* Enable PLL */

    RCC_PLLCmd(ENABLE);

    

    /* Wait till PLL is ready */

    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

    {}

    

    /* Select PLL as system clock source */

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    

    /* Wait till PLL is used as system clock source */

    while (RCC_GetSYSCLKSource() != 0x0C)

    {}

}

这个我要说明一下,


1。将IO口设为  模拟输入模式,这里是最关键的,因为直接牵扯到你的硬件电路。我之前就吃了这个的亏,IO口设置没对,功耗一直在200uA一直下不来。


为什么?


1.硬件 ,可能你的板子上连了一大堆没用的器件,如果你的功能中没有用到这些器件最好把他们去掉。当然你要会看原理图别拆错而导致板子无法工作。


2.IO口状态,这里要说的并不是所有的IO口都要设为模拟,而是将没用到的IO口设置为模拟模式。如果IO口在电路中做了上拉或者下拉,那么你在进入低功耗之前就必须将IO口的状态设置为与硬件相同的模式(该上拉的上啦,该下拉的下拉),这里我把我项目中对IO口的操作里出来希望能有所启发。


void MY_GPIO_AN(void)

{

 

GPIO_InitTypeDef  GPIO_InitStructure;

// GPIO_DeInit(GPIOA);

// GPIO_DeInit(GPIOB);

// GPIO_DeInit(GPIOC);

 

 

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOC, ENABLE);

  

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_11|GPIO_Pin_8|GPIO_Pin_9|

GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_15|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

 

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_12|GPIO_Pin_13|

GPIO_Pin_14|GPIO_Pin_15|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_9|GPIO_Pin_0|

GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_ResetBits(GPIOB,8);

GPIO_ResetBits(GPIOB,2);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOC, &GPIO_InitStructure);

   

}

这段代码不再一一解释其实就是,我这里只是将没有用到的IO口设置为了模拟输入模式。


今后还会更新RTC配置低功耗唤醒功能。

关键字:mpu6050  STM32  休眠唤醒  低功耗 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic474042.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:在keil (MDK)中添加 STM32型号
下一篇:串口控制LED点亮stm32中断 跑马灯

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于ARM7 ADUC7020+MPU6050的计步算法
单片机源程序如下:/*********************************************************************Author        : J ScarlettDate          : Nov 2006Files          : main.c, display.c, ped.cHardware      : ADuC7020Description   : Implements a si
发表于 2019-10-15
第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列
本章参考数据:《STM32F4xx参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于MPU6050的参考资料:《MPU-60X0寄存器》、《MPU6050数据手册》以及官方驱动《motion_driver_6.12》。本章讲解的内容跨领域的知识较多,若您感兴趣,请自行查阅各方面的资料,对比学习。44.1 姿态检测1.    基本认识在飞行器中,飞行姿态是非常重要的参数,见图 441,以飞机自身的中心建立坐标系,当飞机绕坐标轴旋转的时候,会分别影响偏航角、横滚角及俯仰角。图 441 表示飞机姿态的偏航角、横滚角及俯仰角假如我们知道飞机
发表于 2019-09-19
第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列
STM32l151带MPU6050中断唤醒并发送数据到云平台
最近在调试STM32L151带mpu6050的中断唤醒的项目,下面写一下项目经历:1.首先贴出我的主函数int main(void){   SystemInit();delay_init(72);  //初始化延时函数 MY_GPIO_AN();//全部 模拟输入 //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2  Base_TIM6_Init(); uart_init(115200); //初始化串口波特率为115200   SYS_RTCInit(60*5); //12h
发表于 2019-09-09
STM32F429 >> 17. 利用MPU6050 进行姿态检测(Code)
; ******************************************************************************  */#include "mpu6050.h"/**  * @brief  Initialize the MPU6050 through operate the register   * @param  None    * @retval None  */void MPU6050_Init(void){  int i=0,j=0;  //We
发表于 2019-08-29
STM32F429 >> 17. 利用MPU6050 进行姿态检测
代表 20厘米,我们称它的分辨率为 1LSB/20cm,它等效于 5 位表示 1 米:5LSB/m。其中的 LSB(Least Significant Bit),意为最 ADC 的低有效位。使用采样得到的 ADC 数值,除以分辨率,即可求取得到物理量。例如使用分辨率为5LSB/m、线性误差为 0.1m 的传感器进行长度测量,其 ADC 采样得到数据值为“20”,可计算知道该传感器的测量值为 4 米,而该长度的真实值介于 3.9-4.1 米之间。MPU6050简介MPU6050 芯片,它是一种六轴传感器模块,采用 InvenSense 公司的 MPU6050 作为主芯片,能同时检测三轴加速度、三轴陀螺仪(三轴角速度)的运动数据以及温度
发表于 2019-08-29
STM32F429 >> 17. 利用MPU6050 进行姿态检测
stm32正点原子学习笔记(29)独立看门狗实验
; IWDG_ReloadCounter(); 9     IWDG_Enable();10     11 }iwdg.h1 #ifndef __IWDG_H2 #define __IWDG_H3 4 #include "stm32f10x.h"5 6 void iwdg_init(uint8_t IWDG_Prescaler,uint16_t Reload);7 8 9 #endifmain.c 1 #include "exti.h" 2 #include "
发表于 2019-11-11
stm32正点原子学习笔记(29)独立看门狗实验
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved