cancel
Showing results for 
Search instead for 
Did you mean: 

How to solve the ADC problem when exiting stop mode in STM32WB5

Yuki_I
Associate II

I'm using an STM32WB5MMG module.
I was facing a problem with AD not working properly when exiting from stop2 mode.

HAL_ADC_PollForConversion()

returns a value other than HAL_OK
And,

HAL_ADC_GetValue(&hadc1)

returns only 0.

I have confirmed the same problem in the following post, but it remained unresolved, so I would like to know how to resolve it.
https://community.st.com/t5/stm32-mcus-wireless/how-to-get-adc-to-work-after-stop0-mode-stm32wb5/td-p/95710

Similar to this post
Before entering STOP2 mode, tried to do

HAL_ADC_DeInit(&hadc1);

and after exiting from STOP2 mode, tried to do

MX_ADC1_Init()

But, The process in this function below had error.

if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); }


Is there any approach I should try?

3 REPLIES 3
Yuki_I
Associate II

Hi,
any information on this topic?

STTwo-32
ST Employee

Hello @Yuki_I 

Could you please share the code that you used to show the ADC is working fine before STOP2 mode and it gets an error after.

Best Regards.

STTwo-32

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

Yuki_I
Associate II

Hello, @STTwo-32 

The code I am trying is below.
I am using cubeMX V6.12 and CubeFW_WB V.1.20 for code generation.
in main.c

int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Config code for STM32_WPAN (HSE Tuning must be done before system clock configuration) */ MX_APPE_Config(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* Configure the peripherals common clocks */ PeriphCommonClock_Config(); /* IPCC initialisation */ MX_IPCC_Init(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_RTC_Init(); MX_TIM16_Init(); MX_ADC1_Init(); MX_RF_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_DeInit(&hadc1); /* USER CODE END 2 */ /* Init code for STM32_WPAN */ MX_APPE_Init(); /* Infinite loop */ /* USER CODE BEGIN WHILE */ HAL_TIM_Base_Start_IT(&htim16); while (1) { /* USER CODE END WHILE */ MX_APPE_Process(); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ uint16_t ADCdata12bit = 0; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (HAL_ADC_Start(&hadc1) != HAL_OK) { /* ADC conversion start error */ //Error_Handler(); } /* Wait for ADC conversion completed */ if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK) { /* End Of Conversion flag not set on time */ //Error_Handler(); } ADCdata12bit = HAL_ADC_GetValue(&hadc1); if(HAL_ADC_Stop(&hadc1) != HAL_OK) { //Error_Handler(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }
View more

 in app_entry.c

void MX_APPE_Init(void) { System_Init(); /**< System initialization */ SystemPower_Config(); /**< Configure the system Power Mode */ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */ /* USER CODE BEGIN APPE_Init_1 */ APPD_Init(); UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE); /* USER CODE END APPE_Init_1 */ appe_Tl_Init(); /* Initialize all transport layers */ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return; }

 in app_ble.c

void APP_BLE_Init(void) { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Initialize Ble Transport Layer */ Ble_Tl_Init(); /** * Do not allow standby in the application */ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Start to Advertise to be connected by a Client */ Adv_Request(APP_BLE_LP_ADV); } SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification(void *p_Pckt) { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ switch (p_event_pckt->evt) { case HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE: { p_connection_complete_event = (hci_le_connection_complete_event_rp0 *) p_meta_evt->data; /** * The connection is done, there is no need anymore to schedule the LP ADV */ APP_DBG_MSG(">>== HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE - Connection handle: 0x%x\n", p_connection_complete_event->Connection_Handle); APP_DBG_MSG(" - Connection established with Central: @:%02x:%02x:%02x:%02x:%02x:%02x\n", p_connection_complete_event->Peer_Address[5], p_connection_complete_event->Peer_Address[4], p_connection_complete_event->Peer_Address[3], p_connection_complete_event->Peer_Address[2], p_connection_complete_event->Peer_Address[1], p_connection_complete_event->Peer_Address[0]); APP_DBG_MSG(" - Connection Interval: %.2f ms\n - Connection latency: %d\n - Supervision Timeout: %d ms\n\r", p_connection_complete_event->Conn_Interval*1.25, p_connection_complete_event->Conn_Latency, p_connection_complete_event->Supervision_Timeout*10 ); if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING) { /* Connection as client */ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT; } else { /* Connection as server */ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER; } BleApplicationContext.BleApplicationContext_legacy.connectionHandle = p_connection_complete_event->Connection_Handle; /** * SPECIFIC to Custom Template APP */ HandleNotification.Custom_Evt_Opcode = CUSTOM_CONN_HANDLE_EVT; HandleNotification.ConnectionHandle = BleApplicationContext.BleApplicationContext_legacy.connectionHandle; Custom_APP_Notification(&HandleNotification); /* USER CODE BEGIN HCI_EVT_LE_CONN_COMPLETE */ //BLEConnectionStatus = BleApplicationContext.Device_Connection_Status; UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE); UTIL_LPM_SetStopMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE); //To make sure that the device is not in stop mode when connected. APP_BLE_Reconnection_Status = 1; /* USER CODE END HCI_EVT_LE_CONN_COMPLETE */ break; /* HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE */ } //~~~~~~~~~~~~~~~~~~~~~~~~~~ }
View more

On this code, in app_conf.h

#define CFG_LPM_SUPPORTED 0
the ADC will work correctly after BLE connection,
#define CFG_LPM_SUPPORTED 1
in main.c
HAL_ADC_PollForConversion(&hadc1, 10)
an error is generated.