STM32的sleep mode怎么用?

[复制链接]
13850|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里的例程!
IJK 发表于 2010-12-29 09:36 | 显示全部楼层
直接执行wfi指令就行了吗?在我的板子上为什么一执行wfi就进入硬件异常呢?
mxh0506 发表于 2010-12-24 17:54


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

“在我的板子上为什么一执行wfi就进入硬件异常”,如果怀疑硬件问题,可以试着在main()的最开始、延时一段时间就直接执行wfi,看看情况如何
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)
 楼主| mxh0506 发表于 2011-1-18 22:04 | 显示全部楼层
多谢各位的热心帮助。:handshake
ppbbcc 发表于 2013-5-6 16:06 | 显示全部楼层
虽然是老帖字了但是搜索还是很靠前的,补充一句
#define __WFI                             __wfi
#define __WFE                             __wfe
这两个定义是要有的
hawksabre 发表于 2013-5-6 19:34 | 显示全部楼层
技术手册里应该有详细的讲解  
hawksabre 发表于 2013-5-6 19:34 | 显示全部楼层
实在不行   看看官方的例程   模仿写一些  应该就可以搞定了
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

粉丝
快速回复 在线客服 返回列表 返回顶部