Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: keil и прерывания для AT91SAM7S256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
LoLo
Здравствуйте всем кто работал с камнем AT91SAM7S256 на симуляторе Keil uVision3.
У меня следующая проблема:
инициализирую прерывание интервального таймера PIT, вектора записал куда нужно, всё нормально. Прерывание вызывается, симулятор заходит в программу обработки, сбраcывается флаг вызова прерывания после того как я одноимённый регистр прочитал. Симулятор выходит из подпрограммы прерывания на то же место откуда на подпрограмму обработки прерывания вышел всё нормально, всё как надо, но интересное потом:
через несколько тактов программа становится опять на то же место, куда попала из обработки прерывания и так до бесконечности... проходит несколько тактов и опять обратно "прыгает"...
В чём дело? Подскажите или лучше пример скинте формирования прерываний на адрес: shuriklo@rambler.ru
aaarrr
Наверное используете модификатор __irq для обработчика совместно с патентованным атмеловским стартапом.
LoLo
Цитата(aaarrr @ Apr 13 2011, 20:38) *
Наверное используете модификатор __irq для обработчика совместно с патентованным атмеловским стартапом.


Стартап атмеловский-да. __irq вроде нету.
aaarrr
Тогда покажите ваш обработчик и то, что в стартапе. И где зацикливается тоже.
LoLo
Цитата(aaarrr @ Apr 13 2011, 21:05) *
Тогда покажите ваш обработчик и то, что в стартапе. И где зацикливается тоже.


Вот собственно весь проект. Как только все скомпилируется нада в дебагере установть пин PIOA22 в 1 и проследить по шагам. Зацикливается в функции static void PioInterruptHandler(unsigned int id, AT91S_PIO *pPio)
А стартап в приложенном проекте: SAM7.s

Здесь прерывание от ножки контроллера, не от таймера
aaarrr
Стартап у вас кейловский, остальная требуха атмеловская. Вместе они работать не будут. Или же к "static void InterruptHandler(void)" надо добавить модификатор __irq.
Но лучше всю эту маразматическую атмеловскую "библиотечную" писанину выкинуть.
LoLo
Цитата(aaarrr @ Apr 13 2011, 21:43) *
Стартап у вас кейловский, остальная требуха атмеловская. Вместе они работать не будут. Или же к "static void InterruptHandler(void)" надо добавить модификатор __irq.
Но лучше всю эту маразматическую атмеловскую "библиотечную" писанину выкинуть.


А где взять атмеловский стартап?
aaarrr
Цитата(LoLo @ Apr 13 2011, 21:48) *
А где взять атмеловский стартап?

У атмела, вестимо, среди всяких "GettingStarted..."
Но не советую, очень не советую. Все это образцы дурнейшего перегруженного индусского стиля.
LoLo
Цитата(aaarrr @ Apr 13 2011, 21:54) *
У атмела, вестимо, среди всяких "GettingStarted..."
Но не советую, очень не советую. Все это образцы дурнейшего перегруженного индусского стиля.


А какой тогда лучше? Кейловский?
aaarrr
Цитата(LoLo @ Apr 13 2011, 21:56) *
А какой тогда лучше? Кейловский?

Лучше всего свой собственный. Но если сравнивать эти два, то лучше кейловский.
LoLo
Цитата(aaarrr @ Apr 13 2011, 22:03) *
Лучше всего свой собственный. Но если сравнивать эти два, то лучше кейловский.


А как добавить модификатор __irq к "static void InterruptHandler(void)"?
Что получится?
aaarrr
static __irq void InterruptHandler(void)
LoLo
Цитата(aaarrr @ Apr 13 2011, 22:16) *
static __irq void InterruptHandler(void)


Огромное спасибо!!!
LoLo
Цитата(LoLo @ Apr 13 2011, 22:18) *
Огромное спасибо!!!


Добавил в тот же проект инициализацию USART и теперь при запуске Debuggera в Keil вообще все зацикливается сразу!
aaarrr
Цитата(LoLo @ Apr 14 2011, 10:10) *
Добавил в тот же проект инициализацию USART и теперь при запуске Debuggera в Keil вообще все зацикливается сразу!

Где зацикливается-то? Вы поймите правильно, Keil'а под рукой у меня нет, а проект представляет собой безумное нагромождение оберток, разобраться в котором глазами почти невозможно.
Чтобы просто начать работать с UART'ом нужно сочинить всего-то навсего пару десятков строчек:
CODE

#define MCK 48000000
#define UART0_BAUDRATE 115200
#define RXD0 (1UL << 5)
#define TXD0 (1UL << 6)

void uart0_ini(void)
{
AT91C_BASE_SYS->PIOA_PDR = RXD0 | TXD0;
AT91C_BASE_PMC->PMC_PCER = 1UL << AT91C_ID_US0;

*AT91C_US0_MR = AT91C_US_USMODE_NORMAL | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE;
*AT91C_US0_BRGR = (unsigned int)((mck + (UART0_BAUDRATE * 8)) / (UART0_BAUDRATE * 16));
*AT91C_US0_CR = AT91C_US_TXEN | AT91C_US_RXEN;
}

void uart0_send_byte(unsigned int byte)
{
while(!(*AT91C_US0_CSR & AT91C_US_TXRDY));
*AT91C_US0_THR = byte;
}

Зато появится понимание, что и как происходит. А все эти атмеловские приблуды - не более чем мусор, затуманивающий код.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.