Выход из режима STOP на STM32L100Rc - PullRequest
1 голос
/ 28 октября 2019

Я новый кодер, использующий плату обнаружения STM32L100RC. Таким образом, моя проблема довольно проста, я считаю;Я не могу выйти из режима остановки с помощью внешнего триггера на контакте WakeUp PA0. Код работает следующим образом: светодиод на выводе PC9 загорается, я вхожу в режим STOP MODE, и когда я использую команду WakeUp, нажимая кнопку PA0, светодиод выключается на несколько секунд. Теперь я знаю, что использование цикла aa - неправильный способ подождать несколько секунд, нет необходимости указывать на это. Я был бы очень признателен, если бы кто-то мог объяснить, что я делаю неправильно. Вот что я сделал до сих пор:

void Button_Initialization (void)

{



RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);



// Configure PC9 as push-pull output

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;

GPIO_Init(GPIOC, &GPIO_InitStruct);



GPIO_InitTypeDef GPIO_InitStructA;

GPIO_InitStructA.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructA.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructA.GPIO_Mode = GPIO_Mode_AF;

GPIO_PinAFConfig(GPIOA, GPIO_Pin_0, GPIO_AF_WKUP);

GPIO_Init(GPIOA, &GPIO_InitStructA);

PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE);





GPIO_InitTypeDef GPIO_InitStructButton;

// GPIO_InitStructButton.GPIO_Pin = ;

GPIO_InitStructButton.GPIO_Speed = GPIO_Speed_400KHz;

GPIO_InitStructButton.GPIO_Mode = GPIO_Mode_IN;

GPIO_InitStructButton.GPIO_PuPd = GPIO_PuPd_DOWN;

GPIO_Init(GPIOA, &GPIO_InitStructButton);



EXTI_InitTypeDef EXTI_InitStruct;

EXTI_InitStruct.EXTI_Line = EXTI_Line1;

EXTI_InitStruct.EXTI_LineCmd = ENABLE;

EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Event;

EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_Init( &EXTI_InitStruct);

}



int main(void)

{

Button_Initialization();

while(1)

{

// Turn off LED on PC9

GPIO_SetBits(GPIOC, GPIO_Pin_9);





PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFE);


GPIO_ResetBits(GPIOC, GPIO_Pin_9);

for (int i = 0; i < 1000000; i++)

{

}

}

}

1 Ответ

0 голосов
/ 06 ноября 2019

С вашей конфигурацией у вас нет источника пробуждения:

PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE); можно использовать, только если вы хотите вывести ОК из режима ожидания, но не из режима остановки. (см. главу Справочное руководство 5.3.8 Standby mode и 5.4.2 PWR power control/status register (PWR_CSR))

При входе в режим остановки, подобный этому PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFE);, вам необходимо квалифицированное событие, чтобы разбудить ОК. Чтобы достичь этого, вам просто нужно настроить PA0 в качестве входа (не альтернативную функцию пробуждения) с активированным событием линии EXTI (которое составляет EXTI line 0).

Также перед входом в режим остановки необходимо убедиться, что все биты прерывания, строки EXTI и RTC очищены. В противном случае режим остановки входа игнорируется.

...