2013-05-18 11:43:03 superanters 阅读数 4889
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3395 人正在学习 去看看 朱有鹏

     许多人说PIC单片机一大的优势就是低功耗,那我们就来讨论,讨论低功耗的实现。

1,睡眠(sleep)

   睡眠方式是我们最常用的一种方式来降低功耗,但睡眠期间单片机不能做任何的事情。对于那些没事情就睡着,有事情就做一下的情况睡眠无疑是功耗最低的处理方式。

 比如:

            睡眠+ I/O电平变化中断唤醒 当按键没按下时,单片机睡眠,当按键按下后,执行相应的工作。

            睡眠+数据接收中断唤醒      这样单片机就可以再没有接收到数据时候进入睡眠状态,接收到数据的时候就唤醒然后处理数据。当然首先单片机要有相关的外设比如SPI ,I2C,USART,等这些支持这些通讯的模块。

            睡眠+看门狗唤醒                  这个可以用在需要定时唤醒做事情的场合

2,降低时钟频率

             如果即想功耗低,又想单片机在能低功耗的情况下工作。这无疑是个最好的选择。

            PIC单片机 比如PIC16F1823 /1829可以选择从32MHz到31KHz的内部时钟频率,我们通常可以将单片机设置在 4MHz 以上的频率下工作,如果需要单片机降低功耗的时候可以降低频率比如在31KHz的频率下工作。

           虽然PIC16F1823数据手册中写到,单片机在睡眠电流只有只纳安,在31KHz的电流有几微安。但事实纳安只是个幻想。在项目一个中我使用降频得到的最低功耗是50微安左右,采用睡眠也是50微安。因为在如此低的频率下,功耗主要是流失在I/O口上了。

3,电流大户

      单片机工作时钟频率,要降低功耗首先要不就睡眠(关掉时钟),要么就降低频率。

       最耗电流的模块 就数ADC模块,其实模块的耗电和他比起来就是小巫见大巫。所以要低功耗ADC模块绝对不能开。

       还有个用电大户就是I/O口,I/O要不上拉,要不下拉,不能悬空,除此之外还有其他因素,比如I/0口的输入输出状态,比如和其它芯片连接要串个电阻。

       

2018-06-26 17:06:34 tongzuo1997 阅读数 1150
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3395 人正在学习 去看看 朱有鹏

   在执行sleep(); 函数前,可以将不用的引脚设置为模拟输入,高阻态模式。

ANSELAbits.ANSA4 = 1;   //进入sleep前,将LED IO口设置为模拟输入
TRISAbits.TRISA4 = 1; 

    如果设置为数字输入的话,将会提高功耗,约40uA(单个IO)

ANSELAbits.ANSA4 = 0;   //设置为数字输入 (不可取)
TRISAbits.TRISA4 = 1; 

PIC16F1508中有稳压器控制寄存器,将VREGPM:稳压器功耗模式选择位,置1时,休眠时使能低功耗休眠模式

休眠时消耗的电流最低,唤醒速度较慢

VREGPM=1;       //使能低功耗休眠
实测功耗降低了4uA左右。
2019-10-18 09:04:17 kchuang2008 阅读数 31
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3395 人正在学习 去看看 朱有鹏

本算法把单片机软件功能划分成一个个子任务,每个子任务有一个标志。任务对应的标志为1,就需要运行该任务,为0,跳过该任务。只要所有的任务标志位都为0,说明没有任务可以运行,就进入低功耗睡眠状态。

单片机的唤醒,需要外部事件的触发,比如按键触发,定时触发。以两个比较典型的任务:按键任务,定时任务为例,说明实现过程,按键任务特点是需要运行一定时间,定时任务特点是运行一次:
1.判断按键任务标志是否为1,为1,则处理按键任务,在按键任务里判断任务是否结束,如果结束就清除任务标志。
2.判断定时任务标志是否为1,为1,则处理定时任务,处理完后,清除定时任务标志。
3.判断标志是否都为0,为0则进入低功耗模式。

