|
LPC2368 Прерывание по совпадению таймера, помогите |
|
|
|
Jan 17 2017, 19:22
|
Группа: Участник
Сообщений: 10
Регистрация: 16-11-11
Из: Макеевка, Донецкая обл.
Пользователь №: 68 333

|
Всем здравствуйте! Помогите, пожалуйста, разобраться с прерыванием от таймера0 по совпадению. Только начал осваивать 32 разрядные микроконтроллеры. Есть отладочная плата SK-MLPC1768/2387/2368, с установленным LPC2368. Для обучения пользуюсь IAR 7.50.2.10505
main.txt ( 2.9 килобайт )
Кол-во скачиваний: 75Вставлял ловушку в бесконечном цикле и проверял 0 бит регистра T0IR. Видно что таймер входит в прерывание (бит устанавливается), но дальше действий программа никаких не выполняет, а должна быть бегущая единица. Как должна работать эта программа ясно, но почему не работает не понятно. Исходник взят из интернета, кроме настройки PLL. PLL настраивается. Проверялось. Подскажите, направьте пожалуйста!
|
|
|
|
|
 |
Ответов
|
Jan 18 2017, 08:03
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
1.Устанавливаете запрос синхронного сброса Код T0TCR = 0x00000002; но не дожидаетесь его окончания. Значит сброс у Вас реально может происходить после последующих записей конфигурации. 2.Не чистите регистр флагов запросов прерываний. 3.Неправильно рассчитываете период: Код //Регистр совпадения = 1000 (1 Гц) T0MR0 = 100; Как можно было сделать столько ошибок в такой простейшей периферии??? Читайте внимательнее юзермануал! Да и в CTCR неплохо бы соотв. значение записать. После этого смотрите появляется ли флаг активного запроса прерывания в IR? И если появляется, а входа в ISR нет - читайте про контроллер прерываний и всё что с ним связано. По контроллеру прерываний: 1.А где у Вас глобальное разрешение прерываний IRQ? (Вы ведь вроде этому прерыванию от таймера назначаете линию IRQ?) 2.А где обработчик прерывания IRQ?
|
|
|
|
|
Jan 18 2017, 08:24
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zltigo @ Jan 18 2017, 11:09)  Ну Вы и не ленивый читать галиматью написанную в силе "= 0x00000002;"  Я лично не стал. Я прочитал просто потому, что много работал с LPC-шной периферией и помню почти наизусть её, тем более таймера - почти самое простое там. Тем более они не изменились при переходе на Cortex LPC17xx/LPC43xx. Так бы да - и читать бы не стал. Цитата(zltigo @ Jan 18 2017, 11:09)  Все биты и константы должны иметь ИМЕНА. Насчёт первого (битов в конфигурационных регистрах периферии) не совсем с Вами согласен. Как правило, когда прописываешь их значения в какой-то регистр, всегда перед глазами открытая страничка с описанием этого регистра. И мне например удобнее соотносить описания полей в мануале с исходником по номерам битов, а не их именам (которых может и не быть или быть неудобными). Так что именно для битовых полей в регистрах конфигурации периферии я отступаю от этого правила, и чаще всего прописываю так: T0MCR = B0 | B1; А точнее даже так: concat(T, nTIM_nrf, MCR) = B0 | B1; ну или через указатель. Так как все назначения номеров таймеров, портов UART/SPI/... и пр. периферии у меня собраны в одном месте и нигде нет прямых ссылок на регистры периферии: Код //Распределение UART-ов #define nUART_service 3 //номер UART сервисного порта //Распределение GP-таймеров #define nTIM_cpu 0 //таймер коротких интервалов #define nTIM_intmon 1 //таймер контролЯ длительности запретов прерываний (длЯ отладки) #define nTIM_nrf 2 //таймер драйвера nRF24L01+ //Распределение SSP-портов #define nSSP_nrf 0 //nRF24L01+ где concat - это текстовая склейка : Код #define concatVOID #define concat_SUBST2(a, b, c, d, e, f, g, h, i, j, k, l, ...) \ a##b##c##d##e##f##g##h##i##j##k##l #define concat_SUBST(...) concat_SUBST2(__VA_ARGS__) #define concat(...) concat_SUBST(__VA_ARGS__, concatVOID, concatVOID, \ concatVOID, concatVOID, concatVOID, concatVOID, concatVOID, concatVOID, \ concatVOID, concatVOID)
|
|
|
|
|
Jan 18 2017, 08:43
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(jcxz @ Jan 18 2017, 10:24)  Я прочитал просто потому, что много работал с LPC-шной периферией и помню почти наизусть её, тем более таймера - почти самое простое там. Тем более они не изменились при переходе на Cortex LPC17xx/LPC43xx. Так бы да - и читать бы не стал. Я тоже работал и работаю и 34xx и 17хх тоже помню многое, но помню ИМЕНА а не "второй бит справа". Более того, что значит "второй бит справа" если и знал, то в тот краткий миг, когда его описывал. Никаких особых дополнительных наворотов в описании не использую. Внешне получается где-то так: CODE //--------------------------------------------------------------------------- void init_mrt_timers(void) { // Enable MRT clock SYSAHBCLKCTRL1 |= CTRL1_MRT; // Peripheral reset control to MRT, a "1" bring it out of reset. PRESETCTRL1 |= ( CTRL1_MRT ); PRESETCTRL1 &= ~( CTRL1_MRT );
.......
MRT_INTVAL0 = 0; MRT_INTVAL0 = MRT_INTVAL_LOAD; MRT_CTRL0 = MRT_CTRL_ONE_SHOT|MRT_CTRL_INTEN;
VIC_EnableIRQ( MRT_IRQn ); } ..... //--------------------------------------------------------------------------- void vlfx_tx_timeout_start( bint slots ) { MRT_INTVAL0 = ((((CPU_CLOCK_HZ/CC1000_BAUD)*10) + 1)*slots); MRT_INTVAL0 |= MRT_INTVAL_LOAD;
}
В случае, когда более-менее универсальный исходник планируется, тогда еще, да, можно алиасы назначить: CODE #define TsPR_SYS T1PR #define TsIR_SYS T1IR #define TsMR0_SYS T1MR0 #define TsMCR_SYS T1MCR #define TsTCR_SYS T1TCR #define TsTC_SYS T1TC #define VIC_TIMERs_SYS VIC_TIMER1
//--------------------------------------------------------------------------- static void init_systimer( bint ext_source ) { ulong compare_match;
// Tick does not require the use of the timer prescale. This is // defaulted to zero but can be used if necessary TsPR_SYS = 0; // Calculate the match value required for our wanted tick rate compare_match = CPU_CLOCK_HZ / BUS_DIVIDER / SYS_TICK_RATE_HZ; TsMR0_SYS = compare_match - 1; // Generate tick with timer compare match TsMCR_SYS = (MCR_MR0INT | MCR_MR0RES); TsTCR_SYS = 0;
if( ext_source ) { // External source } else { // Start the timer #if( configUSE_PREEMPTION == 1 ) extern void ( vPortPreemptiveTickEntry )( void ); install_irq( VIC_TIMERs_SYS, (void *)vPortPreemptiveTickEntry, VIC_SYSTEM_PRIOR, TRUE ); #else extern void ( vNonPreemptiveTick )( void ); install_irq( VIC_TIMERs_SYS, (void *)vNonPreemptiveTick, VIC_SYSTEM_PRIOR, TRUE );
#endif TsTCR_SYS = TCR_ENABLE; } }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 18 2017, 09:18
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(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 ...
|
|
|
|
Сообщений в этой теме
sasha968m LPC2368 Прерывание по совпадению таймера, помогите Jan 17 2017, 19:22     zltigo Цитата(jcxz @ Jan 18 2017, 11:18) Мой вар... Jan 18 2017, 09:49      jcxz Цитата(zltigo @ Jan 18 2017, 12:49) А для... Jan 20 2017, 11:40       zltigo Цитата(jcxz @ Jan 20 2017, 13:40) о чём В... Jan 20 2017, 11:49 sasha968m Цитата(jcxz @ Jan 18 2017, 11:03) 1.Устан... Jan 18 2017, 11:24 zltigo Цитата(sasha968m @ Jan 18 2017, 13:24) Пр... Jan 18 2017, 11:31  sasha968m Цитата(zltigo @ Jan 18 2017, 14:31) Это н... Jan 18 2017, 11:51   zltigo Цитата(sasha968m @ Jan 18 2017, 13:51) Да... Jan 18 2017, 17:14 jcxz Цитата(sasha968m @ Jan 18 2017, 14:24) jc... Jan 18 2017, 19:49 sasha968m zltigo, спасибо! Уже скачал.
Проект мой получи... Jan 18 2017, 19:24 sasha968m
Я, кажется, понял. Выставил в первый бит 1, дожда... Jan 18 2017, 20:38 jcxz Цитата(sasha968m @ Jan 18 2017, 23:38) Я,... Jan 19 2017, 08:19 sasha968m Понял, благодарю. Jan 19 2017, 10:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|