Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: глюки Reset контроллера или?..
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Sergei_K
Дело в том, что в своей задаче я использую прерывания в PIO Controllerе, которые срабатывают при изменении уровня сигнала на указанной ножке.. (ножка настроена как вход) Кроме того, мне необходимо перезагружать контроллер софтовым способом, например, вида:

pRSTC->RSTC_RCR = AT91C_RSTC_EXTRST |
AT91C_RSTC_KEY_PASS;

Так вот, проблема в том, что при выполнении перезагрузки, указанной выше, происходит прерывание PIO Controllerа, причем независимо от того, запретил я это прерывание перед ресетом или нет.. Как это можно объяснить? Разве при сбросе все регистры не должны сбрасываться в дефолтное состояние? И даже если какие-то регистры не сбросились, все равно прерывание не должно срабатывать, если его запретили.. По-моему, так..

Чтобы было понятней, приведу отрывок из простейшей программы , иллюстрирующей данную проблему:


........................

//Функция прерывания:

__irq void IRQ_Handler (void) {

pAIC>AIC_IDCR = 0xFFFFFFFF; // disable all interrupts

pPIOB->PIO_IDR = 0xFFFFFFFF; // disable PIOB interrupts

pRSTC->RSTC_RCR = AT91C_RSTC_EXTRST |
AT91C_RSTC_KEY_PASS; // External Reset

pPIOB_int->PIO_ISR; // clear PIOB interrupts

pAIC_int->AIC_EOICR = 0x0; // end of interrupt

}

...........................

В данном примере Reset вызывает зацикливание данной функции прерывания.. Если убрать Reset, прерывание сработает один раз, как и положено..
Сергей Борщ
Цитата(Sergei_K @ Nov 28 2007, 13:46) *
pRSTC->RSTC_RCR = AT91C_RSTC_EXTRST | AT91C_RSTC_KEY_PASS;
Телепатически домыслить модель контроллера не получается, ограничился семейством: AT91. Вы дергаете внешнюю ногу RESET, что не совсем корректно - длительность генерируемого сигнала может оказаться недостаточной для корректного сброса. Для какого-то из контроллеров этот вопрос тут обсасывался. Я сбрасываю командой AT91C_BASE_RSTC->RSTC_RCR = AT91C_RSTC_PROCRST | AT91C_RSTC_PERRST | (0xA5UL << 24); все работает корректно. Если ограничиться сбросом только периферии ( AT91C_BASE_RSTC->RSTC_RCR = AT91C_RSTC_PERRST | (0xA5UL << 24); ) то надо после такой команды дождаться сбрасывания флага SRCMP
VslavX
Цитата(Sergei_K @ Nov 28 2007, 13:46) *
Так вот, проблема в том, что при выполнении перезагрузки, указанной выше, происходит прерывание
PIO Controllerа, причем независимо от того, запретил я это прерывание перед ресетом или нет.. Как это

А Вы уверены что прерывание именн от PIO? В SAM7 прерывания PIO и RTSC совмещены и подключены по схеме ИЛИ к одному входу AIC. В обработчике такого "разделяемого" прерывания надо анализировать его причину по регистрам периферии.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.