打印

STM32内嵌ucosii低功耗模式问题

[复制链接]
4625|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cbyibby|  楼主 | 2013-10-4 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用stm32,移植ucos-ii,开启中断0,进入stop模式后不能正常运行,我做了以下试验
1、进入stop模式以后,触发中断0,在EXTI0_IRQHandler()中开启串口打印,串口会输出,证明是成功进入了中断的,只是唤醒后没能正确运行程序。
2、我尝试不启动ucos-ii,单纯用延时然后进入进入stop模式,触发中断后,程序能正常运行,因此,程序的进入和退出stop模式的机制也没问题。
3、我尝试将进入stop模式的任务优先级调至最低,
4、在进入中断后,重新初始化所有时钟
5、实在没有办法,在进入中断后,清除EXTI->PR=1<<0;然后强制跳至用户区代码,初始化正常,但是ucos-ii任务依旧没有启动,奇了怪了
6、折腾了个把星期,黔驴技穷,网上找高手求助
我想这个应该是ucos-ii从低功耗模式退出的一个普遍问题,希望知道其中原委的兄弟不吝赐教,也希望有类似经历的朋友一起讨论下,不胜感激
沙发
cbyibby|  楼主 | 2013-10-4 16:52 | 只看该作者
附上我写的几个函数:
void Sys_StopMode()
{
        //g_sleepFlag = 1;
        SCB->SCR|=1<<2;
        RCC->APB1ENR|=1<<28;
        //PWR->CR |= 1<<2;
        //PWR->CR &= 0xFD;
        PWR->CR |= 0x01;                //在停机模式下电压调压器处于低功耗模式
        WFI_SET();
}

void LowPow_Init(void)
{
        //set wakeup pin

        GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入          
        GPIOA->CRL|=0X00000008;                                     
        GPIOA->ODR|=1<<0;           //PA0上拉

        MY_NVIC_Init(2,1,EXTI0_IRQChannel,1);    //抢占2,子优先级2,组2

        Ex_NVIC_Config(GPIO_A,0,FTIR);

        Sys_StopMode();       
}

void EXTI0_IRQHandler()
{
        EXTI->PR=1<<0;
        iap_load_app(FLASH_APP1_ADDR);
}

使用特权

评论回复
板凳
cbyibby|  楼主 | 2013-10-4 20:28 | 只看该作者
自己顶一下,等待大侠的出现啊!

使用特权

评论回复
地板
香如故| | 2013-10-4 21:33 | 只看该作者
怎么不用库函数PWR_EnterSTOPMode()进入低功耗模式:P

使用特权

评论回复
5
cbyibby|  楼主 | 2013-10-5 08:54 | 只看该作者
香如故 发表于 2013-10-4 21:33
怎么不用库函数PWR_EnterSTOPMode()进入低功耗模式

接触st的芯片很长一段时间了,但真正用它来做东西也就是近两个月的事情,按照以前做东西的惯性就一路寄存器操作下来了。
具体到这个问题,稍后我按你的建议再用库函数试试,但是感觉应该也没本质区别吧。
我认真检验过,在没有加入ucos的时候,是能够正常进入和退出stop模式的,运行ucos进入stop模式,外部中断触发唤醒就出问题了,运行完中断里的代码就跑死了,中断也不能正常进入,类似指针跑飞的情况。
我的理解,进入stop模式后,寄存器的值和RAM的值都不会改变,唤醒后也会从原来的地方继续执行,所以不管软件怎么写,应该都不会有区别啊。
谢谢你的回答,以上是我的疑问就多啰嗦几句了呵呵

使用特权

评论回复
6
香如故| | 2013-10-5 09:38 | 只看该作者
退出stop模式时钟就变为HSI的了,为8M,要重新初始化时钟。
你可以用jlink看下程序是停在哪里了啊.

使用特权

评论回复
7
cbyibby|  楼主 | 2013-10-7 19:59 | 只看该作者
继续头疼中啊,回楼上的,时钟初始化也试过了,没有作用啊,还尝试了在OS_TaskIdle里执行停止(睡眠模式也尝试过,一样的问题)模式,也没能解决问题。难道ucos-ii没有考虑低功耗模式的问题。
实在是想不明白,哪位兄弟能在你现有的板子上跑跑,在运行ucos的情况下能正常进入低功耗模式,通过外部唤醒。
谁能帮我解决下这个问题,将赠送全新的原子stm32开发板一套(现买),也当给原子做下宣传了。

