STM8 低功耗模式 STM8应用笔记
- 格式:doc
- 大小:13.58 KB
- 文档页数:4
STM8学习笔记——时钟和GPIO说起STM8 的时钟,那还真是个杯具,用HSI 没问题,切换到HSE 也没问题,就是切LSI 怎么都不行,然后百思不得其解人,然后上论坛求教,才知道还有个选项字节(OPTION BYTE),数据手册上有这么一段描述:选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的块内。
除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和一个用来备份的互补格式(NOPTx)要使用内部低速RC 必须将LSI_EN 置1,就是这个地方让我纠结了半天,然后用IAR 将其置1,方法是:进入调试模式,在上面有个ST-LINK,点击,看到OPTION BYTE,左键点进去,右键单击上面的选项,就可更改了,然后全速运行,就写进去了。
STM8 的时钟分为HSI,HSE,LSI,最常用的是HSI,STMS105S4 内置的是16M 的RC,叫fhsi。
它可以分频输出为fhsidiv=fhsi/hsidiv,如果选择其为主时钟源,那么主时钟fmaster=fhsidiv。
CPU 时钟fcpu=fmaster/cpudiv。
可以通过外设时钟门控寄存器CLK_PCKENR1 和CLK_PCKENR2 选择是否与某个外设连接。
好了上个切换内部时钟的源代码,测试通过void CLK_Init(void){ //切换到内部LSI(!!!需要修改选项字节的LSI_EN 为1)CLK_ICKR|=0x08;//开启内部低速RC 震荡while(CLK_ICKR&0x10==0); //LSI 准备就绪CLK_SWR=0xd2; while(CLK_SWCR&0x08==0); //等待目标时钟源就绪CLK_SWCR|=0x02; //CPU 分频设置CLK_CKDIVR=0;//内部RC 输出。
STM8 实战篇
一、参考文档《STM8单片机入门V3.0》安装软件。
建议安装在C盘(默认路径)主要看软件安装和cosmic和STVD的结合使用
二、自己建立C语言工程。
(不使用库文件)
建议先新建文件夹
添加头文件和文件路径
路径在
D:\Program Files\STMicroelectronics\st_toolset\include
Stm8s105k.h中定义了特殊寄存器。
下面开始编写程序
硬件中PE5口有一个LED。
做一个闪烁灯。
在线
使用标准库:
和上面一样建立普通的工程。
从其他以库建立的工程中复制以上文件
其中main 和stm8_interrupt_vector 为替换
添加文件:
继续添加使用模块对应的文件
根据主程序使用的配置来添加响应的东西。
可以建立如下的结构
添加文件为
编译后成功。
当然附件了又demo的程序,大家可以拷贝其中的文件,还可以直接在此文件上写程序。
stm8s和stm8l低功耗对⽐stm8s和stm8l低功耗对⽐ 在低功耗应⽤中,⼀般来说mcu是常态halt模式,然后偶尔被唤醒(外部中断或者内部定时唤醒)进⼊运⾏模式。
所以对⽐低功耗性能,⼀般来说只需要对⽐run模式和halt下的功耗即可,因为项⽬选⽤的是通过内部定时器唤醒,所以选⽤active halt mode。
以下是stm8s003和stm8l151在这两种模式下的功耗对⽐:run mode:stm8sstm8l对⽐ 在使⽤同样的16M内部RC振荡器情况下,stm8s 3.7ma,stm8l 3.54ma,两款mcu耗电量差不多。
active halt mode:stm8sstm8l对⽐ 在同样的关闭外设,且使⽤内部低速RC振荡器唤醒的情况下:stm8s 10ua,stm8l 0.54ua。
⼤约有20倍的差距,不过对于要求不是特别⾼的情况下,ua级别的差距影响不会太⼤。
实测:为了实际验证,分别将单⽚机焊接到空板⼦上编写代码进⾏测试。
stm8 编写如下代码:32ms唤醒⼀次主程序:void main(void){CLK_HSECmd ( DISABLE );CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);AWU_DeInit();AWU_Init(AWU_TIMEBASE_32MS);CLK_SlowActiveHaltWakeUpCmd(ENABLE); //关闭活跃停机模式下的电压调节器(MVR)CLK_FastHaltWakeUpCmd(DISABLE); //关闭快速唤醒FLASH_SetLowPowerMode(FLASH_LPMODE_POWERDOWN); //设置为停机后flash掉电GPIO_Init(GPIOA,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);GPIO_WriteLow(GPIOA,GPIO_PIN_ALL);GPIO_WriteLow(GPIOB,GPIO_PIN_ALL);GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);GPIO_WriteLow(GPIOD,GPIO_PIN_ALL);AWU_Cmd(ENABLE);while(1){ halt();}}中断处理程序:INTERRUPT_HANDLER(AWU_IRQHandler, 1){/* In order to detect unexpected events during development,it is recommended to set a breakpoint on the following instruction.*/u8 awu_temp = 0;awu_temp = AWU_GetFlagStatus();}程序下载到单⽚机后,串到台式万⽤表上实测电流11ua,见下图:stm8l 编写如下代码:32ms唤醒⼀次主程序:void main(void){GPIO_Init(GPIOA, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);GPIO_Init(GPIOE, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);GPIO_Init(GPIOF, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);GPIO_Write(GPIOA,0x00);GPIO_Write(GPIOB,0x00);GPIO_Write(GPIOC,0x00);GPIO_Write(GPIOD,0x00);GPIO_Write(GPIOE,0x00);GPIO_Write(GPIOF,0x00);RTC_DeInit(); //初始化默认状态CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); //允许RTC时钟CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1); // 38K/1 RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div2); //38/2=19KRTC_SetWakeUpCounter(19*32); //19*32 32msRTC_ITConfig(RTC_IT_WUT, ENABLE); //开启中断PWR_FastWakeUpCmd(DISABLE); //关闭快速唤醒功能PWR_UltraLowPowerCmd(ENABLE);//超低功耗RTC_WakeUpCmd(ENABLE);while(1){ halt();}}中断处理程序:INTERRUPT_HANDLER(RTC_CSSLSE_IRQHandler,4){/* In order to detect unexpected events during development,it is recommended to set a breakpoint on the following instruction.*/RTC_ClearITPendingBit(RTC_IT_WUT);}将程序下载到单⽚机后,串到台式万⽤表测试电流在4ua左右,见下图:。
STM8L051低功耗模式测试文档STM8L051的五种低功耗模式wait ,low power run mode,low power wait mode,Ative-Halt mode,Halt mode。
1、WAIT mode在等待模式,CPU的时钟是停止的,被选择的外设继续运行。
W AIT mode 分为两种方式:WFE,WFI。
WFE是等待事件发生,才从等待模式中唤醒。
WFI是等待中断发生,才从等待模式中唤醒。
2、low power run mode在低功耗运行模式下,CPU和被选择的外设在工作,程序执行在LSI或者LSE下,从RAM 中执行程序,Flash和EEPROM都要停止运行。
电压被配置成Ultra Low Power模式。
进入此模式可以通过软件配置,退出此模式可以软件配置或者是复位。
3、low power wait mode这种模式进入是在low power run mode下,执行wfe。
在此模式下CPU时钟会被停止,其他的外设运行情况和low power run mode类似。
在此模式下可以被内部或外部事件、中断和复位唤醒。
当被事件唤醒后,系统恢复到low power run mode。
4、Active-Halt mode在此模式下,除了RTC外,CPU和其他外设的时钟被停止。
系统唤醒是通过RTC中断、外部中断或是复位。
5、Halt mode在此模式下,CPU和外设的时钟都被停止。
系统唤醒是通过外部中断或复位。
关闭内部的参考电压可以进一步降低功耗。
通过配置ULP位和FWU位,也可以6us的快速唤醒,不用等待内部的参考电压启动。
一、各个低功耗模式的代码实现1、WAIT mode等待模式分为两种:WFI和WFE。
1.1 WFI mode当执行“wfi”语句时,系统就进入WFI模式,当中断发生时,CPU被从WFI模式唤醒,执行中断服务程序和继续向下执行程序。
通过置位CFG_GCR的AL位,使主程序服务完中断服务程序后,重新返回到WFI 模式。
STM8L低功耗调试方法做了一个电池供电的项目,刚开始光想着完成功能,最后再去整低功耗。
看了资料STM8L 的低功耗感觉很好。
结果把自己坑惨了。
因为就这个功能老是实现不了。
着急上火的我,从ST的官网下载了STM8L的代码。
关键词,就一句话:Halt_Init();发现解决不了问题。
又接着看资料。
表示要关闭各路时钟CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_TIM3, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_LCD, DISABLE);想想也是,应该让这些个模块都休息。
把功耗降低。
结果不尽人意。
又找来一句:PWR_UltraLowPowerCmd(ENABLE);还是不行。
又找百度,发现GPIO的设置很重要。
于是,把所有的GPIO全部设为输出。
且都设为与上下拉相对应的电平。
保证没有漏电流。
仍然解决不了问题。
越到后面越急。
发现加了一堆代码。
就是不行。
发现总是有1.27MA的电流。
一直存在。
坑的事情发生了,网上居然很多人都是在这个电流附近。
各种神操作。
两天后(每天只折腾一到二个小时),我奔溃了。
接下来,我静下心来,弄了一个全新的工程。
把代码一小段一小段的加上去试。
终于发现有些有意思的事情了。
原以为,把时钟关闭,这个模块就没有了驱动,就会休息。
就应该省电。
实际上,这个操作是有个过程的,看一下正常的初始化操作(以定时器为例)CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE);TIM4_TimeBaseInit(TIM4_Prescaler_16 ,124);TIM4_ITConfig(TIM4_IT_Update , ENABLE);TIM4_Cmd(ENABLE);要求,先打开时钟,然后设好时钟的分频和时钟基数,再打开中断允许,最后开启时钟功能。
STM8学习笔记——初步认识最近项目要求找个便宜又够用的单片机,本来是想选STC 的,但其实STC 也并不便宜,且调试比较麻烦,而且AD 不是很好,所以选择了STM8。
昨天买来了ST-LINK III,拿了一块STM8S105S4,此单片机有16K ROM,2K RAM,1K 的EEPROM,带10bitADC,定时器(ICOCPWM)和SPI I2C UART 通讯接口,看门狗等,封装为LQFP44。
这款单片机的供电分得很细,主电源、IO 口、模拟供电都分开,这样就可以非常灵活的配置,比如模拟供电可以选用5V 以扩大量程;IO 口可以配置位3.3 或5V 以适应一些设备。
上图中VDD/VSS 引脚用于给内部主电压调节器(MVR)和内部低功耗电压(LPVR)调节器供电。
这两个调节器的输出连接在一起,向MCU 的核(CPU,FLASH 和RAM)提供1.8V 电源(V18)。
在低功耗模式下,系统会将供电电源从MVR 自动切换到LPVR 以减少电流消耗。
为稳定MVR,在VCAP 引脚必须连接一个电容。
该电容应该拥有较低的等效串联电阻值(ESR),电容最小的推荐容值为470nF。
ST-LINK III 管脚定义及接法:ST-LINK III LED 灯三种状态含义:常亮:目标板与ST-LINK 在SWIM 模式或者JTAG/SWD 模式下已经通讯初始化。
闪烁:目标板与ST-LINK 正在进行数据交换。
熄灭:目标板与ST-LINK 没有通讯初始化。
开发平台:还是比较习惯用IAR,查了下果然有IAR for STM8,于是下了并和谐,然后随便写了个程序,下载调试,发现出错,更新ST-LINK III 的固件,无果。
难道是IAR 的问题?于是下载官方的STVD,安装后发现也无法下载,提示是。
所用芯片 stm8s105s4开发环境:ST Visual DevelopStm8s的库为V1.1.1CPU频率及所有外设频率/时钟系统复位后,所有外设时钟均处于开的状态。
用户可通过清除CLK_PCKENR1或CLK_PCKENR2中的PCKEN位来关闭相应的外设时钟。
但是在关闭外设的时钟前,用户必须设置相应的位禁用该外设。
为了使能一个外设,用户必须先设置寄存器CLK_PCKENR中对应的PCKEN位,然后设置外设控制寄存器中的外设使能位。
AWU计数器是由独立于fMASTER的内部或外部时钟(LSI或HSE)驱动,因此,即使寄存器的时钟已被关掉,该外设依然可以继续运行。
例如禁用所有外设时钟:CLK_PCKENR1 = 0x00;// close all clks of PeripheralCLK_PCKENR2 = 0x00;开启定时器TIME1定时器时钟:CLK_PCKENR1 |= 0x20; //具体参考STM8S_Reference 59页CPU分频因子:CPU时钟(fCPU)由主时钟(fMASTER)分频而来,分频因子由时钟分频寄存器(CLK_CKDIVR)中的位CPUDIV[2:0]决定。
共7个分频因子可供选择(1至128中,2的幂)。
如图13所示。
fCPU为CPU和窗口看门狗提供时钟。
时钟分频寄存器(CLK_CKDIVR)通用端口GPIO和其他的单片机一样,我是习惯从端口开始学习。
Stm8s105s系列最多有7组I/O端口,A~G,而根据不同的封装可能没有其中的一些,在这里根据具体项目,我选择的是44脚封装的。
使用任何的外设前,我们都要根据需要的将参考手册和数据手册看一边,当然端口也不能另外了。
作为通用的IO口,每一个GPIO端口都有5个对应的寄存器如下表:注意:初始复位时,所有引脚设置为浮空输入。
其中1. Px_ODR是ODR[7:0]:端口输出数据寄存器位;(1)在输出模式下,写入寄存器的数值通过锁存器加到相应的引脚上。
stm8s系列单片机原理与应用STM8S系列单片机原理与应用。
STM8S系列单片机是STMicroelectronics公司推出的一款高性能、低功耗的8位单片机,广泛应用于家电、工业控制、汽车电子等领域。
本文将介绍STM8S系列单片机的基本原理和应用。
首先,我们来了解一下STM8S系列单片机的基本特点。
STM8S系列单片机采用高性能的8位CPU内核,工作频率可达到20MHz,具有丰富的外设资源,包括通用定时器、串行外设接口、模拟数字转换器等。
此外,STM8S系列单片机还具有低功耗特性,可满足对功耗要求较高的应用场景。
在实际应用中,STM8S系列单片机可以广泛应用于各种控制系统中。
例如,可以用于家电控制领域,如空调、洗衣机、微波炉等家电产品的控制系统;还可以应用于工业控制领域,如工业自动化设备、仪器仪表等的控制系统;同时,STM8S系列单片机还可以应用于汽车电子领域,如汽车发动机控制单元、车载娱乐系统等。
在使用STM8S系列单片机进行开发时,我们可以充分发挥其丰富的外设资源和高性能的CPU内核。
通过合理的软件设计和优化,可以实现各种复杂的控制算法和功能。
同时,STM8S系列单片机还提供了丰富的开发工具和软件支持,如ST 公司提供的集成开发环境和编译器,方便开发人员进行软件开发和调试。
除此之外,STM8S系列单片机还具有丰富的通信接口,如SPI、I2C、UART 等,可以方便地与外部设备进行通信,实现系统的扩展和联网。
这些通信接口的灵活应用,使得STM8S系列单片机在各种应用场景下都能够得到充分的发挥。
总的来说,STM8S系列单片机作为一款高性能、低功耗的8位单片机,具有丰富的外设资源和通信接口,广泛应用于家电、工业控制、汽车电子等领域。
在实际应用中,我们可以充分发挥其性能优势和丰富的外设资源,实现各种复杂的控制算法和功能。
同时,ST公司提供的丰富的开发工具和软件支持,也为开发人员提供了便利。
相信随着技术的不断发展,STM8S系列单片机在各个领域的应用将会更加广泛。
首先,STM8有三种低功耗模式,即等待、活跃停机和停机。
具体它们三者有什么区别自己看官方手册去吧,这里只讲停机模式的应用,其他的一笔带过!一、进入的方式:等待模式进入用的指令是WFI,而活跃停机和停机用的都是halt(),所不同的是,在执行halt指令之前,如果开启了AWU,则是活跃停机,反之则是停机。
还有一点要说明的是,在停机模式下独立看门狗是不能养的,而只能养窗口看门狗。
二、具体进入的步骤:1、首先,你声明一个标志位,名字自己取。
这个标志位是用来判断系统是该处于运行模式还是处于停机模式的。
我这里用fPowerOn_flag,如下:bool fPowerOn_flag = FALSE;有了这个标志位以后就写下面的部分了:int main(void){//设置内部16M晶振为系统时钟Clk_Init(); //系统时钟初始化函数MWWDG_Init();//窗口看门狗初始化函数while (1){Free_WWDG();//喂狗函数if(fPowerOn_flag == FALSE){Halt_OffDevice();//停机前关闭不需要的外设halt();//进入停机模式System_Init();//系统初始化函数}if(fPowerOn_flag){//运行代码在这里添加}}}以上就是一个停机模式的模板了,大家参照着用就可以了。
系统上电默认是进入停机模式,然后通过按键唤醒进入运行模式。
下面为大家讲一下主函数中每个函数的写法和功能吧!2、各函数说明:a、时钟初始化函数:void Clk_Init(void){CLK_DeInit();//复位时钟寄存器CLK_HSICmd(ENABLE);//使能内部高速时钟CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);//配置内部高速时钟(时钟分频器:4分频),系统时钟4MHzCLK_ClockSecuritySystemEnable();//开启时钟安全系统这个函数我想不用多讲了,大家都懂的。
STM8 低功耗模式STM8应用笔记
四种STM8低功耗模式的主要特性如表12。
(表12:STM8S低功耗模式管理)
1.如果外设时钟未被关闭
2.包括通讯外设的中断(参见中断向量表)
STM8等待(Wait)模式
在运行模式下执行WFI(等待中断)指令,可进入等待模式。
此时CPU停止运行,但外设与中断控制器仍保持运行,因此功耗会有所降低。
等待模式可与PCG(外设时钟门控),降低CPU时钟频率,以及选择低功耗时钟源(LSI,HSI)相结合使用,以进一步降低系统功耗。
参见时钟控制
(CLK)的说明。
在等待模式下,所有寄存器与RAM的内容保持不变,之前所定义的时钟配置也保持不变(主时钟状态寄存器CLK_CMSR)。
当一个内部或外部中断请求产生时,CPU从等待模式唤醒并恢复工作。
STM8停机(Halt)模式
在该模式下主时钟停止。
即由fMASTER提供时钟的CPU
及所有外设均被关闭。
因此,所有外设均没有时钟,MCU
的数字部分不消耗能量。
在停机模式下,所有寄存器与RAM的内容保持不变,默认
情况下时钟配置也保持不变(主时钟状态寄存器
CLK_CMSR)。
MCU可通过执行HALT指令进入停机模式。
外部中断可将MCU从停机模式唤醒。
外部中断指配置为中断输入的GPIO 端口或具有触发外设中断能力的端口。
在这种模式下,为了节省功耗主电压调节器关闭。
仅低电压调节器(及掉电复位)处于工作状态。
快速时钟启动
HSI RC的启动速度比HSE快(参见数据手册中电特性参数)。
因此,为了减少MCU的唤醒时间,建议在进入暂停模式前选择HSI做为fMASTER的时钟源。
在进入停机模式前可通过设置内部时钟寄存器CLK_ICKR
的FHWU位选择HSI做为fMASTER的时钟源,而无需时钟切换。
参见时钟控制章节。
STM8活跃停机(Active Halt)模式
活跃停机模式与停机模式类似,但它不需要外部中断唤醒。
它使用AWU,在一定的延时后产生一个内部唤醒事件,延迟时间是用户可编程的。
在活跃暂停模式下,主振荡器、CPU及几乎所有外设都被停止。
如果AWU和IWD已被使能,则只有LSI RC与HSE 仍处于运行状态,以驱动AWU和IWD计数器。
为进入活跃停机模式,需首先使能AWU(如AWU章节所述),然后执行HALT指令。
主电压调节器自动关闭
默认情况下,为了从活跃停机模式快速唤醒,主电压调节器处于激活状态。
但其电流消耗是不可忽视的。
为进一步降低功耗,当MCU进入活跃停机模式时,主电压调节器可自动关闭。
通过设置内部时钟寄存器CLK_ICKR的
REGAH位可实现此功能。
此时:
MCU内核由低功耗电压调节器(LPVR)供电(如同停机模式)。
仅LSI时钟源可用,因为HSE时钟源对于LPVR来说电流消耗太大。
在唤醒时主电压调节器重新被打开,这需要一个比较长的唤醒时间(参见STM8数据手册电特性部分唤醒时间与电流消耗的相关数据)。
快速唤醒时钟
如停机模式所述,为了缩短唤醒时间,建议使用HSI做为fMASTER的时钟源。
FHWU位也可用于缩短切换时间。
在活跃停机模式下,快速唤醒是很重要的。
这可以提高CPU 的执行效率,使MCU处于运行状态与低功耗模式之间的时间最短,从而减少整体平均功耗。