|
AT91SAM9260, Помогите с прерываниями |
|
|
|
Jul 1 2009, 07:41
|
Участник

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

|
Всем привет.
Разбираюсь с прерываниями мк AT91SAM9260 IRQ1 и IRQ2. Прошу просто пример кода где они настраиваются и разрешаются. Среда IAR. Язык С.
|
|
|
|
|
Jul 1 2009, 12:01
|
Участник

Группа: Участник
Сообщений: 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); }
|
|
|
|
|
Jul 1 2009, 12:15
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата импульсы на входе порта за счёт подтягивающих резисторов Вы уверены, что они физически есть? Pull-down снаружи присутствует? Цитата *rgIECR = 0xFFFFFFFF;// AIC_IECR Не стоит включать все подряд. И способ несколько странный - вместо использования многочисленных указателей можно просто написать *AT91C_AIC_IECR = (1UL << AT91C_ID_IRQ1) | (1UL << AT91C_ID_IRQ2); Далее - куда Вы хотите попасть, и что написано в стартапе?
|
|
|
|
|
Jul 1 2009, 12:26
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 2 2009, 04:27
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 2 2009, 04:52
|

Гуру
     
Группа: Участник
Сообщений: 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)
|
|
|
|
|
Jul 2 2009, 05:38
|
Участник

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

|
Цитата Поставьте вот это
Код ldr PC, [PC,# -0xF20] ;AIC direct А где стартап то лежит? примеры его видел. Но к C++ проекту он подрубается сам.
|
|
|
|
|
Jul 2 2009, 09:11
|
Участник

Группа: Участник
Сообщений: 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 и там то он не оказывается.
|
|
|
|
|
Jul 2 2009, 10:49
|

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

|
Так включите. Extern C - не знаю что это. Включите в проект вот этот стартап. Он берет вектора прерываний прямо из AIC. Убедитесь, что в линкерном файле достаточно стека под все прерывания. Этот стартап работает исключительно при загрузке в память с адреса 30 0000. Т.е. в неремапленную срам. И сам ее ремапит. Т.е. из флэшки этот стартап запускать нельзя.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Jul 3 2009, 05:58
|
Участник

Группа: Участник
Сообщений: 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 Где его включить ?
|
|
|
|
|
Jul 3 2009, 07:46
|
Участник

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

|
Да а слона( ; ) то я не заметил. Цитата Так работают прерывания с этим стартапом или работают с любым? Или вообще без оного? Работают без него. Просто AIC_IVR считывается отладчиком а в EOICR при этом не чего IAR не пишет. Я понял это так. Вот и вопрос как IAR заставить не считывать энтот регистр.
Сообщение отредактировал crack_enigma - Jul 3 2009, 07:46
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|