Estoy usando SAMD21 con FreeRTOS. Estoy poniendo el sistema en modo inactivo En espera y confío en un TC que funciona como un indicador para que los FreeRtos sin garrapatas activen la MCU cuando el depurador no está conectado (lo cual no debería be) la MCU se duerme y nunca se despierta.
Loprobéconel8Minternoyel32Kexternoynotuvebloqueo.ElúnicorelojconelquelaCPUpuededespertarsedelasuspensiónesULP32K,quesiempreestáencendido,porloqueOnDemandnosignificamuchoenesecaso.
EstossonlosfragmentosdelasconfiguracionesdeTCydemireloj:
//Fromconf_clock.h/*SYSTEM_CLOCK_SOURCE_OSC8Mconfiguration-Internal8MHzoscillator*/#defineCONF_CLOCK_OSC8M_PRESCALERSYSTEM_OSC8M_DIV_1#defineCONF_CLOCK_OSC8M_ON_DEMANDtrue//<--#defineCONF_CLOCK_OSC8M_RUN_IN_STANDBYfalse//<--/*ConfigureGCLKgenerator5*/#defineCONF_CLOCK_GCLK_5_ENABLEtrue#defineCONF_CLOCK_GCLK_5_RUN_IN_STANDBYtrue//<--#defineCONF_CLOCK_GCLK_5_CLOCK_SOURCESYSTEM_CLOCK_SOURCE_OSC8M#defineCONF_CLOCK_GCLK_5_PRESCALER1#defineCONF_CLOCK_GCLK_5_OUTPUT_ENABLEfalse//Fromtickless.cvoidvPortSetupTimerInterrupt(void){//StructforconfiguringTCstructtc_configtcconf;//Setupconfigurationvaluestc_get_config_defaults(&tcconf);tcconf.clock_source=GCLK_GENERATOR_5;tcconf.counter_size=TC_COUNTER_SIZE_32BIT;tcconf.run_in_standby=true;//<--tcconf.clock_prescaler=TC_CLOCK_PRESCALER_DIV1;tcconf.wave_generation=TC_WAVE_GENERATION_MATCH_FREQ;//InitializetheTCtc_init(&tc,TICK_TC,&tcconf);//RegisterandenablecallbackforfreeRTOStickhandlertc_register_callback(&tc,(tc_callback_t)xPortSysTickHandler,TC_CALLBACK_CC_CHANNEL0);tc_enable_callback(&tc,TC_CALLBACK_CC_CHANNEL0);//SettopvalueequaltooneOSticktc_set_count_value(&tc,0);tc_set_top_value(&tc,TIMER_RELOAD_VALUE_ONE_TICK);//Enablethetimertc_enable(&tc);}
Loquemeestoyperdiendoaquí.
¿Esesteelmismoproblemaquelaspersonasestánhablandoaquí?>
Solo para aclarar, el nivel de suspensión IDLE_2 funciona y la CPU puede recuperarse de la suspensión con éxito.