完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本人在学习STM睡眠模式时,使用__WFI() 这句能达到进入睡眠模式后,任意中断能唤醒并接着执行下面的程序,但是使用原子例程中的__asm void WFI_SET(void){
WFI; } 这个函数,能进入睡眠模式,但是当任意中断触发时,只能进入中断处理中断服务程序中的内容,不能接着执行主程序下面的程序。 求大神解答,两种方式为何会出现这种差别? |
|
相关推荐
9个回答
|
|
小青蛙 发表于 2018-6-15 17:24 找到问题了,仿真看了下汇编,__wfi()cm3.h内核文件里面的相当于直接执行汇编指令;__asm void WFI_SET(void){WFI;}原子哥这种方式实现的汇编相当于调用函数,当调用函数执行WFI后,进入休眠模式,PC指针还在这个函数里面,当唤醒后,由于是汇编,不会返回到原来的函数,程序就跑死了,如果需要返回原来的函数,需要将内嵌汇编改为__asm uint32_t WFI_SET(void){WFI; bx lr } 完美决解! |
|
|
|
看上去两个的确是等价的, 你在原子哥的 案例中有看到 调用 WFI_SET(); 的么?
难道真如是说是编译环境造成的? 还有以前 汇编下的 “WFI;” 和 __wfi 等价么
最佳答案
|
|
|
|
做时钟处理了么
|
|
|
|
|
|
|
|
本帖最后由 小青蛙 于 2018-6-10 23:20 编辑
/* Reset SLEEPDEEP bit of Cortex System Control Register */ SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); 需要在醒来后将控制模块中的睡眠位复位 |
|
|
|
小青蛙 发表于 2018-6-10 23:16 试过了,不管用的,使用库文件发现最后有这句,自己写的寄存器版本最后添加这句,感觉有无关系都不大,下面我贴上自己写的代码给你看下 |
|
|
|
void Sys_LowPower(u8 var)
{ RCC->APB1ENR |= 1<<28; //使能电源时钟 /* SCB->SCR |= 0<<4; //SETONPEND 置位,它就会不错过任何一个事件,在发生事件时一定把处理器唤醒 SCB->SCR |= 0<<2; //SLEEPDEEP位清零表示睡眠,置位表示深度睡眠() SCB->SCR |= 0<<1; //SLEEPONEXIT位清零,直接进入睡眠模式,置位,从最低优先级的中断退出后才进入 */ switch(var) { case 0:{ break; } //WFI进入睡眠模式,M3内核停止工作 case 1:{ //PDDS+LPDS+SLEEPDEEP+WFI进入停机模式,除了SRAM,其他都断电 SCB->SCR |= 1<<2; //使能SLEEPDEEP位 (SYS->CTRL) PWR->CR |= 1<<0; //LPDS置位,深度睡眠下的低功耗 PWR->CR |= 0<<1; //PDDS置位(你妹的,坑了我一大早上,这个位是让CPU进入深度睡眠时进入待机模式,原来的程序是置位) break; } case 2:{ //PDDS+SLEEPDEEP+WFI进入待机模式,全部断电,备份的寄存器和待机电路维持供电 SCB->SCR |= 1<<2; //使能SLEEPDEEP位 (SYS->CTRL) PWR->CR|=1<<1; //PDDS置位(这里才需要置位,进入待机模式) //唤醒使用的是WKUP,若需要其他方式唤醒,需重新配置 PWR->CR |= 1<<2; //清除Wake-up 标志 PWR->CSR |= 1<<8; //WKUP引脚用于将CPU从待机模式唤醒 break; } } // WFI_SET(); //执行WFI指令,使用这种方式的内嵌汇编,睡眠模式下不能接着执行程序 __WFI(); //我说的就是这两句有区别,WFI_SET()是原子例程里面的,__WFI()是侧面cm3.h里面的 SCB->SCR &= ~(1<<2); //失能SLEEPDEEP位 (SYS->CTRL) } |
|
|
|
小青蛙 发表于 2018-6-15 17:24 是的,是在原子例程里面的,我对汇编不是太熟,我估计就是你后面说的这两种原因的一种了 |
|
|
|
不错,很好的经验分享,辛苦麻烦了,欠缺这方面的资料,非常感谢。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1187 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1122 浏览 2 评论
2223 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1311 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1735 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 10:15 , Processed in 0.706708 second(s), Total 63, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号