一般任务在循环里只运行一次就立即结束。但是也存在有些任务,比如按键任务,针对要处理按键长按的情况,需要运行一定时间,所以针对此类任务会设置超时时间,如果任务没运行完,但是超时了,就立即清除任务标志。这样就不会存在有任务会长时间运行,导致不进入低功耗睡眠状态而耗电。

伪代码:
While (1)
{
    If (按键任务标志 == 1)
    {
        处理按键任务(在按键任务里判断任务是否结束,如果结束就清除任务标志)
    }
    If (定时任务标志 == 1)
    {
        处理定时任务
       定时任务标志清0
    }
    If (所有任务标志都为0)
    {
        睡眠
    }
}

算法特点:
1.与任务个数无关。
2.每个任务都可以执行到,不存在优先级高的任务一直执行,导致其他任务没法执行。
3.有超时机制,保证一定会进入低功耗。
4.实现简单。

2017-07-24 20:52:16 qq_22158695 阅读数 2693
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3395 人正在学习 去看看 朱有鹏

最近几天,老师让我做个项目,关于是STM32f103rc单片机驱动mpu6050单片机实现低功耗。首先想到的是单片机的低功耗,大概有三种模式,

分别为睡眠模式、停止模式、以及待机模式。
1.睡眠模式:M3内核停止工作,所有的外设处于工作状态(当然是你不关闭外设的前提下)。
  特点:SRAM的内容和寄存器的状态保持不变。
  唤醒条件:任意的中断和事件
2.停止模式:停止所有内部的1.8V部分的供电,PLL、HSI、RC振荡器和HSE振荡器。CPU停止工作,外设也停止工作
  特点:SRAM的数据和寄存器依然保存
  唤醒条件:任意的外部中断,RTC闹钟,PVD输出,USB唤醒条件
  3.待机模式:内部电压调节电路被关闭, HSE、HIS、PLL被关闭,CPU停止工作,外设停止工作。
   特点:SRAM的内容和寄存器的内容将会丢失
   唤醒条件:NRTS的外部复位信号,IWDG复位、WKUP引脚上的一个上升边沿或者RTC闹钟

 

通过网上查看资料,待机模式的功耗最低,因此在本项目中直接选择了待机模式。因为电路板直接焊接好了,单片机和陀螺仪模块焊接在了一起。一开始并没有考虑太多,直接调试待机程序,移植MPU6050程序,比较顺利就移植通过(陀螺仪程序不同例程中的初始化方式不同,各有优缺点,回头再说)。感觉项目做的比较顺利,老师让我测试一下电路板电流,结果拿万用表一测试,傻眼了,在单片机一上电(待机状态)的时候,电流为3ma左右,然后通过按键唤醒单片机,电流到了惊人的50ma,然后再待机,电流为8ma,很是疑惑,为什么两次待机模式的电流这么大?为什么两次待机模式的电流不一样,而且相差几个ma?为什么正常工作的电流这么大?完全不符合要求。

通过查阅,发现在单片机正常工作方式下,如果想降低功耗,唯一的办法就是降低单片机的主频。

 

 

根据上面的表中得知,系统选择外部时钟,只有将外部晶振降低,倍频降低,才可以降低功耗,因此选择了4M的外部晶振(晶振选择范围4-16M),而且不采用倍频。程序调试通过后,万用表检测唤醒后的电流,为22ma,瞬间降低了一半还要多,感觉有了希望。

主频降低了,功耗降低了,但是在待机模式下功耗还没有下来。而且在正常工作前后的待机电流不相同,感觉很是奇怪。开始认为是程序的问题,尝试了其他两种休眠方法(睡眠模式、停止模式)之后,感觉现象是一样的。这个时候想起来,是不是陀螺仪对系统的影响,瞬间把陀螺仪卸下来,发现确实是这样,单片机的功耗降得很低了,而且一上电后的电流和唤醒之后的待机模式的电流是相同的。也就是说,问题就是陀螺仪。