使用特权

评论回复
8
香如故| | 2013-10-8 09:18 | 只看该作者
我测试了下,能正常工作啊,ucos也可以恢复啊
我用的语句就一句。
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
恢复后如果时钟没初始化的话,串口不能正常工作,我加了
RCC_Configuration();
后,恢复后串口也能正常工作了,因为恢复前后不初始化时钟
的话,串口波特率会不一样的。
另外我发现秒定时器频率看出来没受什么影响。
我的led是用秒中断显示的,恢复后闪动频和以前没变化。
估计是用的是秒是用的32k的频率的缘故吧

使用特权

评论回复
9
cbyibby|  楼主 | 2013-10-8 10:27 | 只看该作者
香如故 发表于 2013-10-8 09:18
我测试了下,能正常工作啊,ucos也可以恢复啊
我用的语句就一句。
PWR_EnterSTOPMode(PWR_Regulator_LowPow ...

哦,那我也按你的方法,用库函数试试,非常感谢你

使用特权

评论回复
10
airwill| | 2013-10-10 08:03 | 只看该作者
难道ucos-ii没有考虑低功耗模式的问题?
这话说到点子上了, 确实如此。所以要楼主自己来解决低功耗引起的系统变化的还原问题。
STM32有多个低功耗模式,造成的变化不同。我使用过睡眠模式, 发现可以完全正常地运行。
停机和待机下,由于关闭了所有1.8V 单元的时钟,很多的外设会受影响,好好琢磨琢磨手册再来调试吧

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
cbyibby + 1 赞一个!
11
tyou| | 2013-10-10 15:20 | 只看该作者
本帖最后由 tyou 于 2013-10-10 15:59 编辑

1. 在ucos idle task 中 while(1) WFI, 电流可以降很多,测过没有?

2. 真要完全睡眠,在自己线程中关其他所有中断,只开一个唤醒中断并设置为最高优先级。
唤醒ISR中RCC_Configuration(),再开OS等中断后返回

使用特权

评论回复
12
cbyibby|  楼主 | 2013-10-16 19:48 | 只看该作者
airwill 发表于 2013-10-10 08:03
难道ucos-ii没有考虑低功耗模式的问题?
这话说到点子上了, 确实如此。所以要楼主自己来解决低功耗引起的 ...

谢谢,按照香如故的提示,用库函数PWR_EnterSTOPMode就实现了

使用特权

评论回复
13
cbyibby|  楼主 | 2013-10-16 19:50 | 只看该作者
tyou 发表于 2013-10-10 15:20
1. 在ucos idle task 中 while(1) WFI, 电流可以降很多,测过没有?

2. 真要完全睡眠,在自己线程中关其他 ...

的确需要设置RCC_Configuration,根据香如故的提示,用库函数实现了,谢谢你的回答

使用特权

评论回复
14
trumpxp| | 2013-10-16 21:02 | 只看该作者
对于这一块   系统不是很了解阿   需要加强学习阿

使用特权

评论回复
15
cbyibby|  楼主 | 2013-10-18 10:46 | 只看该作者
靠,竟然无法结贴,一直显示 “分数未分配完,或分配存在错误”,但加来加去是对的啊

使用特权

评论回复
16
chenbb8| | 2013-10-18 14:36 | 只看该作者
必须在发帖或者有回帖的24小时内结贴,自己顶一贴就好了

使用特权

评论回复
17
雨落沉轩| | 2013-10-18 21:28 | 只看该作者
帮顶一下

使用特权

评论回复
18
thunber| | 2014-5-20 13:50 | 只看该作者
遇到楼主类似的问题,不知道楼主解决了没有,请不吝赐教。!

使用特权

评论回复
19
thunber| | 2014-5-21 09:22 | 只看该作者
我找到原因啦,这个问题是由于系统时间SysTick引起的,重新初始化一下你的UCOS Tick就可以啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