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

 
 
> Прерывания AT91SAM7A3, не могу запустить прерывания на отладочной плате
shrek
сообщение Dec 2 2008, 07:38
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Доброго времени суток!
Возник очень больной вопрос по данному чипу...
Среда программирования IAR ARM 4.42
В чем суть...
Суть в том что уже 3 неделю никак не могу победить расширенный контроллер прерываний данного чипа...
Разрешал на уровне ядра глобально все прерывания, на уровне контроллера AIC разрешал все 32!!! прерывания! Контроллер все нормально регистрирует допустим FIQ или IRQ прерывания от счетчика или от еще какой нибудь периферии, записывал в регистр вектора текущего прерывания нужный адрес подпрограммы обработчика прерываний устанавливал статус что мол линия IRQ или FIQ активна! Все нормально... Но ядро отказывалось регистрировать прерывание! переходить на соответствующий вектор в отладчике. Контроллер AIC пробовал как в защищенном режиме чтобы просматривать регистры контроллера как и не в защищенном...
Пробовал даже просто прошить без отладки, думал что глючит режим отладки... Но все равно... Самое интересное что симулятор в IARе все генерит и нормально обрабатывает прерывания...
Вот на обозрение простенький код в ассемблере ссори за отсутствие коментов
мне главное было чтобы он зарегистрировал прерывания и перешел в этом коде на вектор 0x1C!!!
#include "AT91SAM7A3_inc.h"
NAME main
PUBLIC main

CODE32
;-------------------------------------------------------------------------------
org 0 //программный счетчик на 0x0
B init //движимся на инит
;-------------------------------------------------------------------------------
org 0x1C //программный счетчик на 0x1С
B irq_handler //движимся на обработчик FIQ
;-------------------------------------------------------------------------------
org 0x4C //программный счетчик на 0x4C
irq_handler
msr CPSR_c, #ARM_MODE_USER //пишет в CPSR режим юзера
B main //движимся на майн
;-------------------------------------------------------------------------------
org 0xAC //программный счетчик на 0xAC
ARM_MODE_USER EQU 0x10 //простая замена

init
mvn r0, #0xDF
bic r0, r0, #0xE00
mov r1, #0x1
str r1 , [r0] //это все записывает в регистр AIC_IECR разрешение прерывания FIQ
msr CPSR_c, #ARM_MODE_USER //пишет в CPSR режим юзера и разрешает все прерывания в ядре
;-------------------------------------------------------------------------------
main NOP //майн зациклен сам на себя
B main

END main
;-------------------------------------------------------------------------------
Вот такой простенький код в симуляторе работает на ура переходит на нужный вектор прерываний
в отладчике нифига не работает
--------------------------------------------------------------------------------
Вот еще пример уже конкретной отлаженной программы. Евли реализовать без прерываний все работает в отладчике диод мигает!
Если внедрить прерывание по FIQ то ниче не работает. На входе FIQ висит джостик.
не переходит на вектор 0х1С и ядро вообще молчит! хотя в AIC ставятся флаги что линия FIQ активна и в регистре AIC_IVR пишется нужный адрес обработчика. Я даже не открывал окно регистров контроллера прерываний. Компилил во флеш... зашивал в контроллер, но ниче не работает laughing.gif

#include "ioat91sam7a3.h"
#include "intrinsics.h"
#define LED_1 0x00100000
#define LED_2 0x00200000
#define LED_3 0x01000000
#define LED_4 0x02000000

void sys_fiq(void)
{
if (((AT91C_BASE_PIOA -> PIO_PDSR) & LED_1) == 0) AT91C_BASE_PIOA -> PIO_SODR = LED_1;
else AT91C_BASE_PIOA -> PIO_CODR = LED_1;
AT91C_BASE_AIC->AIC_EOICR = 0xF1F1F1F1;
//обработчик просто гасит и зажигает диод по прерыванию
}

AIC_config()
{
AT91C_BASE_AIC -> AIC_SVR[0] = (int) sys_fiq;//пишет в регистр адрес обработчика прерывания
AT91C_BASE_AIC -> AIC_IECR = 0x00000001;//разрешает FIQ
}

PMC_config()
{
AT91C_BASE_CKGR -> CKGR_MOR = 0x00000F01;//генератор кварц
AT91C_BASE_PMC -> PMC_MCKR = 0x0000000D;//выбран кварц как основной
AT91C_BASE_PMC -> PMC_SCER = 0x00000001;//разрешение тактирования ядра
AT91C_BASE_PMC -> PMC_PCER = 0x0000000C;//разрешение тактирования PIOA и PIOB
}

PIO_config()
{
AT91C_BASE_PIOA -> PIO_PER = 0x03300000;
AT91C_BASE_PIOA -> PIO_SODR = 0x03300000;
AT91C_BASE_PIOA -> PIO_OER = 0x03300000;
AT91C_BASE_PIOB -> PIO_PDR = 0x00000100;
AT91C_BASE_PIOB -> PIO_ASR = 0x00000100;
//конфигурирует PIOA и PIOB чтобы диоды горели и на вход FIQ
}

main ()
{
PMC_config();
PIO_config();
AIC_config();
while (1);
}
Прерывания разрешаются в асемблерном файлике в переработанно стартупе
msr CPSR_c, #ARM_MODE_USER
и опять же мне главное было чтобы в обработчике прога перешла при наступлении прерываний на вектор 0x1C!!!
Кстати писал в регистры AIC_IDCR, AIC_ICCR, AIC_EOICR соответствующие значения но все равно ниче не помогало!
В общем вот такая проблема...
Если кто может направте пожалуйста на путь истинный))) я уже, чесное слово, задолбался)))
В запасе еще есть конечно время но все меньше и меньше скоро проект надо начинать делать...
Периферия изучена на 60% но прерывания просто необходимы!!!
Ссори за ошибки) писал на "нервах")

Ссори за ошибки)
"Линия FIQ активна"
Писалось все на "нервах")

Сообщение отредактировал shrek - Dec 2 2008, 07:36
Go to the top of the page
 
+Quote Post



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

 


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


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