Skip to main content
jz.266
Visitor II
October 25, 2018
Question

STM23L031F6P6‘s UART don't work after resume from STOP mode with RTC

  • October 25, 2018
  • 1 reply
  • 616 views

It's my first time to use STM23L031F6P6,and i got some troubles

both UART2 & LPUART​1 don't work after resume from STOP mode

is there somebody can help me?

main code shows below:

void test1(void)
{
 HAL_Init(); 
 RTC_Config(); 
 
 while(1)
 {
 SystemClock_Config();
 init();
 printf("------- wake up --------\r\n");
 LedOn(1);
 HAL_Delay(5000);
 LedOff(1);
 HAL_Delay(5000);
 
 printf("\r\n------- sleep --------\r\n");
 rtc_wakeup_cfg(); 
 SystemPower_Config();
 HW_WakeupPinInit();
 enter_stop_mode();
 } 
}
 
void rtc_wakeup_cfg(void)
{
 HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);
 HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, RTC_TIME, 
 RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
}
 
void enter_stop_mode(void)
{
 __HAL_RCC_PWR_CLK_ENABLE();
 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
 
void HW_WakeupPinInit(void)
{ 
 GPIO_InitTypeDef GPIO_InitStruct;
 
 GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; 
 
 __HAL_RCC_GPIOA_CLK_ENABLE();
 
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
 
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 
 
 NVIC_SetPriority((IRQn_Type)(EXTI4_15_IRQn), 0x03);
 HAL_NVIC_EnableIRQ((IRQn_Type)(EXTI4_15_IRQn));
}
 
void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct;
 RCC_ClkInitTypeDef RCC_ClkInitStruct;
 RCC_PeriphCLKInitTypeDef PeriphClkInit;
 
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
 
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.HSICalibrationValue = 16;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
 RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |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)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_LPUART1;
 PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
 PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
 
static void SystemPower_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 
 __HAL_RCC_PWR_CLK_ENABLE();
 HAL_PWREx_EnableUltraLowPower();
 HAL_PWREx_EnableFastWakeUp();
 __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_MSI);
 
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOH_CLK_ENABLE();
 
 GPIO_InitStructure.Pin = GPIO_PIN_All;
 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStructure.Pull = GPIO_NOPULL;
 
 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); 
 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
 HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
 
 __HAL_RCC_GPIOA_CLK_DISABLE();
 __HAL_RCC_GPIOB_CLK_DISABLE();
 __HAL_RCC_GPIOC_CLK_DISABLE();
 __HAL_RCC_GPIOH_CLK_DISABLE();
}
 
static void RTC_Config(void)
{
 RTCHandle.Instance = RTC;
 
 RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;
 RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
 RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
 RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
 RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
 RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
 if(HAL_RTC_Init(&RTCHandle) != HAL_OK)
 {
 Error_Handler(); 
 }
}
 
void MX_GPIO_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStruct;
 
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOH_CLK_ENABLE();
 
 GPIOA->MODER = 0xFFFFFFFF;
 GPIOB->MODER = 0xFFFFFFFF;
 GPIOC->MODER = 0xFFFFFFFF;
 GPIOH->MODER = 0xFFFFFFFF;
 
 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_SET);
 
 GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6;
 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
 GPIO_InitStruct.Pull = GPIO_PULLDOWN;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 __HAL_RCC_GPIOB_CLK_DISABLE();
 __HAL_RCC_GPIOC_CLK_DISABLE();
 __HAL_RCC_GPIOH_CLK_DISABLE();
 HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}
 
 void MX_DMA_Init(void) 
{
 __HAL_RCC_DMA1_CLK_ENABLE();
 HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
}
 
void MX_LPUART1_UART_Init(void)
{
 hlpuart1.Instance = LPUART1;
 hlpuart1.Init.BaudRate = 115200;
 hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
 hlpuart1.Init.StopBits = UART_STOPBITS_1;
 hlpuart1.Init.Parity = UART_PARITY_NONE;
 hlpuart1.Init.Mode = UART_MODE_TX_RX;
 hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 if (HAL_UART_Init(&hlpuart1) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
}
 
 void MX_USART2_UART_Init(void)
{
 huart2.Instance = USART2;
 huart2.Init.BaudRate = 115200;
 huart2.Init.WordLength = UART_WORDLENGTH_8B;
 huart2.Init.StopBits = UART_STOPBITS_1;
 huart2.Init.Parity = UART_PARITY_NONE;
 huart2.Init.Mode = UART_MODE_TX_RX;
 huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 huart2.Init.OverSampling = UART_OVERSAMPLING_16;
 huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 if (HAL_UART_Init(&huart2) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
}
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
 GPIO_InitTypeDef GPIO_InitStruct;
 if(huart->Instance==LPUART1)
 {
 __HAL_RCC_LPUART1_CLK_ENABLE();
 
 GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF6_LPUART1;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 hdma_lpuart1_rx.Instance = DMA1_Channel3;
 hdma_lpuart1_rx.Init.Request = DMA_REQUEST_5;
 hdma_lpuart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
 hdma_lpuart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
 hdma_lpuart1_rx.Init.MemInc = DMA_MINC_ENABLE;
 hdma_lpuart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
 hdma_lpuart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
 hdma_lpuart1_rx.Init.Mode = DMA_NORMAL;
 hdma_lpuart1_rx.Init.Priority = DMA_PRIORITY_LOW;
 if (HAL_DMA_Init(&hdma_lpuart1_rx) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 __HAL_LINKDMA(huart,hdmarx,hdma_lpuart1_rx);
 HAL_NVIC_SetPriority(AES_RNG_LPUART1_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(AES_RNG_LPUART1_IRQn);
 }
 else if(huart->Instance==USART2)
 {
 __HAL_RCC_USART2_CLK_ENABLE();
 GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(USART2_IRQn);
 }
}
 
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
 if(huart->Instance==LPUART1)
 {
 __HAL_RCC_LPUART1_CLK_DISABLE();
 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
 HAL_DMA_DeInit(huart->hdmarx);
 HAL_NVIC_DisableIRQ(AES_RNG_LPUART1_IRQn);
 }
 else if(huart->Instance==USART2)
 {
 __HAL_RCC_USART2_CLK_DISABLE();
 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
 HAL_NVIC_DisableIRQ(USART2_IRQn);
 }
}
 
void EnableUartIT(void)//′??ú3?ê??ˉ
{
 __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);
 __HAL_UART_CLEAR_IDLEFLAG(&hlpuart1); HAL_UART_Receive_DMA(&hlpuart1,LPUart1type.LPUart1DMARecBuff,LPUART1_DMA_REC_SIZE); 
 __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
 HAL_UART_Receive_IT(&huart2, &Usart2Rx, 1); 
}

This topic has been closed for replies.

1 reply

Mohamed Aymen HZAMI
ST Employee
January 9, 2019

Hello,

In your configuration, after initializing both UARTs, you put all the GPIOs in analog mode, in this case, the UART pins are no longer configured.

You need to change the SystemPower_Config function like this :

static void SystemPower_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 
 __HAL_RCC_PWR_CLK_ENABLE();
 HAL_PWREx_EnableUltraLowPower();
 HAL_PWREx_EnableFastWakeUp();
 __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_MSI);
 
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();
 __HAL_RCC_GPIOH_CLK_ENABLE();
 
 GPIO_InitStructure.Pin = GPIO_PIN_All;
 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStructure.Pull = GPIO_NOPULL;
 
 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
	HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
 HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
	
/* Retain the state of USART2, LPUART1 and EXTI PINs */
	GPIO_InitStructure.Pin = GPIO_PIN_All & (~GPIO_PIN_2) & (~GPIO_PIN_3) & (~GPIO_PIN_9) & (~GPIO_PIN_10) & (~GPIO_PIN_6) & (~GPIO_PIN_7);
	HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); 
 
 __HAL_RCC_GPIOA_CLK_DISABLE();
 __HAL_RCC_GPIOB_CLK_DISABLE();
 __HAL_RCC_GPIOC_CLK_DISABLE();
 __HAL_RCC_GPIOD_CLK_DISABLE();
 __HAL_RCC_GPIOH_CLK_DISABLE();
}

In this way, you make sure that the USART pins are still in their state.

Best Regards,

Mohamed Aymen.