直接执行wfi指令就行了吗?在我的板子上为什么一执行wfi就进入硬件异常呢?
这个比较复杂,必须好好看看cm3和stm32的相关手册了
直接执行wfi指令就行了吗?在我的板子上为什么一执行wfi就进入硬件异常呢?
印象里,直接执行wfi指令就行了。
“在我的板子上为什么一执行wfi就进入硬件异常”,如果怀疑硬件问题,可以试着在main()的最开始、延时一段时间就直接执行wfi,看看情况如何
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)