Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-май-21 08:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: NVIC1
СообщениеДобавлено: 2018-мар-22 10:12 
Не в сети

Зарегистрирован: 2018-мар-20 09:55
Сообщения: 5
В контроллере К1986ВЕ9X в программе загрузчика есть обработка команды CMD_RUN, параметр - адрес таблицы векторов (прерываний). Можно ли так настроить прошивание из Keil, чтобы кроме flash в область внутренней SRAM была записана таблица векторов прерываний, а после прошивки контроллер запустился и использовал бы таблицу векторов из SRAM? Надо ли инициализировать регистр VTOR в пользовательской программе?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NVIC1
СообщениеДобавлено: 2018-мар-22 12:43 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1097
Откуда: Тула
Кажется достаточно будет добавить в startup_MDR32F9Qx.s код типа такого
Код:
; Vector Table In RAM at Address __VectRAM
                AREA    VectInRam, DATA, READWRITE, ALIGN=7
                EXPORT  __VectRAM
                EXPORT  __VectRAM_End
                EXPORT  __VectRAM_Size

__VectRAM       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     CAN1_IRQHandler            ; IRQ0
                DCD     CAN2_IRQHandler            ; IRQ1
                DCD     USB_IRQHandler             ; IRQ2
                DCD     0                          ; IRQ3  reserved
                DCD     0                          ; IRQ4  reserved
                DCD     DMA_IRQHandler             ; IRQ5
                DCD     UART1_IRQHandler           ; IRQ6
                DCD     UART2_IRQHandler           ; IRQ7
                DCD     SSP1_IRQHandler            ; IRQ8
                DCD     0                          ; IRQ9  reserved
                DCD     I2C_IRQHandler             ; IRQ10
                DCD     POWER_IRQHandler           ; IRQ11
                DCD     WWDG_IRQHandler            ; IRQ12
                DCD     0                          ; IRQ13 reserved
                DCD     Timer1_IRQHandler          ; IRQ14
                DCD     Timer2_IRQHandler          ; IRQ15
                DCD     Timer3_IRQHandler          ; IRQ16
                DCD     ADC_IRQHandler             ; IRQ17
                DCD     0                          ; IRQ18 reserved
                DCD     COMPARATOR_IRQHandler      ; IRQ19
                DCD     SSP2_IRQHandler            ; IRQ20
                DCD     0                          ; IRQ21 reserved
                DCD     0                          ; IRQ22 reserved
                DCD     0                          ; IRQ23 reserved
                DCD     0                          ; IRQ24 reserved
                DCD     0                          ; IRQ25 reserved
                DCD     0                          ; IRQ26 reserved
                DCD     BACKUP_IRQHandler          ; IRQ27
                DCD     EXT_INT1_IRQHandler        ; IRQ28
                DCD     EXT_INT2_IRQHandler        ; IRQ29
                DCD     EXT_INT3_IRQHandler        ; IRQ30
                DCD     EXT_INT4_IRQHandler        ; IRQ31
__VectRAM_End

__VectRAM_Size  EQU  __VectRAM_End - __VectRAM
и в коде программы указать
Код:
extern uint32_t __VectRAM;
__disable_irq();
SCB->VTOR = __VectRAM;
__enable_irq();

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NVIC1
СообщениеДобавлено: 2018-мар-26 16:54 
Не в сети

Зарегистрирован: 2018-мар-20 09:55
Сообщения: 5
Вот образец кода; с приходом прерывания системного таймера зажигается светодиод. Строка SCB->VTOR закомментирована и прерывание работает.
Естественно, в startup_MDR32F90Qx.s где Align=3 исправил на Align=7 и __Vectors подсвечивается как 0x20000680, а в таблице векторов как прерывание указал функцию timer0. Но стоит раскоментировать строку //SCB->VTOR= ((__Vectors)); как прерывание системного таймера не запускается. Почему? и как сделать чтоб запускалось?
#include "MDR32Fx.h"
#include "MDR32F9Qx_config.h"
#include "MDR32F9Qx_rst_clk.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_it.h"
#include "SysInit.h"
__IO uint32_t rx_buf = 0;
__IO uint32_t tx_buf = 1;

static PORT_InitTypeDef PortInit;


void LedPinGfg (void)
{
PORT_DeInit(MDR_PORTC);
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);
PortInit.PORT_Pin = PORT_Pin_1;
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_FUNC= PORT_FUNC_PORT;
PortInit.PORT_MODE= PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init(MDR_PORTC, &PortInit);
}

extern uint32_t __Vectors;

void timer0(void){
PORT_SetBits(MDR_PORTC, PORT_Pin_1);
//Tick=timer1;
}


int main(void)
{

CPU_init();
__disable_irq();

LedPinGfg ();
//SCB->VTOR= ((__Vectors));
SysTick->LOAD = 8000;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk | \
SysTick_CTRL_CLKSOURCE_Msk;

__DSB();//__DMB?

__enable_irq();
while(1)
;

}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NVIC1
СообщениеДобавлено: 2018-мар-26 17:28 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 657
Откуда: г. Санкт-Петербург
Чтобы светодиод загорался, в ячейке 0x200006bc в момент возникновения прерывания д.б. адрес функции timer0 +1.
Это можно реализовать разными способами:
1. самое быстрое перед разрешением прерываний прописать адрес функции timer0 +1 в ячейку 0x200006bc
2. если работаете в KEIL - прописать всю таблицу в виде отдельного файла и указать компилятору что ее размещение д.б. в ОЗУ.
3. самому скопировать таблицу векторов из ПЗУ(flash) в ОЗУ перед инициализацией VTOR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NVIC1
СообщениеДобавлено: 2018-мар-27 09:20 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1097
Откуда: Тула
Zkm8 писал(а):
Вот образец кода;

В следующий раз прикладывайте Listings\****.map файл в архиве - так проще разобраться.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: NVIC1
СообщениеДобавлено: 2018-мар-27 09:36 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 473
Цитата:
1. самое быстрое перед разрешением прерываний прописать адрес функции timer0 +1 в ячейку 0x200006bc

+5 коп. Не забыть поставить барьер после записи.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB