打印

STM32的sleep mode怎么用?

[复制链接]
12401|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxh0506|  楼主 | 2010-12-24 17:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
直接执行wfi指令就行了吗?在我的板子上为什么一执行wfi就进入硬件异常呢?
沙发
say_sth_freely| | 2010-12-25 13:42 | 只看该作者
这个比较复杂,必须好好看看cm3和stm32的相关手册了

使用特权

评论回复
板凳
香水城| | 2010-12-25 22:43 | 只看该作者
STM32库中有例程,可以参考。

使用特权

评论回复
地板
jima| | 2010-12-28 18:16 | 只看该作者
看一下参考手册,和lib里的例程!

使用特权

评论回复
5
IJK| | 2010-12-29 09:36 | 只看该作者
直接执行wfi指令就行了吗?在我的板子上为什么一执行wfi就进入硬件异常呢?
mxh0506 发表于 2010-12-24 17:54


印象里,直接执行wfi指令就行了。

“在我的板子上为什么一执行wfi就进入硬件异常”,如果怀疑硬件问题,可以试着在main()的最开始、延时一段时间就直接执行wfi,看看情况如何

使用特权

评论回复
6
ST_ARM| | 2010-12-29 09:58 | 只看该作者
STM32库中没有例程。

下面是我写的进入Sleep模式的代码,你把它添加到软件库中stm32f10x_pwr.c中
/*******************************************************************************
* Function Name  : PWR_EnterSLEEPMode
* Description    : Enters SLEEP mode.
* Input          : - SysCtrl_Set: Select the Sleep mode entry mechanism,.
*                    This parameter can be one of the following values:
*                       - 0: MCU enters Sleep mode as soon as WFI or WFE instruction is executed.
*                       - 1: MCU enters Sleep mode as soon as it exits the lowest priority ISR.
*
*                  - PWR_STOPEntry: specifies if SLEEP mode in entered with WFI or WFE instruction.
*                     This parameter can be one of the following values:
*                       - PWR_SLEEPEntry_WFI: enter STOP mode with WFI instruction
*                       - PWR_SLEEPEntry_WFE: enter STOP mode with WFE instruction
* Output         : None
* Return         : None
*******************************************************************************/
void PWR_EnterSLEEPMode(u32 SysCtrl_Set, u8 PWR_SLEEPEntry)
{
        if (SysCtrl_Set)
                *(vu32 *) SCB_SysCtrl |= SysCtrl_SLEEPONEXIT_Set;        // Set SLEEPONEXIT
        else
                *(vu32 *) SCB_SysCtrl &= ~SysCtrl_SLEEPONEXIT_Set;// Reset SLEEPONEXIT

        *(vu32 *) SCB_SysCtrl &= ~SysCtrl_SLEEPDEEP_Set;        // Clear SLEEPDEEP bit
        if(PWR_SLEEPEntry == PWR_SLEEPEntry_WFI)                        // Select SLEEP mode entry
                __WFI();                                                                                // Request Wait For Interrupt
        else
                __WFE();                                                                                // Request Wait For Event
}

同时将下面的代码添加到stm32f10x_pwr.h中:
/* SLEEP mode entry */
#define PWR_SLEEPEntry_WFI         ((u8)0x01)
#define PWR_SLEEPEntry_WFE         ((u8)0x02)

使用特权

评论回复
7
mxh0506|  楼主 | 2011-1-18 22:04 | 只看该作者
多谢各位的热心帮助。:handshake

使用特权

评论回复
8
ppbbcc| | 2013-5-6 16:06 | 只看该作者
虽然是老帖字了但是搜索还是很靠前的,补充一句
#define __WFI                             __wfi
#define __WFE                             __wfe
这两个定义是要有的

使用特权

评论回复
9
hawksabre| | 2013-5-6 19:34 | 只看该作者
技术手册里应该有详细的讲解  

使用特权

评论回复
10
hawksabre| | 2013-5-6 19:34 | 只看该作者
实在不行   看看官方的例程   模仿写一些  应该就可以搞定了

使用特权

评论回复
11
sweatsurrender| | 2014-6-18 16:42 | 只看该作者
ST_ARM 发表于 2010-12-29 09:58
STM32库中没有例程。

下面是我写的进入Sleep模式的代码,你把它添加到软件库中stm32f10x_pwr.c中

那么请问你测试过这个WFE指令下的sleep模式是否可以重复调用呢?我自己写的代码跟你的操作是一样的,但是当第二次调用时就直接无法Exit了。我看数据手册上说有两种方式,可是我都试了,没有一个可以Exit第二次sleep的。我是在主函数while前直接进行重复性测试的,用一个管脚做中断。但是在WFE模式下,我没有初始化NVIC,只初始化了EXIT,不知道是不是有哪里不妥呢?

使用特权

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

本版积分规则

85

主题

1601

帖子

2

粉丝