完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
之所以写这篇博客,是因为最近做一个项目,需要用到单片机的低功耗模式。第一次用stm8,我在网上看了很多资料,虽然有些写的还是挺详细的,但是我自己实际调试的时候还是出了不少意外,花了不少时间,因此想写一篇文章让你们少走一些弯路。语文水平有限,写的不好勿怪。 在讲程序之前先说明几点: 1.STM8低功耗的几种模式我不多说了,这方面的资料很多,自己可以先去了解一下。 2. 我测试用的主控芯片是STM8L151G6。(其他L系列程序上没有什么区别,至于功耗是不是一样我就不知道了) 3. 程序用的是库函数的写法。 4. 低功耗模式用的是Halt模式,也就是停机模式,功耗是最低的,其他模式的功耗我没有测过,这里不说。 5. 为了更加直观,我下面写的程序尽可能简化。(外设部分的程序没写进去) 6. 如果我有哪里写错了,欢迎来指正。 好了废话不多说,马上开始程序的编写。 //main函数 void mian(void) { //配置时钟 CLK_HSICmd(ENABLE); CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); // 我用的是内部时钟 CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //1分频,也就是16M,实际测试,时钟分频对功耗没什么影响 //下面可以写外设的初始化函数 //下面可以写外部中断初始化,halt模式只能通过外部中断或复位唤醒,我这里用了PB1,引脚接的是OPT3001光感芯片的中断脚 disableInterrupts(); //先关闭总中断(也可以不写,如果是多个外部中断,最好加上,不然会有个bug,具体这里不说了) GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_IT); //PB1 配置成上拉外部中断 EXTI_DeInit(); EXTI_SetPinSensitivity(EXTI_Pin_1,EXTI_Trigger_Falling); //PIN1 设置为下降沿中断(具体根据实际情况) enableInterrupts();//使能总中断 //下面可以控制外设进入休眠模式 //除了单片机,单片机控制的各个模块也会耗电,如果不需要一直工作可以进入休眠 //比如我用到的LORA模块,不需要一直发射或接收数据,所以进入休眠模式 //比如光照传感器,需要一直采集数据,并判断有没有超出设置好的上限或下限,因此不能休眠 //单片机在进入停机模式之间,关闭没有用到的外设可以降低功耗(根据实际情况增加和删减) CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM1,DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM3,DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM4,DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_I2C1,DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_SPI1,DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_USART1,DISABLE); //把没有接外设或者暂时不用的引脚设置为低速,输出低(这里需要根据实际情况配置) //千万别小瞧这些悬空的引脚,如果有几个悬空的引脚没有配置可能会多出几百uA //在网上看到一些资料说可以设为浮空输入,我实际测试过,在引脚悬空的情况下,引脚输出低,功耗会更低,有外设的引脚看情况而定 //比如引脚接了一个低电平点亮的LED灯时,引脚拉高才能降低功耗 //我这里只写单片机引脚不接任何外设的情况,引脚全部拉低 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); //进入停机模式 while(1) { // 下面这一句很关键,加上这句才能真正进入超低功耗模式(这个函数在stm8l15x_pwr.c里面,需要把它加到工程里面) PWR_UltraLowPowerCmd(ENABLE); //进入停机模式 halt(); } } //中断服务函数(在stm8l15x_it.c里面) INTERRUPT_HANDLER(EXTI1_IRQHandler, 9) { EXTI_ClearITPendingBit(EXTI_IT_Pin1); //清除中断标志 //下面可以写中断唤醒单片机之后需要执行的程序 } 功耗测试结果(仅供参考): 1.单片机引脚全部悬空,引脚全部拉低,电流为0.4uA,这个和官方手册上面的最低功耗是一致的。 2.单片机只接一个SX1276 868MLORA模块,LORA设置为休眠,除了LORA其他单片机引脚全部拉低,总电流为1.6uA。 3.单片机接SX1276 868MLORA模块和OPT3001光照IC,LORA休眠,OPT3001工作,中断不触发的时候,电流为14uA左右。中断唤醒后的功耗和执行的程序相关。 测试功耗需要注意的几点: 1.电流表接在整个电路总电源输入的地方 2.测试的时候把单片机和下载器、仿真器、串口等断开连接。 3.测试的时候建议先单独测试stm8,然后再把外设一个一个加上去测试,我一开始测试的时候用的是一块电路完整的模块,测试的时候很难确定电流降不下去的原因,折腾了很久。 |
|
|
|
只有小组成员才能发言,加入小组>>
3254 浏览 9 评论
2937 浏览 16 评论
3439 浏览 1 评论
8941 浏览 16 评论
4030 浏览 18 评论
1072浏览 3评论
556浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
550浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2285浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1843浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 10:23 , Processed in 0.991357 second(s), Total 46, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号