/** * @brief Start Bit Method to Wake Up USART from Stop mode Test. * @param None * @retval None */ static void WakeUp_StartBitMethod(void) { /* Configure the wake up Method = Start bit */ USART_StopModeWakeUpSourceConfig(USART1, USART_WakeUpSource_StartBit); /* Enable USART1 */ USART_Cmd(USART1, ENABLE); /* Before entering the USART in STOP mode the REACK flag must be checked to ensure the USART RX is ready */ while(USART_GetFlagStatus(USART1, USART_FLAG_REACK) == RESET) {} /* Enable USART STOP mode by setting the UESM bit in the CR1 register.*/ USART_STOPModeCmd(USART1, ENABLE); /* Enable the wake up from stop Interrupt */ USART_ITConfig(USART1, USART_IT_WU, ENABLE); /* Enable PWR APB clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Enter USART in STOP mode with regulator in low power mode */ PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); /* Waiting Wake Up interrupt */ while(InterruptCounter == 0x00) {} /* Disable USART peripheral in STOP mode */ USART_STOPModeCmd(USART1, DISABLE); while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) {} DataReceived = USART_ReceiveData(USART1); /* Clear the TE bit (if a transmission is on going or a data is in the TDR, it will be sent before efectivelly disabling the transmission) */ USART_DirectionModeCmd(USART1, USART_Mode_Tx, DISABLE); /* Check the Transfer Complete Flag */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} /* USART Disable */ USART_Cmd(USART1, DISABLE); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f30x.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f30x.c file */ /* Initialize LEDs available on STM32303C-EVAL board ************************/ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Enable PWR APB clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* USART configuration to Wake up from STOP mode by Start bit Method */ USART_Config(); /* Waiting Wake Up interrupt */ while(InterruptCounter == 0x00) {} /* Disable USART peripheral in STOP mode */ USART_STOPModeCmd(USART1, DISABLE); while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) {} DataReceived = USART_ReceiveData(USART1); /* Clear the TE bit (if a transmission is on going or a data is in the TDR, it will be sent before effectively disabling the transmission) */ USART_DirectionModeCmd(USART1, USART_Mode_Tx, DISABLE); /* Check the Transfer Complete Flag */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} /* USART Disable */ USART_Cmd(USART1, DISABLE); /* Configure SystemClock*/ RestoreConfiguration(); /* Configure and enable the systick timer to generate an interrupt each 1 ms */ SysTick_Config((SystemCoreClock / 1000)); while(1) {} }
/** * @brief Configure the USART to Wake up from STOP mode by Start bit Method * @param None * @retval None */ static void USART_Config(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable GPIOD clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOE , ENABLE); /* Enable USART1 APB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* Configure the HSI as USART clock */ RCC_USARTCLKConfig(RCC_USART1CLK_HSI); /* USART1 Pins configuration ***********************************************/ /* Connect pin to Periph */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_7); GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_7); /* Configure pins as AF pushpull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_Init(GPIOE, &GPIO_InitStructure); /* USARTx configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - Stop Bit = 1 Stop Bit - Parity = No Parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_DeInit(USART1); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); /* USART2 IRQ Channel configuration */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Configure the wake up Method = Start bit */ USART_StopModeWakeUpSourceConfig(USART1, USART_WakeUpSource_StartBit); /* Enable USART1 */ USART_Cmd(USART1, ENABLE); /* Before entering the USART in STOP mode the REACK flag must be checked to ensure the USART RX is ready */ while(USART_GetFlagStatus(USART1, USART_FLAG_REACK) == RESET) {} /* Enable USART STOP mode by setting the UESM bit in the CR1 register.*/ USART_STOPModeCmd(USART1, ENABLE); /* Enable the wake up from stop Interrupt */ USART_ITConfig(USART1, USART_IT_WU, ENABLE); /* Enter USART in STOP mode with regulator in low power mode */ PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); }