Перейти к содержанию
    

Прерывания AT91SAM7A3

Доброго времени суток!

Возник очень больной вопрос по данному чипу...

Среда программирования 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:

 

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что у Вас записано по векторам 0x18, 0x1C?

 

void sys_fiq(void)

Где оформление прерывания?

 

Диод, я надеюсь, Вы осциллографом смотрите? А то глазами можно и не заметить моргания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что у Вас записано по векторам 0x18, 0x1C?

Где оформление прерывания?

 

Диод, я надеюсь, Вы осциллографом смотрите? А то глазами можно и не заметить моргания.

 

диод по идее должен гаснуть и зажигаться по однократному нажатию на джостик или кнопку)

в отладке это работает. в смысле если функциональную часть обработчика например в майн сунуть то это работает диод гаснет и зажигается если задержку внедрить то при выходе из отладки видно как гаснет и зажигается))) :laughing:

в 0х18 я ничего не писал так как не использую IRQ

вот что находится по вектору 0x1C

org 0x1C

mov r9,r0

ldr lr , [pc, #AIC_FVR]

msr CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC

stmfd sp!, { r1-r3, r12, lr}

mov r14, pc

bx r0

ldmia sp!, { r1-r3, r12, lr}

msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ

mov r0,r9

subs pc,lr,#4

взятый из стартупа)

Изменено пользователем shrek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в 0х18 я ничего не писал так как не использую IRQ

А какой смысл использовать FIQ, тем более с таким "оформлением":

 

вот что находится по вектору 0x1C

Тому, кто такие "стартупы" пишет, следовало бы руки оторвать :maniac:

Здесь - bx r0 - процессор отправляется в свободное плаванье по неизвестному адресу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так проц вообще на вектор 0х1С не переходит) (в отладке)

 

даже более скажу если в майн записать туже функциональную часть с задержкой для другого диода, то этот же диод будет работать, а если жать на кнопку FIQ прерывания то изменения никакого не последует даже если проц в свободное плавание уйдет

 

то есть проц упорно не хочет идти при прерывании на вектор соответствующий...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так проц вообще на вектор 0х1С не переходит) (в отладке)

Оставьте в отладке (если уж без нее никак) отображение только AIC_CISR и посмотрите, ставится ли там бит NFIQ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бит NFIQ ставится!!!

но на вектор проц не переходит)

Изменено пользователем shrek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бит NFIQ ставится!!!

но на вектор проц не переходит)

Значит FIQ запрещен на самом деле - чудес не бывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

FIQ разрешен)

AT91C_BASE_AIC -> AIC_IECR = 0x00000001

msr CPSR_c, #ARM_MODE_USER строчка из стратупа перед входом в майн)

в CPSR биты F и I сбрасываются)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот вот именно когда в NFIQ в CPSR ниче не меняется!!!

Меня интересует не что в нем меняется, а что в нем записано в этот момент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

биты I и F сброшены решим пользователя 10000

Это эмулятор говорит, или это Ваша догадка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эмулятор)

мне кажется что то начало получаться... буду пробовать)

спасибо что у вас хватило терпения выслушать мою проблему)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...