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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> AT91SAM9260, Помогите с прерываниями
crack_enigma
сообщение Jul 1 2009, 07:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939



Всем привет.

Разбираюсь с прерываниями мк AT91SAM9260 IRQ1 и IRQ2. Прошу просто пример кода где они настраиваются и разрешаются. Среда IAR. Язык С.
Go to the top of the page
 
+Quote Post
crack_enigma
сообщение Jul 1 2009, 12:01
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939



Профи, ну помогите!!!!

ниже код (в обработчики прерывания не попадаю)

CODE

void DefInt(); //обработчик прерываний - один на всех пока

extern "C" __irq __arm void IRQ_Handler(void);
extern "C" __irq __arm void FIQ_Handler(void);


int main()
{

//тактирование
//...

//настройка PIO
AT91S_PIO * PIOC = AT91C_BASE_PIOC;
PIOC->PIO_PPUDR = 0xFFFFFFFF;
PIOC->PIO_BSR = bit14|bit15; //IRQ1 IRQ2
PIOC->PIO_PDR = bit14|bit15;

//конфигурирование прерываний
AT91S_AIC * aic_reg = AT91C_BASE_AIC; //регитсры прерываний
AT91_REG * handler = aic_reg->AIC_SVR; //обработчики
AT91_REG * mode = aic_reg->AIC_SMR; //режим работы
AT91_REG * rgIDCR = &(aic_reg->AIC_IDCR); //регистр запрета прерываний
AT91_REG * rgIECR = &(aic_reg->AIC_IECR); //регистр разрешения прерываний
AT91_REG * rgICCR = &(aic_reg->AIC_ICCR); //регистр очистки флага прерываний
AT91_REG * rgISCR = &(aic_reg->AIC_ISCR); // Регистр установки прерываний

*rgIDCR = 0xFFFFFFFF;
*rgICCR = 0xFFFFFFFF;
*rgISCR = 0xFFFFFFFF;

for(int i = 0; i<32; i++){handler[i]= (unsigned int)DefInt;}

*rgIECR = 0xFFFFFFFF;// AIC_IECR

__enable_interrupt(); //разрешить прерывания

//импульсы на входе порта за счёт подтягивающих резисторов
while(1)
{
AT91C_BASE_PIOC-> PIO_PPUER = 0xC000;
for(int i =0; i<100000; i++);
AT91C_BASE_PIOC-> PIO_PPUDR = 0xC000;
for(int i =0; i<100000; i++);
}

return 0;
}


__irq __arm void IRQ_Handler(void)
{
while(1);
}
__irq __arm void FIQ_Handler(void)
{
while(1);
}

void DefInt()
{
while(1);
}

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 1 2009, 12:15
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата
импульсы на входе порта за счёт подтягивающих резисторов

Вы уверены, что они физически есть? Pull-down снаружи присутствует?

Цитата
*rgIECR = 0xFFFFFFFF;// AIC_IECR

Не стоит включать все подряд. И способ несколько странный - вместо использования многочисленных указателей можно просто написать *AT91C_AIC_IECR = (1UL << AT91C_ID_IRQ1) | (1UL << AT91C_ID_IRQ2);

Далее - куда Вы хотите попасть, и что написано в стартапе?
Go to the top of the page
 
+Quote Post
crack_enigma
сообщение Jul 1 2009, 12:26
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939



1. Подтягивающие резисторы в самом МК (смотрел осцилографом на выводе импульсы есть)
2. Включать отдельно тоже побывал эффект тод же. ПроСто пытался запустить и RTT и другие потому так и писал.
3. Стартап подпихивает сам IAR (С++ запускает из main). ASM код из отладчика вот
__vector:
__iar_init$$done:
00000000 E59FF018 LDR PC, [PC, #+24] ; RESET [0x20] =__iar_program_start (0x2B4)
00000004 E59FF018 LDR PC, [PC, #+24] ; UND [0x24] =Undefined_Handler (0x228)
00000008 E59FF018 LDR PC, [PC, #+24] ; SWI [0x28] =SWI_Handler (0x22C)
0000000C E59FF018 LDR PC, [PC, #+24] ; P ABT [0x2C] =Prefetch_Handler (0x230)
00000010 E59FF018 LDR PC, [PC, #+24] ; D ABT [0x30] =Abort_Handler (0x234)
__vector_0x14:
00000014 00000000 ANDEQ R0, R0, R0
00000018 E59FF014 LDR PC, [PC, #+20] ; IRQ [0x34] =IRQ_Handler (0x238)
0000001C E59FF014 LDR PC, [PC, #+20] ; FIQ [0x38] =FIQ_Handler (0x23C)

PS: использую J-Link
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 1 2009, 13:08
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(crack_enigma @ Jul 1 2009, 16:26) *
PS: использую J-Link

Тогда посмотрите, что у Вас в AIC_IPR и AIC_CISR. Да, и под отладкой нужно или убрать из окошка регистров AIC_IVR, или использовать Protect Mode.
Go to the top of the page
 
+Quote Post
crack_enigma
сообщение Jul 2 2009, 04:27
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939



изменил код на
CODE

//...
*AT91C_AIC_IDCR = 0xFFFFFFFF;
*AT91C_AIC_ICCR = 0xFFFFFFFF;
for(int i = 0; i<32; i++){ AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int)DefInt;}
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ1] = PRIOR_0|EXT_NEGATIVE_EDGE;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ2] = PRIOR_0|EXT_NEGATIVE_EDGE;
*AT91C_AIC_IECR = (1UL << AT91C_ID_IRQ1) | (1UL << AT91C_ID_IRQ2);
//...


Цитата
что у Вас в AIC_IPR и AIC_CISR

в AIC_IPR 0x00000000
в AIC_CISR (NFIQ == 0 NIRQ == 0)

Цитата
убрать из окошка регистров AIC_IVR

Как это можно cделать ?

Цитата
использовать Protect Mode

Где его включить ?

Сообщение отредактировал crack_enigma - Jul 2 2009, 04:38
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 2 2009, 04:52
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Поставьте вот это

Код
ldr     PC, [PC,# -0xF20]       ;AIC direct


вместо вот этого в стартапе.

Код
00000018 E59FF014 LDR PC, [PC, #+20]; IRQ [0x34] =IRQ_Handler (0x238)


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
crack_enigma
сообщение Jul 2 2009, 05:38
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939



Цитата
Поставьте вот это

Код
ldr PC, [PC,# -0xF20] ;AIC direct


А где стартап то лежит? примеры его видел. Но к C++ проекту он подрубается сам.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 2 2009, 06:34
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Вы не в состоянии найти файл на собственном компьютере?
В окошке проекта слева. *.s

Разберитесь конкретно для чего нужен стартап. Там определяются стеки всех режимов, и способы обработки прерываний.
Посмотрите по шагам (без отладчика, а глазами) что делается, когда возникают прерывания. Проследите путь программы и поймете где она оказывается.
А отладчик выбросьте. Тут был спор насколько он полезен... Польза - налицо.

Та строка, что я вам привел заведует выборкой вектора, куда пойдет исполнение в случае прерывания, прямо из регистра AIC.

Пока не разберетесь, не располагайте в обработчике прерываний вызовов других процедур.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
crack_enigma
сообщение Jul 2 2009, 09:11
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939



Цитата
В окошке проекта слева. *.s

В проекте при этом ФАЙЛА стартап вообще НЕТ. Вот и вопрос где он если править то его.

Вообще, как я понял, проект С++ IAR 5.20 САМ подпихивает стартап. Для работы энтих векторов достаточно писать:
extern "C" __irq __arm void IRQ_Handler(void);
и потом его реализовать.

Скажем при обращении в память за нужный диапазон в
__irq __arm void Abort_Handler(void)
{
}

замечательно заходит.

Как устроены стартапы тоже смотрел и разбирался.
Ну а для большей понятности ставил точку останова на самом векторе 0x18 и там то он не оказывается.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 2 2009, 10:49
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Так включите.

Extern C - не знаю что это.

Включите в проект вот этот стартап.
Он берет вектора прерываний прямо из AIC.
Убедитесь, что в линкерном файле достаточно стека под все прерывания.
Этот стартап работает исключительно при загрузке в память с адреса 30 0000. Т.е. в неремапленную срам.
И сам ее ремапит. Т.е. из флэшки этот стартап запускать нельзя.
Прикрепленные файлы
Прикрепленный файл  H1818_Startup.zip ( 1.45 килобайт ) Кол-во скачиваний: 31
 


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
crack_enigma
сообщение Jul 3 2009, 05:58
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939



за стартап H1818_Startup.zip благодарю.

Возник наивный вопрос:
ldr PC,IRQ_Addr ; IRQ
ldr PC, [PC,# -0xF20] ;AIC direct

но тамто должен быть FIQ ?

А проблема решена применением следующего
CODE
__irq __arm void IRQ_Handler(void)
{
uint IVR = * AT91C_AIC_IVR;
uint SPU = * AT91C_AIC_SPU;
if(IVR!=SPU){
void (*interrupt_task)();
interrupt_task = (void(*)())IVR;
(*interrupt_task)();
}
* AT91C_AIC_EOICR = 0xFFFF;
}


При этом в панели регистров лучше не открывать AIC.

А можно -ли как-то исключить из боковой AIC_IVR
те я повторяю вопрос оставленый aaarrr без ответа:

Цитата
Цитата
убрать из окошка регистров AIC_IVR

Как это можно cделать ?

Цитата
Цитата
использовать Protect Mode

Где его включить ?
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 3 2009, 07:39
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Код
Возник наивный вопрос:
ldr PC,IRQ_Addr; IRQ
ldr PC, [PC,# -0xF20];AIC direct
но тамто должен быть FIQ ?

Точка с запятой в начале строки означает комментарий. Т.е первая строка закоментирована.

Так работают прерывания с этим стартапом или работают с любым? Или вообще без оного?


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
crack_enigma
сообщение Jul 3 2009, 07:46
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939



Да а слона( ; ) то я не заметил.

Цитата
Так работают прерывания с этим стартапом или работают с любым? Или вообще без оного?

Работают без него. Просто AIC_IVR считывается отладчиком а в EOICR при этом не чего IAR не пишет. Я понял это так. Вот и вопрос как IAR заставить не считывать энтот регистр.

Сообщение отредактировал crack_enigma - Jul 3 2009, 07:46
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 3 2009, 08:24
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



АРМ - это такая штука, с которой надо разбираться. Выбросьте отладчик. Он вам только вредит. Ей-богу.
Пока вы не прочитаете как вообще происходят прерывания и каким образом они обрабатываются - ничего хорошего не будет.

Возьмите стандартный старап и мой. И на их разнице научитесь. У меня в стартапе - ничего лишнего. Все только по делу. Правда, по моему делу.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post

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

 


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


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