MPU6050陀螺仪是有休眠模式的,也就是说,一上电陀螺仪进入了休眠模式,但是之后陀螺仪一直处于工作状态的,虽然单片机进入了待机,但是陀螺仪并没有进入休眠,因此一直消耗的电流较大。通过查看,陀螺仪的休眠模式是对陀螺仪的电源进行设置,对其寄存器中的值进行设定。休眠模式就是MPU6050内部所有寄存器恢复默认值,通过对电源管理寄存器1(0X6B)的bit7写1实现(也就是对0X6B寄存器的值写0x40),这个时候陀螺仪就进入了休眠模式,电流瞬间下降。然后正常工作的时候,对电源管理寄存器1(0X6B)必须设置该寄存器为0X00,以唤醒MPU6050,进入正常工作状态。这个就完美解决了休眠与唤醒间的交替变化。

 

Single_Write(MPU6050_ADDRESS, PWR_MGMT_1, 0x40);//进入休眠状态  

Single_Write(MPU6050_ADDRESS, PWR_MGMT_1, 0x00);//解除休眠状态  

 

其中进入休眠模式的程序:

Single_Write(MPU6050_ADDRESS, PWR_MGMT_1, 0x40);//进入休眠状态

Sys_Enter_Standby();//单片机进入休眠模式

最终,单片机在待机时候的电流不到1ma,在唤醒状态的电流为21ma,但是待机模式仍然没有达到网上各位大神写的几个uA,不知道什么原因,望请各位大神进行评论。

2015-08-25 12:26:23 beep_ 阅读数 9816
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3395 人正在学习 去看看 朱有鹏

本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。

一、STM32芯片性能

使用芯片型号:stm32f030f4,CORTEX -M0.封装TSSOP20.

运行模式:内部时钟(HSI),系统时钟频率采用48MHZ

工作电压:3.3V

芯片具体参数如下:


二、芯片功耗

功耗:


芯片工作模式:

工作模式:外设正常运行,内核CPU及SRAM供电,未使用外设的时钟默认关闭。

睡眠模式只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。

停机模式1.8V供电区域时钟被停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,但SRAM和寄存器不断电,此时只能依靠外部中断(EXTI)RTC时钟才能唤醒。

待机模式:1.8V供电区域被时钟停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测器也可进入低功耗模式,SRAM和不属于待机电路的寄存器也被断电关闭,此时即使是外部中断(EXTI)也不能将其唤醒,只能通过复位(外部复位,看门狗复位)、唤醒引脚、RTC时钟来唤醒。

注意:无论是在停止模式 还是待机模式下,RTCIWDG及其时钟源不会被关闭。

各个模式功耗:

功耗计算方式:功耗=工作电压*工作电流。




I/O模块损耗:

静态损耗:

内部上下拉电阻损耗:这部分损耗主要取决于内部电阻的大小,一般为了降低内部电阻损耗常常需要降低电阻两端电压,若引脚为低电压则采用下拉电阻,若引脚为高电压则采用上拉电阻。

I/O额外损耗:当引脚设为输入I/O时,用来区分电压高低的斯密特触发器电路会产生一部分消耗,为此可将引脚设为模拟输入模式。

动态损耗:对于悬浮的引脚,由于其电压不稳定会产生外部电磁干扰和损耗,因此必须把悬浮引脚设为模拟模式或输出模式,引脚电压的切换会对外部和内部电容负载产生动态损耗,其损耗与电压切换频率和负载电容有关。具体损耗值如下:


三、CORTEX-M0低功耗功能、指令、相关寄存器

CORREX内核支持低功耗模式有2种:

睡眠模式CPU时钟停止,对应stm32睡眠模式

深度睡眠模式:系统时钟停止,PLL,FLASH 关闭,对应stm32停机模式。

进入睡眠模式:

CPU处理完中断后软件必须能使其进入睡眠模式,当CPU执行WFI指令,其将会立即进入睡眠模式,当异常产生或中断被挂起时,其立即被唤醒。

CPU执行WFE指令时,它首先会检查对应的事件标志位,当事件标志寄存器为0时进入睡眠模式,否则将寄存器事件标志清0并继续执行程序。事件标志可由外部事件标志或SEV指令产生。

返回方式:通过设置内核SCB寄存器的Sleep-on-exit位,可以选择系统被唤醒执行完中断服务程序后进入主线程模式后是否立即进入睡眠模式。

从睡眠中唤醒:

