Цитата(zltigo @ Jan 18 2017, 11:43)
#define TsPR_SYS T1PR
#define TsIR_SYS T1IR
Мой вариант лучше, так как:
1. Короче - всего по одной строчке на каждый экземпляр периферии.
2. Позволяет связывать данным именем не только регистры периферии, но и биты в регистрах NVIC, регистрах разрешения тактирования периферии, адрес вектора прерывания.
Т.е. - я могу просто всего
в одном месте изменить номера
Код
#define nTIM_cpu 0 //таймер коротких интервалов
#define nTIM_intmon 1 //таймер контролЯ длительности запретов прерываний (длЯ отладки)
#define nTIM_nrf 2 //таймер драйвера nRF24L01+
скажем на:
Код
#define nTIM_cpu 2 //таймер коротких интервалов
#define nTIM_intmon 0 //таймер контролЯ длительности запретов прерываний (длЯ отладки)
#define nTIM_nrf 1 //таймер драйвера nRF24L01+
и всё! Больше ничего в исходнике ни в одном месте трогать не надо - все конфигурирования битов в регистрах NVIC, регистрах SYSCFG.PCONP и вектора прерывания переедут на новые места соответствующие новому распределению периферии.
Типичный инит таймера у меня выглядит примерно так:
CODE
PeripheralPowerOn(concat(PERIPH_PCTIM, nTIM_nrf)); //устанавливает нужный бит SYSCFG.PCONP
volatile HwRegsTIMER *p = &concat(TIMER, nTIM_nrf);
p->TCR = B1;
p->TC = p->PC = p->PR = p->CCR = p->CTCR = 0;
p->MCR = B0 | B1 | B2;
p->IR = p->IR;
IntClrEna(concat(NVIC_TIMER, nTIM_nrf)); //чистит нужный бит регистре активных запросов прерываний и устанавливает такой же бит в маске разрешения прерываний
Таблица назначения приоритетов INT-ов:
Код
static u8 const priority[] = { //список INT-ов по убыванию приоритетов
concat(NVIC_TIMER, nTIM_intmon), 0,
NVIC_ETHERNET, NVIC_GPDMA, concat(NVIC_SSP, nSSP_nrf),
concat(NVIC_TIMER, nTIM_nrf), 0,
concat(NVIC_UART, nUART_service), 0, 0
};
Фрагмент asm-файла описания таблицы векторов прерываний:
CODE
...
#define mapUART (1 << nUART_service)
#define mapSSP (1 << nSSP_nrf)
#define mapTIMER (1 << nTIM_intmon | 1 << nTIM_nrf)
isrPort MACRO port, portClass
IF map\2 & 1 << \1
EXTERN isr\2\1
DCD isr\2\1
ELSE
DCD DefaultISR
ENDIF
ENDM
...
SECTION .intvecTail:CONST:NOROOT(2)
DATA ;Продолжение таблицы прерываний
__vector_table_tail
DCD isrSVC ;SVCall Handler
DCD DefaultISR ;Debug Monitor Handler
DCD 0 ;Reserved
DCD OS_CPU_PendSVHandler ;PendSV Handler
DCD isrSysTick ;SysTick Handler
DCD isrWDT ;Watchdog timer
isrPort 0, TIMER ;Match 0 - 1 (MR0, MR1), Capture 0 - 1 (CR0, CR1)
isrPort 1, TIMER ;Match 0 - 2 (MR0, MR1, MR2), Capture 0 - 1 (CR0, CR1)
isrPort 2, TIMER ;Match 0-3, Capture 0-1
isrPort 3, TIMER ;Match 0-3, Capture 0-1
isrPort 0, UART ;UART0
isrPort 1, UART ;UART1
isrPort 2, UART ;UART2
isrPort 3, UART ;UART3
...