misyachniy 0 5 мая, 2023 Опубликовано 5 мая, 2023 · Жалоба Понадобилось запустить UART с возможностью отработки таймаута по приему. В самом UART такой вариант отсутсвует. Пробовал с помощью обычного таймера. Но в нем счетчик без возможности записи со стороны процессора. Корректно перезапускать не получилось. Более менее получилось с Watchdog. Вот так описал прерывание #define WDTPERIOD 10000 EX_INTERRUPT_HANDLER (Watchdog_ISR) { *pWDOGB_CNT = WDTPERIOD; *pFIO0_FLAG_T = DBG_PIN; // toggle asm("ssync;"); } Вот так настраиваю сам Watchdog: void WDOGinit (void) { // Запрет сторожевого таймера: *pWDOGB_CTL = WDDIS; ssync(); // Инициализация счетчика: *pWDOGB_CNT = WDTPERIOD; ssync(); register_handler(ik_ivg13, Watchdog_ISR); /* Note that if the general-purpose interrupt option is selected, the System Interrupt Mask register (SIC_IMASK) should be appropriately configured to unmask that interrupt. */ // Table 4-7. Peripheral Interrupt Source Reset State //Watchdog Timer interrupt - 59 - IVG13 - SIC_IMASK1 == 27 // разрешение логической 1 *pSICB_IMASK1 |= SIC_MASK(27);\ // Разрешение сторожевого таймера, генерировать обычное прерывание // при срабатывании сторожевого таймера: *pWDOGB_CTL = WDEN | WDEV_GPI; // 0x0FF0 | 0x0004 ssync(); *pWDOGB_STAT = 0; } Реально удалось загрузить на лету и прошить работающую версию с WDTPERIOD = 1000. На выходе видно частоту чуть больше 2МГц. Как только поменяю значение на другое - или нет сигнала на выходе или остается "старый" или отваливается эмулятор. В сети нашел примеры для BF-60x : adi_int_InstallHandler(INTR_WDOG1_EXP, wdtISR, NULL, true); _wdtDisable(); _wdtSetTimeout(wdtPeriod); _wdtEnable(); Но таких функций в примерах в моем VDSP нет. "INTR_WDOG1_EXP" - ни одной ссылки в Интернете. Понятно, что с порядком обращения к регистрам проблема, но как найти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться