реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> глюки Reset контроллера или?.., AT91SAM7X
Sergei_K
сообщение Nov 28 2007, 11:46
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 49
Регистрация: 14-02-07
Пользователь №: 25 346



Дело в том, что в своей задаче я использую прерывания в 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, прерывание сработает один раз, как и положено..
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 28 2007, 12:02
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
VslavX
сообщение Nov 28 2007, 14:24
Сообщение #3


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Sergei_K @ Nov 28 2007, 13:46) *
Так вот, проблема в том, что при выполнении перезагрузки, указанной выше, происходит прерывание
PIO Controllerа, причем независимо от того, запретил я это прерывание перед ресетом или нет.. Как это

А Вы уверены что прерывание именн от PIO? В SAM7 прерывания PIO и RTSC совмещены и подключены по схеме ИЛИ к одному входу AIC. В обработчике такого "разделяемого" прерывания надо анализировать его причину по регистрам периферии.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.02591 секунд с 7
ELECTRONIX ©2004-2016