Soy nuevo en el trabajo integrado. Estoy usando un MCU STM32L0C8T6 y STM32CubeMX para generar el controlador hal para mi primer proyecto. Una de las características del proyecto es intentar configurarlo para que entre en modo de espera para conservar el menor consumo de energía si mi programa está inactivo durante un período de tiempo determinado, luego use el pin WKUP (PA0), que está conectado a un botón para activar un borde ascendente para despertar el MCU. El problema aquí es que no pude conseguir que funcionaran ni el modo de espera ni el pin de activación.
Cada vez que el programa se ejecuta y entra en modo de espera, la MCU se reinicia automáticamente sin presionar el botón. Otra cosa que observé es que si quito la función HAL_PWR_EnableWakeUpPin y vuelvo a ejecutar el programa, el dispositivo puede entrar en modo de espera (verificado con mi multímetro, la corriente de 11 mA bajó a 0,5 mA), pero el pin de activación aún no lo hace. trabajo.
He estado trabajando en este problema durante 7 días seguidos, revisé todo el manual técnico y no pude encontrar dónde hice mal.
Aprecio mucho si puedes arrojar algo de luz donde estoy haciendo mal.
configuración de pin MCU
Configuracióndelreloj
programadeconfiguracióndelreloj
Elcódigodefunciónestándardelejemploparainiciarlaespera
DepuracióndeindicadoresCSR,CRySCR
Actualizado:
intmain(void){/*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/HAL_Init();/*Configurethesystemclock*/SystemClock_Config();HAL_Delay(10000);HAL_PWREx_EnableUltraLowPower();/*EnablethefastwakeupfromUltralowpowermode*/HAL_PWREx_EnableFastWakeUp();if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB)!=RESET){/*ClearStandbyflag*/__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);}/*Insert5secondsdelay*/HAL_Delay(5000);/*Disableallusedwakeupsources:Pin1(PA.0)*/HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);/*Clearallrelatedwakeupflags*/__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);/*Re-enableallusedwakeupsources:Pin1(PA.0)*/HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);HAL_PWR_EnterSTANDBYMode();while(1){}}HAL_StatusTypeDefHAL_Init(void){/*ConfigureBuffercache,Flashprefetch,Flashpreread*/#if(BUFFER_CACHE_DISABLE!=0)__HAL_FLASH_BUFFER_CACHE_DISABLE();#endif/*BUFFER_CACHE_DISABLE*/#if(PREREAD_ENABLE!=0)__HAL_FLASH_PREREAD_BUFFER_ENABLE();#endif/*PREREAD_ENABLE*/#if(PREFETCH_ENABLE!=0)__HAL_FLASH_PREFETCH_BUFFER_ENABLE();#endif/*PREFETCH_ENABLE*//*Usesystickastimebasesourceandconfigure1mstick(defaultclockafterResetisMSI)*/HAL_InitTick(TICK_INT_PRIORITY);/*Initthelowlevelhardware*/HAL_MspInit();/*Returnfunctionstatus*/returnHAL_OK;}voidSystemClock_Config(void){RCC_ClkInitTypeDefRCC_ClkInitStruct;//RCC_PeriphCLKInitTypeDefPeriphClkInit;RCC_OscInitTypeDefRCC_OscInitStruct;__PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSI48;RCC_OscInitStruct.HSIState=RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue=16;RCC_OscInitStruct.LSIState=RCC_LSI_ON;RCC_OscInitStruct.HSI48State=RCC_HSI48_ON;RCC_OscInitStruct.PLL.PLLState=RCC_PLL_NONE;HAL_RCC_OscConfig(&RCC_OscInitStruct);RCC_ClkInitStruct.ClockType=RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV16;HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_1);}voidHAL_PWREx_EnableUltraLowPower(void){/*EnabletheUltraLowPowermode*/PWR->CR|=PWR_CR_ULP;}voidHAL_PWREx_EnableFastWakeUp(void){/*Enablethefastwakeup*/PWR->CR|=PWR_CR_FWU;}voidHAL_PWR_DisableWakeUpPin(uint32_tWakeUpPinx){/*Checktheparameter*/assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx));/*DisabletheEWUPxpin*/PWR->CSR&=~WakeUpPinx;}voidHAL_PWR_EnableWakeUpPin(uint32_tWakeUpPinx){/*Checktheparameter*/assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx));/*EnabletheEWUPxpin*/PWR->CSR|=WakeUpPinx;}voidHAL_PWR_EnterSTANDBYMode(void){/*SelectStandbymode*/PWR->CR|=PWR_CR_PDDS;/*SetSLEEPDEEPbitofCortexSystemControlRegister*/SCB->SCR|=SCB_SCR_SLEEPDEEP_Msk;/*Thisoptionisusedtoensurethatstoreoperationsarecompleted*/#ifdefined(__CC_ARM)__force_stores();#endif/*RequestWaitForInterrupt*/__WFI();}
Eliminéelrestodeloscódigos,exceptoloscódigosdeesperaenlapantallaprincipalparaprobarlosayer.Melasarregléparaobservarelfuncionamientodelafuncióndeespera,perosolopresionandoymanteniendopresionadoelbotónpulsador,lamediciónactualbajódeaproximadamente3,5mAa0,5mA.Peroesanoeralaejecucióncorrectaquequería,elusodelbotónpulsadoresparaactivareldispositivo.Despuésdequeeldispositivoentróenmododeespera,presionéelbotónnuevamente,elpindeactivaciónaúnnofunciona.
Esquemadelbotónpulsador