STM32的sleepmode怎么用?

flylmind   2010-12-24 17:54 楼主
                                 直接执行wfi指令就行了吗?在我的板子上为什么一执行wfi就进入硬件异常呢?

回复评论 (6)

                                 这个比较复杂,必须好好看看cm3和stm32的相关手册了
点赞  2010-12-25 13:42
                                 STM32库中有例程,可以参考。
点赞  2010-12-25 22:43
                                 看一下参考手册,和lib里的例程!
点赞  2010-12-28 18:16
直接执行wfi指令就行了吗?在我的板子上为什么一执行wfi就进入硬件异常呢?
印象里,直接执行wfi指令就行了。

“在我的板子上为什么一执行wfi就进入硬件异常”,如果怀疑硬件问题,可以试着在main()的最开始、延时一段时间就直接执行wfi,看看情况如何
点赞  2010-12-29 09:36
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)
点赞  2010-12-29 09:58
                                 多谢各位的热心帮助。
点赞  2011-1-18 22:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复