|
|
  |
Sam7ex256 и UART, Не срабатывает прерывание |
|
|
|
Dec 14 2009, 09:03
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887

|
Старт Ап нашел. Добавил прямо тот который был в C:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation\arm\examples\Atmel\at91lib\boards\at91sam7x-ek Только вот его добавление ни к каким результатам не привело  Все так же молчание в обработчике прерываний.
|
|
|
|
|
Dec 14 2009, 11:28
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887

|
C удовольствием  CODE /* IAR startup file for AT91SAM7X microcontrollers. */
MODULE ?cstartup
;; Forward declaration of sections. SECTION IRQ_STACK:DATA:NOROOT(2) SECTION CSTACK:DATA:NOROOT(3)
//------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------
#define __ASSEMBLY__ #include "board.h"
//------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------
#define ARM_MODE_ABT 0x17 #define ARM_MODE_FIQ 0x11 #define ARM_MODE_IRQ 0x12 #define ARM_MODE_SVC 0x13 #define ARM_MODE_SYS 0x1F
#define I_BIT 0x80 #define F_BIT 0x40
//------------------------------------------------------------------------------ // Startup routine //------------------------------------------------------------------------------
/* Exception vectors */ SECTION .vectors:CODE:NOROOT(2)
PUBLIC resetVector PUBLIC irqHandler
EXTERN Undefined_Handler EXTERN SWI_Handler EXTERN Prefetch_Handler EXTERN Abort_Handler EXTERN FIQ_Handler
ARM
__iar_init$$done: ; The interrupt vector is not needed ; until after copy initialization is done
resetVector: ; All default exception handlers (except reset) are ; defined as weak symbol definitions. ; If a handler is defined by the application it will take precedence. LDR pc, =resetHandler ; Reset LDR pc, Undefined_Addr ; Undefined instructions LDR pc, SWI_Addr ; Software interrupt (SWI/SYS) LDR pc, Prefetch_Addr ; Prefetch abort LDR pc, Abort_Addr ; Data abort B . ; RESERVED LDR pc, =irqHandler ; IRQ LDR pc, FIQ_Addr ; FIQ
Undefined_Addr: DCD Undefined_Handler SWI_Addr: DCD SWI_Handler Prefetch_Addr: DCD Prefetch_Handler Abort_Addr: DCD Abort_Handler FIQ_Addr: DCD FIQ_Handler /* Handles incoming interrupt requests by branching to the corresponding handler, as defined in the AIC. Supports interrupt nesting. */ irqHandler: /* Save interrupt context on the stack to allow nesting */ SUB lr, lr, #4 STMFD sp!, {lr} MRS lr, SPSR STMFD sp!, {r0, lr}
/* Write in the IVR to support Protect Mode */ LDR lr, =AT91C_BASE_AIC LDR r0, [r14, #AIC_IVR] STR lr, [r14, #AIC_IVR]
/* Branch to interrupt handler in Supervisor mode */ MSR CPSR_c, #ARM_MODE_SYS STMFD sp!, {r1-r3, r4, r12, lr} MOV lr, pc BX r0 LDMIA sp!, {r1-r3, r4, r12, lr} MSR CPSR_c, #ARM_MODE_IRQ | I_BIT
/* Acknowledge interrupt */ LDR lr, =AT91C_BASE_AIC STR lr, [r14, #AIC_EOICR]
/* Restore interrupt context and branch back to calling code */ LDMIA sp!, {r0, lr} MSR SPSR_cxsf, lr LDMIA sp!, {pc}^
/* After a reset, execution starts here, the mode is ARM, supervisor with interrupts disabled. Initializes the chip and branches to the main() function. */ SECTION .cstartup:CODE:NOROOT(2)
PUBLIC resetHandler EXTERN LowLevelInit EXTERN ?main REQUIRE resetVector ARM
resetHandler:
/* Set pc to actual code location (i.e. not in remap zone) */ LDR pc, =label
/* Perform low-level initialization of the chip using LowLevelInit() */ label: LDR r0, =LowLevelInit LDR r4, =SFE(CSTACK) MOV sp, r4 MOV lr, pc BX r0
/* Set up the interrupt stack pointer. */ MSR cpsr_c, #ARM_MODE_IRQ | I_BIT | F_BIT ; Change the mode LDR sp, =SFE(IRQ_STACK)
/* Set up the SYS stack pointer. */ MSR cpsr_c, #ARM_MODE_SYS | F_BIT ; Change the mode LDR sp, =SFE(CSTACK)
/* Branch to main() */ LDR r0, =?main MOV lr, pc BX r0
/* Loop indefinitely when program is finished */ loop4: B loop4
END
|
|
|
|
|
Dec 14 2009, 17:02
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887

|
Религия тут не при чем  На таймере тоже пробовал. В main же всю инициализаию и настройку прерываний я реализовываю в отдельных функциях потом из из main вызываю. В данном коде просто для наглядности запихнул прямо в main. Может есть у кого готовый пример (работающий конкрутно для Iar 5.4, заточенный под sam7ex) рализации UART-эхо через прерывания? Буду премного благодарен если скинете на почту. Просто тяжко как-то мне пока после AVR и MSP принимтаься за RISC процессоры
Сообщение отредактировал Brain_ - Dec 14 2009, 17:04
|
|
|
|
|
Dec 14 2009, 17:30
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Brain_ @ Dec 14 2009, 12:03)  Все так же молчание в обработчике прерываний. Во-первых, это - Код if ((status & AT91C_US_RXBUFF) == AT91C_US_RXRDY) - исправили? Во-вторых, как смотрите работу прерываний - по эху?
|
|
|
|
|
Dec 14 2009, 17:52
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Хорошо, передача отдельно работает?
Мне, если честно, лень разбирать правильность вызовов многочисленных "библиотечных" процедур, поэтому проверьте, не должно ли быть написано PMC_EnablePeripheral(1UL << AT91C_ID_US0) вместо PMC_EnablePeripheral(AT91C_ID_US0) и т.п. Еще лучше будет, если вы полностью откажетесь от их использования: вызывать "библиотку" для записи одного регистра, да еще и рискуя, как в приведенном примере, ошибиться - глупо.
P.S. Сейчас, наверное, набегут защитники "атмеловских библиотек". Не слушайте их.
|
|
|
|
|
Dec 14 2009, 18:13
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887

|
Про все ужасы и минусы библиотечных функций я имею представление  Пример с atmelевского сайта (точнее то что было в папке с примерами самого Iar, пока различий не нашел) я пробовал запустить. Но ничего не получилось. Это и навело меня на мысль, что где то подвох, и побудило сюда отписаться. На мелкие ошибки типа PMC_EnablePeripheral(1UL << AT91C_ID_US0) я тоже проверял. не однократно. Завтра еще проверю для уверенности. Передача отдельно работает. Прием отдельно тоже работает (когда я в main пишу цикл ожидания символа и потом его читаю) Не хотят работать именно прерывания. PS Кстати, обязательно писать 1UL вместо 1? в памяти ведь они одинаково выглядят и при логических операциях тоже?
Сообщение отредактировал Brain_ - Dec 14 2009, 18:14
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|