WFI唤醒或sleep-on-exit

一般来说,使能的异常可以唤醒内核。对于一些系统,在唤醒后执行中断处理程序前需要先执行重新恢复的任务,则首先需要屏蔽所有中断(PRIMASK=1),中断发生后内核被唤醒但不执行中断处理,待执行完恢复任务后再将PRIMASK设为0,此后执行中断处理任务。

WFE唤醒:

使能异常可以唤醒内核。外部事件或SEV指令发送的事件也可唤醒内核。

注意:当SCRSEVONPEND设置为1时,任何使能/非使能中断或事件都可唤醒内核。

中断唤醒控制器(WIC):

WIC只有在SCR寄存器DEEPSLEEP位设为1时才能使能,WIC不可编程也没有相关的控制寄存器,它仅与硬件信号有关,当进入深睡眠时内核大部分模块被关闭,系统计数器也被关闭,因此当内核被唤醒时需要较多的时间恢复到睡眠前的状态并处理中断。

外部事件输入:可在WFE模式下唤醒内核。

相关指令:

WFE  等待事件,若无事件则睡眠,中断、事件唤醒

WFI   等待中断,立即进入睡眠,中断唤醒

SEV  软件发送一个事件,在核系统中可唤醒另一个内核。

微控制器软件接口标准

由指令对应的C语言接口:

//core_cmInstr.h

void __WFE(void) // Wait for Event

void __WFI(void) // Wait for Interrupt

void __SEV(void) // Send Event

相关寄存器:

SCR寄存器:


SEVONPEND:

0: 只有使能的中断或事件才能唤醒内核。

1: 任何中断和事件都可以唤醒内核。

SLEEPDEEP:

0: 低功耗模式为睡眠模式。

1: 进入低功耗时为深度睡眠模式。

SLEEPONEXIT:

0:  被唤醒进入线程模式后不再进入睡眠模式。

1: 被唤醒后执行完相应的中断处理函数后进入睡眠模式。

四、STM32时钟管理

运行模式下可通过关闭和降低相关外设的时钟频率来减少功耗。

APB 外设时钟和DMA时钟可用软件禁止。

睡眠模式停止CPU时钟。在CPU睡眠中存储器接口时钟(FlashRAM接口)可被停止。当连接到APB所有外设的时钟禁止后,当进入睡眠期间AHB APB桥时钟由CPU的硬件关闭。

CPU进入停止模式时停止V18域、PLLHSIHSI14HSE振荡器的时钟。

HDMI CEC, USART1 I2C1 即使在MCU 进入停止模式下仍有能力打开HIS振荡器 (假如HIS被选为这些外设的时钟)

LSE振荡器已使能的情况下,HDMI CEC 和 USART1 当在系统进入停止模式下也可由LSE振荡器驱动 (假如LSE被选为这些外设时钟)。但是这些外设没有打开LSE振荡器的能力。

CPU进入待机模式时停止V18域、PLLHSIHSI14HSE振荡器的时钟。

当设置DBGMCU_CR寄存器中的DBG_STOP DBG_STANDBY位,那么CPU在相应的深度睡眠模式下也可以具有调试功能。

当系统由中断(停止模式)或复位(待机模式)唤醒后,HSI振荡器被选为系统时钟(不管进入停止模式或待机模式前选用的是何种时钟)

假如当前正在进行闪存编程,只有在闪存编程全部完成之后才会进入深度睡眠模式(深度睡眠延后)。若当前正在使用APB域,那么只有全部完成APB域的操作后才进入深度睡眠模式。

五、STM32低功耗设置


STM32工作模式主要有运行、睡眠、停止、待机4种模式,前面已介绍过。详细见第二节。

供电框图

  由上图可以看到整个stm32芯片的供电图,模拟电路部分采用VDDA独立供电,各个部分可以独立被关断或开启。备份电路部分由电池供电,主要有RTC时钟及相关的备份寄存器,VDD掉电后可由电池供电,对于没有VBAT引脚的芯片,其电源直接与VDD相连。核心部分分为1.8V工作域和VDD工作域,1.8V工作域主要有内核、存储、外设部分,VDD供电域主要有I/O、待机电路(唤醒电路,独立看门狗)、电压调节器(Voltage Regulator)

