kutukvpavel
New member
Приветствую!
Начал разбираться с Амуром (на отладке NUKE v0.3 от Теллура). Не могу почему-то запустить сторожевой таймер, код прилагается, но он практически идентичен примерам на гитхабе. HAL_WDT_Start() всегда возвращает HAL_TIMEOUT. Такое ощущение, что то ли Power Domain где-то не включен, то ли тактирование, но ведь соответствующая инициализация PCC присутствует в коде. В целом программа работает, так что CLK32M и CLK32K присутствуют. Кто-то ещё сталкивался с таким?
Пробовал все Clock Source для WDT из HAL_WDT_Clocks, пробовал увеличивать таймаут, безрезультатно.
Начал разбираться с Амуром (на отладке NUKE v0.3 от Теллура). Не могу почему-то запустить сторожевой таймер, код прилагается, но он практически идентичен примерам на гитхабе. HAL_WDT_Start() всегда возвращает HAL_TIMEOUT. Такое ощущение, что то ли Power Domain где-то не включен, то ли тактирование, но ведь соответствующая инициализация PCC присутствует в коде. В целом программа работает, так что CLK32M и CLK32K присутствуют. Кто-то ещё сталкивался с таким?
Пробовал все Clock Source для WDT из HAL_WDT_Clocks, пробовал увеличивать таймаут, безрезультатно.
C:
static WDT_HandleTypeDef hwdt = {};
static PCC_ConfigErrorsTypeDef SystemClock_Config(void)
{
PCC_InitTypeDef PCC_OscInit = {0};
PCC_OscInit.OscillatorEnable = PCC_OSCILLATORTYPE_ALL;
PCC_OscInit.FreqMon.OscillatorSystem = PCC_OSCILLATORTYPE_OSC32M;
PCC_OscInit.FreqMon.ForceOscSys = PCC_FORCE_OSC_SYS_UNFIXED;
PCC_OscInit.FreqMon.Force32KClk = PCC_FREQ_MONITOR_SOURCE_OSC32K;
PCC_OscInit.AHBDivider = 0;
PCC_OscInit.APBMDivider = 0;
PCC_OscInit.APBPDivider = 0;
PCC_OscInit.HSI32MCalibrationValue = 128;
PCC_OscInit.LSI32KCalibrationValue = 128;
PCC_OscInit.RTCClockSelection = PCC_RTC_CLOCK_SOURCE_AUTO;
PCC_OscInit.RTCClockCPUSelection = PCC_CPU_RTC_CLOCK_SOURCE_OSC32K;
return HAL_PCC_Config(&PCC_OscInit);
}
static HAL_StatusTypeDef WDT_Init()
{
HAL_StatusTypeDef ret;
hwdt.Instance = WDT;
hwdt.Init.Clock = HAL_WDT_OSC32M;
hwdt.Init.ReloadMs = 500;
ret = HAL_WDT_Init(&hwdt, WDT_TIMEOUT_DEFAULT);
if (ret != HAL_OK) return ret;
return HAL_WDT_Start(&hwdt, WDT_TIMEOUT_DEFAULT); // <--- Здесь всегда позвращает 3 (HAL_TIMEOUT)
}
HAL_StatusTypeDef my_hal_init(void)
{
HAL_StatusTypeDef ret = HAL_OK;
HAL_Init();
__HAL_PCC_PM_CLK_ENABLE();
SystemClock_Config();
__HAL_PCC_EPIC_CLK_ENABLE();
CHECK_ERROR(WDT_Init(), "WDT init failed");
xputs("WDT init finished\n");
return ret;
}
int main()
{
HAL_StatusTypeDef init_result = my_hal_init();
if (init_result != HAL_OK) while (1);
while (1)
{
<...>
}
}
Последнее редактирование: