跪求各路大神,STM32L072 睡眠模式、停止模式切换使用报硬...
本帖最后由 nbh520 于 2017-7-27 10:06 编辑目前在使用STM32L072xx芯片的过程中,在低功耗模式的使用中遇到一些很难缠的问题,我选择了睡眠模式和停止模式两种低功耗模式同时使用的方式。
当使用按键,不停的触发外部中断时,有时会出现如下问题:
1、退出停止模式时,初始化外部高速时钟HSE时,初始化失败
2、退出睡眠模式时,发生硬件错误
3、使用keil调试时,进入、退出的是睡眠函数,但是调用的内容却是停止函数的内容。
相关配置的代码如下,求大神指教
/**系统时钟配置函数**/
void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct ={0};
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_PeriphCLKInitTypeDefPeriphClkInitStruct = {0};
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* The voltage scaling allows optimizing the power consumption when the device is
clocked below the maximum system frequency, to update the voltage scaling value
regarding system frequency refer to product datasheet.*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
/* Disable Power Control clock */
__HAL_RCC_PWR_CLK_DISABLE();
/* Enable HSE Oscillator */
RCC_OscInitStruct.OscillatorType= RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_3;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
{
MY_ERROR_CHECK(HAL_RCC_OS_CONFIG_FAILED);
}
/*Select PLL 48 MHz output as USB clock source */
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL;
//HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1)!= HAL_OK)
{
MY_ERROR_CHECK(HAL_RCC_CLOCK_CONFIG_FAILED);
}
}
/**低功耗模式初始化配置函数**/
void low_power_handle_init(void)
{
/******************************低功耗模式配置*********************************/
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower();
/* Enable the fast wake up from Ultra low power mode */
HAL_PWREx_EnableFastWakeUp();
/* Select MSI as system clock source after Wake Up from Stop mode */
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_MSI);
//í£?1?£ê?£??ú??μ÷ê?
#if ONLINE_DEBUG_STOP_MODE
__HAL_RCC_DBGMCU_CLK_ENABLE();
DBGMCU->CR |= DBGMCU_CR_DBG_STOP;
#endif
}
/**进入低功耗模式函数**/
void PreSleepProcessing(uint32_t * ulExpectedIdleTime, uint32_t uncplt_tick, uint32_t low_power_mode)
{
if(low_power_mode == (uint32_t)SYSTEM_SLEEP_MODE)
{
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
*ulExpectedIdleTime = 0;
}
else if(low_power_mode == (uint32_t)SYSTEM_STOP_MODE)
{
u32_t lptim_tick = 0;
//系统时钟频率16M
//唤醒启动时间补偿1.48ms,此外补偿1tick中已经执行的时间(如1ms已经执行了300us)
lptim_tick = (uint64_t)((*ulExpectedIdleTime - 2) *1000 + uncplt_tick - 480) * 32768 / 1000000ul;//(*ulExpectedIdleTime * 32768ul/1000)
//启动计数器
if (HAL_LPTIM_Counter_Start_IT(&LptimHandle, lptim_tick) != HAL_OK)
{
MY_ERROR_CHECK(HAL_LPTIM_START_FAILED);
}
/* Enter Stop Mode */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config();
}
*ulExpectedIdleTime = 0;
}
建议楼主把程序格式排版好,不然网友们很难帮到你,建议用<>来装你的代码 Inc_brza 发表于 2017-7-21 12:31
建议楼主把程序格式排版好,不然网友们很难帮到你,建议用来装你的代码
非常感谢大哥的提醒,作为论坛的新人,请多多关照。 你可以一个个来嘛,比方先调STOP模式,让它正常运作。这个官方都有参考代码的。
另外你提到HSE初始化失败,这个失败或许表明它的起振还未完全正常化,相关元件参数可能还需
进一步调整确认。 xmshao 发表于 2017-7-21 16:29
你可以一个个来嘛,比方先调STOP模式,让它正常运作。这个官方都有参考代码的。
另外你提到HSE初始化失败 ...
非常感谢你的意见。
STOP模式和SLEEP模式,最初我是分开调的,调得基本上没有问题,才一起调试的。
HSE初始化失败的原因已经找到了,是因为在进入STOP模式之前,产生了EXTI挂起中断,所以并没有能够给进入STOP模式,自然也就不需要重新配置时钟。 nbh520 发表于 2017-7-21 17:25
非常感谢你的意见。
STOP模式和SLEEP模式,最初我是分开调的,调得基本上没有问题,才一起调试的。
:)
页:
[1]