电压调节器

器件复位后电压调节器总是打开着的,其根据应用模式有三种不同的工作模式。

运行模式:调节器以全功耗模式为域 (内核,内存和数字外设提供1.8V电源。

停止模式:调节器以低功耗模式为保持寄存器及SRAM数据部分域提供1.8V的电源。

待机模式:调节器断电,除了待机电路及备份域电路外,寄存器和SRAM的内容全部丢失。

相关寄存器介绍:

1cortex-mo中的SCR寄存器

SEVONPEND:

0: 只有使能的中断或事件才能唤醒内核。

1: 任何中断和事件都可以唤醒内核。

SLEEPDEEP:

0: 低功耗模式为睡眠模式。

1: 进入低功耗时为深度睡眠模式。

SLEEPONEXIT:

0:  被唤醒进入线程模式后不再进入睡眠模式。

1: 被唤醒后执行完相应的中断处理函数后进入睡眠模式。

2,电源控制寄存器PWR_CR


其中与低功耗有关的控制位:

CSBF: 清除待机标志,该位始终读出为0,写1清除待机标志。

CWUF: 清除唤醒标志,该位始终读出为0。写1清除唤醒标志。

PDDS: 掉电深睡眠

0: CPU进入深睡眠时进入停机模式,调压器的状态由LPDS位控制。

1: CPU进入深睡眠时进入待机模式。

LPDS: 深睡眠下的低功耗

0: 在停机模式下电压调节器开启

1: 在停机模式下电压调节器处于低功耗模式

3,电源控制/状态寄存器(PWR_CSR)


EWUP2/EWUP1: 使能WKUP2EWUP1引脚。

0: WKUP1/2 引脚作为通用IO口。WKUP1引脚上的事件不能将CPU从待机模式唤醒。

1: WKUP1/2引脚用于将CPU从待机模式唤醒,WKUP1引脚被强置为输入下拉的配置(WKUP1引脚上的上升沿将系统从待机模式唤醒)

SBF: 待机标志

该位由硬件设置,只能设置电源控制寄存器PWR_CRCSBF位清除。

0:系统不在待机模式

1:系统进入待机模式

WUF: 唤醒标志

由硬件设置,只能设置电源控制寄存器PWR_CRCWUF位清除。

0: 没有唤醒事件发生

1: WKUPRTC闹钟产生一个唤醒事件

注意:当WKUP引脚已经是高电平时,在(通过设置EWUP)使能WKUP引脚时,会检测到一个额外唤醒的事件。 

低功耗模式的进入与退出问题

1、睡眠模式

进入睡眠模式:

STM32在运行状态时,执行WFIWFE指令可进入睡眠模式。

条件:SLEEPDEEP=0,设为睡眠模式。此时CPU时钟被停止。

若令被唤醒的STM32执行完中断处理任务后进入睡眠模式,则可将SLEEPONEXIT设为1.

退出睡眠模式:

执行WFI指令进入睡眠,可通过使能中断唤醒。执行WFE指令进入睡眠可由事件唤醒,CPU时钟打开。产生事件的两种方式:

配置一个外部或内部EXTI线做为事件模式。

使能外设中断但不使能NVIC中断,同时将SEVONPEND设为1,此时任何中断和事件都可以唤醒内核,此时必须清除NVIC和外设的中断标志以免唤醒后出错。

2、停止模式

进入停止模式:

进入停止模式后1.8电压区域时钟被停止,PLLHSIHSE被关闭,但SRAM和寄存器正常供电。进入停止模式方法:首先确定所有中断/事件标志被清除否则不会进入停止模式,关闭ADC\DAC电源,将SLEEPDEEP设为深睡眠模式,在深睡眠后选择进入停机模式(PDDS=0),可关闭或开启电压调节器(LPDS),执行WFIWFE指令进入停机模式。

退出停止模式:

一个使能的外部中断或外部事件可唤醒STM32SMT32被唤醒后系统时钟被设为HSI。因此在唤醒后还需软件恢复时钟设置,并清除相关的低功耗标志。

3、待机模式

进入待机模式:

进入SRAM和寄存器内容丢失,进入条件:将SLEEPDEEP设为深睡眠模式,在深睡眠后选择进入待机模式(PDDS=1),关闭电压调节器(LPDS),执行WFIWFE指令进入待机模式。

在待机模式下,除了复位引脚(始终有效)、当配置为防侵入或校准输出时的TAMPER 引脚、使能的唤醒(WKUP)引脚外,所有的I/O口线处于高阻态。因此进入待机模式前不需要再特意配置引脚的低功耗特性。

退出待机模式:

IWDG复位,WKUP引脚上的上升沿或RTC 闹钟事件可唤醒STM32,当退出待机模式时除了电源控制/状态寄存器(PWR_CSR)外所有寄存器复位,整个系统被复位。

4、低功耗模式下的RTC自动唤醒

RTC可以在不需要依赖外部中断的情况下唤醒低功耗模式下的微控制器(自动唤醒模式)RTC提供一个可编程的时间基数,用于周期性从停止或待机模式下唤醒。

从停止模式下唤醒,必须进行如下操作:

配置外部中断线17为上升沿触发。

配置RTC使其可产生RTC闹钟事件。

从待机模式中唤醒,不必配置外部中断线17

5、调试模式

默认情况下,如果在进行调试微处理器时,使微处理器进入停止或待机模式,将失去调试连接。这是因为Cortex-M0的内核失去了时钟。通过设置DBGMCU_CR寄存器中的某些配置位,可以在使用低功耗模式下调试软件。

六、低功耗模式总结

降低STM32功耗方法主要有:

关闭不需要的外设、降低STM32的系统频率。

合理设置I/O降低I/O静态和动态损耗。

进入低功耗模式。

恢复到正常运行状态:

睡眠模式由中断或事件唤醒,唤醒后可清除唤醒标志。

停止模式:唤醒后需恢复时钟设置,并将改动的I/O设置恢复。

待机模式:唤醒后系统被恢复,随后系统被复位,可清除待机标志。

 

七、固件库使用

主要文件:

stm32f0xx_rcc.cstm32f0xx_gpio.cstm32f0xx_pwr.c

 

时钟及I/O设置相关函数(部分):

void RCC_XXXPeriphClockCmd(X,X) ; //用于使能和关闭外设时钟

void SystemInit (void)//系统初始化设置时钟

GPIO_Init(GPIOX, &GPIO_InitStructure);//设置相关引脚

 

低功耗函数(部分):

 

//唤醒引脚配置

void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState);

///清除寄存器状态标识

FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);

void PWR_ClearFlag(uint32_t PWR_FLAG);

进入低功耗模式:

void  PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry);

Void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);

void PWR_EnterSTANDBYMode(void);

 

函数解析:

下面是一个进入停机模式的函数,此函数功能和使用方法在注释部分已经非常明确。通过源代码可以看出SMT32在停机模式下寄存器的设置情况。调用此函数STM32可进入低功耗模式。


void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)

{

  uint32_t tmpreg = 0;

 

  /* Check the parameters */

  assert_param(IS_PWR_REGULATOR(PWR_Regulator));

  assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));

 

  /* Select the regulator state in STOP mode ---------------------------------*/

  tmpreg = PWR->CR;

  /* Clear PDDS and LPDSR bits */

  tmpreg &= CR_DS_MASK;

 

  /* Set LPDSR bit according to PWR_Regulator value */

  tmpreg |= PWR_Regulator;

 

  /* Store the new value */

  PWR->CR = tmpreg;

 

  /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */

  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

 

  /* Select STOP mode entry --------------------------------------------------*/

  if(PWR_STOPEntry == PWR_STOPEntry_WFI)

  {

    /* Request Wait For Interrupt */

    __WFI();

  }

  else

  {

    /* Request Wait For Event */

    __WFE();

  }

  /* Reset SLEEPDEEP bit of Cortex System Control Register */

  SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);  

}

 

 

博客地址:Beep  http://blog.csdn.net/beep_

STM8L051低功耗实现

阅读数 4407

没有更多推荐了,返回首页