Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания STR730FZ2T7
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Mustik
Добрый день.
Купил кит STR730-STK.
Вроде все понятно, вот возник вопрос на счет прерываний.
Буду рассказывать на примере прерывания от CAN0.
Как я понимаю, в конфигурационном файле CAN0IRQHandler содержит адрес функции void CAN0_IRQHandler (void) и ниже приведенный код настраивает прерывания:
CODE
LDR R0, =EIC_BASE
LDR R1, =0xE59F0000 ; LDR PC,[PC,#ofs] (High 16-bits)
STR R1, [R0, #IVR_OFS] ; Store into IVR[31:16]
LDR R1, =PRCCUCMU_Addr ; IRQ Address Table
LDR R2, =0x0FFF ; Offset Mask
AND R1, R1, R2 ; Mask Offset
LDR R2, =0xF3E0 ; Jump Offset = 0x03E0
; 0xFXXX is used to complete the
; LDR PC,[PC,#ofs]
; 0x03E0 = 0x03E8 - 8 (Prefetch)
; 0 = IVR Address + 0x3E8
ADD R1, R1, R2 ; Add Jump Offset
MOV R2, #64 ; Number of Channels
MOV R3, #SIR0_OFS ; Offset to SIR0
EIC_Loop MOV R4, R1, LSL #16 ; Use High 16-bits
STR R4, [R0, R3] ; Store into SIRx
ADD R1, R1, #4 ; Next IRQ Address
ADD R3, R3, #4 ; Next SIRx
SUBS R2, R2, #1 ; Decrement Counter
BNE EIC_Loop

У меня есть моя функция, допустим, void CAN0_IRQ (void). Как мне настроить прерывание, чтобы оно заходило в мою функцию.
scifi
Насколько я понимаю, свою функцию обработки прерывания следует назвать CAN0_IRQHandler(). Если линкер будет ругаться, что функция определена в двух местах, то найти закомментировать не свою функцию.
Mustik
Ну это понятно.
А вот, если я хочу создать свою функцию, как мне записывать в регистры её адрес что-ли, чтобы прерывание вызвало именно мою функцию?

Two registers are involved to supply the channel interrupt vector data to the EIC controller
(IVR[31:16] and SIR52[31:16]:
● Write in SIR52[31:16], i.e. in the upper part of the SIR register related to channel #52,
the memory address offset (or the jump offset) where the Interrupt Service Routine,
related to interrupt channel #7, starts.
● Insert the base jump address (or the jump opcode) in the most significant half of the
IVR register, i.e. IVR[31:16].

Я с ассемблером особо не дружу, знакомлюсь, для меня работа с базовыми адресами и сдвигами еще тяжеловата. Вроде и понятно, но тут же путаюсь.
Расскажите в двух словах, что от меня требуют.
scifi
Цитата(Mustik @ Oct 25 2011, 14:54) *
А вот, если я хочу создать свою функцию, как мне записывать в регистры её адрес что-ли, чтобы прерывание вызвало именно мою функцию?

Именно. Нужно программировать регистры контроллера прерываний. Код инициализации в программах-примерах делает и это в числе прочего.
В семействе STR7xx контроллер прерываний мудрёно-кривоватый. Да и само семейство уже умерло, если не ошибаюсь.
Кстати, всё это написано в мануале на МК. Пересказывать его не буду, неблагодарное это занятие.
Mustik
Цитата(scifi @ Oct 25 2011, 15:52) *
Именно. Нужно программировать регистры контроллера прерываний. Код инициализации в программах-примерах делает и это в числе прочего.
В семействе STR7xx контроллер прерываний мудрёно-кривоватый. Да и само семейство уже умерло, если не ошибаюсь.
Кстати, всё это написано в мануале на МК. Пересказывать его не буду, неблагодарное это занятие.

Если бы я понял, что они пишут в мануале, я бы и не создавал тему здесь.
Может кто-нибудь помочь?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.