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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Sam7ex256 и UART, Не срабатывает прерывание
Brain_
сообщение Dec 14 2009, 09:03
Сообщение #16


Участник
*

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



Старт Ап нашел. Добавил прямо тот который был в
C:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation\arm\examples\Atmel\at91lib\boards\at91sam7x-ek

Только вот его добавление ни к каким результатам не привело sad.gif Все так же молчание в обработчике прерываний.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 10:45
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Так может вы его пришлете для обозрения?
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 11:28
Сообщение #18


Участник
*

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



C удовольствием smile.gif
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
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 13:55
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Первое, что в глаза бросается - в main() вы шагаете с уже разрешенными прерываниями. Все ваши прерывания настраиваются тоже в main? Тогда это очень не хорошо.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 14 2009, 16:36
Сообщение #20


Гуру
******

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



А вот религия не позволяет обучиться работе с прерываниями, например, на таймере?
Чтобы прочувствовать весь механизм? А уж после приниматься за следущий уровень?


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 17:02
Сообщение #21


Участник
*

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



Религия тут не при чем smile.gif На таймере тоже пробовал. В main же всю инициализаию и настройку прерываний я реализовываю в отдельных функциях потом из из main вызываю. В данном коде просто для наглядности запихнул прямо в main.
Может есть у кого готовый пример (работающий конкрутно для Iar 5.4, заточенный под sam7ex) рализации UART-эхо через прерывания? Буду премного благодарен если скинете на почту.
Просто тяжко как-то мне пока после AVR и MSP принимтаься за RISC процессоры sad.gif

Сообщение отредактировал Brain_ - Dec 14 2009, 17:04
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 17:19
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Заходите на http://www.atmel.com/dyn/products/tools_ca...sp?tool_id=4343. Там есть: AT91SAM7X-EK Software Package for IAR 5.2, Keil and GNU (40 MB, revision 1.5, updated 12/08). Скачайте и посмотрите, что к чему.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 14 2009, 17:30
Сообщение #23


Гуру
******

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



Цитата(Brain_ @ Dec 14 2009, 12:03) *
Все так же молчание в обработчике прерываний.

Во-первых, это -
Код
if ((status & AT91C_US_RXBUFF) == AT91C_US_RXRDY)

- исправили?

Во-вторых, как смотрите работу прерываний - по эху?
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 17:37
Сообщение #24


Участник
*

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



А обработчике я ляп исправил. Спасибо ))

Изначально я хотел сделать эхо (Вроде несложный пример и много функциональных возможносте можно попробовать потестировать) но в конечном итоге мне б хоть в обработчик этого прерывания попасть. На данный момент в обработчике инкрементируется счетчик. По кнопке я значение счетчика вывожу на LCD. Вот кроме нуля я там еще ничего не видел wink.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 14 2009, 17:52
Сообщение #25


Гуру
******

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



Хорошо, передача отдельно работает?

Мне, если честно, лень разбирать правильность вызовов многочисленных "библиотечных" процедур, поэтому проверьте, не должно ли быть написано PMC_EnablePeripheral(1UL << AT91C_ID_US0) вместо PMC_EnablePeripheral(AT91C_ID_US0) и т.п.
Еще лучше будет, если вы полностью откажетесь от их использования: вызывать "библиотку" для записи одного регистра, да еще и рискуя, как в приведенном примере, ошибиться - глупо.

P.S. Сейчас, наверное, набегут защитники "атмеловских библиотек". Не слушайте их.
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 18:13
Сообщение #26


Участник
*

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



Про все ужасы и минусы библиотечных функций я имею представление smile.gif

Пример с atmelевского сайта (точнее то что было в папке с примерами самого Iar, пока различий не нашел) я пробовал запустить. Но ничего не получилось. Это и навело меня на мысль, что где то подвох, и побудило сюда отписаться.

На мелкие ошибки типа PMC_EnablePeripheral(1UL << AT91C_ID_US0) я тоже проверял. не однократно. Завтра еще проверю для уверенности.

Передача отдельно работает. Прием отдельно тоже работает (когда я в main пишу цикл ожидания символа и потом его читаю)
Не хотят работать именно прерывания.

PS Кстати, обязательно писать 1UL вместо 1? в памяти ведь они одинаково выглядят и при логических операциях тоже?

Сообщение отредактировал Brain_ - Dec 14 2009, 18:14
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 14 2009, 18:28
Сообщение #27


Гуру
******

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



Цитата(Brain_ @ Dec 14 2009, 21:13) *
PS Кстати, обязательно писать 1UL вместо 1? в памяти ведь они одинаково выглядят и при логических операциях тоже?

Нет, привычка просто. Чтобы не получить ворнинг при сдвиге на 31.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 18:30
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы умеете зажигать/гасить LED? Если умеете, в самом начале обработчика зажгите его и остановитесь. Будет сразу понятно выходите вы на обработчик или нет.
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 18:43
Сообщение #29


Участник
*

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



У меня нету Диодов, зато есть LCD у которого можно включать и выключать подсветку. Не заходит программа в функцию прерывания... проверял.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 19:30
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Первым делом проверить правильность формирования таблицы векторов прерываний (по нужным адресам таблицы прописаны ли верные адреса обработчиков прерываний). Второе - проверить правильность инициализации AIC.
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 Текстовая версия Сейчас: 18th July 2025 - 17:48
Рейтинг@Mail.ru


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