Добрый вечер, уважаемые участники!

Имеется отладочная плата STM32F3Discovery с процом STM32F303 на борту, который необходимо периодически переводить в состояние пониженного энергопотребления (STOP mode), затем просыпаться, выполнять нехитрые действия и снова засыпать. Кроме того, необходимо заставить проц адекватно работать на тактовой частоте, равной 1 МГц.
Для решения данной задачи была задействована Clock configuration tool for STM32F30x/31x microcontrollers. Файл, сгенерированный данной утилитой, приложен к данному сообщению (расширение изменено на *.txt из-за накладываемых форумом ограничений). Для проверки работоспособности в обработчик прерывания системного таймера SysTick_Handler был добавлен код переключения одного из светодиодов, установленных на плате:

Код
void SysTick_Handler( void )
{
    STM_EVAL_LEDToggle( LED10 );
    systick_event = 1;
}


Замечено, что при частотах HCLK < 4 МГц, светодиод не моргает. Полагаю, что проц по каким-то причинам не стартует. В связи с этим мой первый вопрос: может ли STM32F303 работать на частоте HCLK = 1 МГц в принципе?

При HCLK >= 4 МГц светодиод стабильно моргает, т.е. система стартует. При этом возникает проблема после засыпания-пробуждения устройства. Код для подготовки устройства для перехода в режим STOP:

CODE
void prepare_for_sleep()
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

EXTI_ClearITPendingBit( EXTI_Line17 );
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init( &EXTI_InitStructure );

NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );

RTC_GetTime( RTC_Format_BIN, &RTC_TimeStructure );

RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;
RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay |
RTC_AlarmMask_Minutes |
RTC_AlarmMask_Hours;
RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = RTC_TimeStructure.RTC_Hours;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = RTC_TimeStructure.RTC_Minutes;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = RTC_TimeStructure.RTC_Seconds + 15;

if( RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds >= 60 )
{
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds -= 60;
if( ++RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes >= 60 )
{
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes -= 60;
if( ++RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours > 12 )
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 1;
}
}

RTC_SetAlarm( RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure );

RTC_ITConfig( RTC_IT_ALRA, ENABLE );

RTC_AlarmCmd( RTC_Alarm_A, ENABLE );

RTC_ClearITPendingBit( RTC_IT_ALRA );

STM_EVAL_LEDOff( LED3 );
STM_EVAL_LEDOff( LED4 );
STM_EVAL_LEDOff( LED5 );
STM_EVAL_LEDOff( LED6 );
STM_EVAL_LEDOff( LED7 );
STM_EVAL_LEDOff( LED8 );
STM_EVAL_LEDOff( LED9 );
STM_EVAL_LEDOff( LED10 );

USART_ITConfig( USART1, USART_IT_RXNE, DISABLE );
USART_ITConfig( USART2, USART_IT_RXNE, DISABLE );

PWR_EnterSTOPMode( PWR_Regulator_LowPower, PWR_STOPEntry_WFI );
}


Из приведённого выше листинга видно, что устройство проснётся через 15 с после засыпания. Код функции для вывода устройства из сна:

CODE
void wake_up()
{
RCC_HSEConfig( RCC_HSE_ON );

ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp();

FLASH_PrefetchBufferCmd( ENABLE );

FLASH_SetLatency(FLASH_Latency_0);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_PLLConfig(RCC_PREDIV1_Div4, RCC_PLLMul_2);

RCC_PLLCmd(ENABLE);

while ( RCC_GetFlagStatus( RCC_FLAG_PLLRDY ) == RESET )
{
}

RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );

while ( RCC_GetSYSCLKSource() != 0x08 )
{
}

RTC_ITConfig( RTC_IT_ALRA, DISABLE );
RTC_AlarmCmd( RTC_Alarm_A, DISABLE );
}


Замечено, что независимо от значения HCLK (HCLK >= 4 МГц) устройство после пробуждения ведёт себя не совсем адекватно - не работают UART-ы. Налицо проблема с неправильной реинициализацией подсистемы тактирования проца. Отсюда мой второй вопрос: как правильно настроить систему для работы после пробуждения из STOP mode?