Diablo
Участник-
Постов
14 -
Зарегистрирован
-
Посещение
Репутация
0 Обычный-
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
Я тоже точно не знаю, но по моему переотображается вся таблица векторов исключительных ситуация с 0x0 по 0x1C и пусть меня тоже поправят гуру если я не прав. -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
To mempfis_ Спасибо огромное, обязательно попробую этот пример. Что касается книги, то сам начал её недавно читать, очень доступно написано, кстати есть уже и на русском языке. To esaulenka Пробовал, проекты отличались только стартапом. Переносил недостающие части и Кейловского файла в свой, но увы... И вы совершенно правы :) Сегодня посмотрел JTAGом содержимое регистров после рестарта микроконтроллера. Значение MEMMAP = 3, т.е. режим использование внешней памяти, после записи в него 1 программа продолжает работу. Только мне в связи с этим непонятен один момент, если сразу после рестарта происходит ремап векторов во внешнюю память, то почему без проблем выполняется программа без использования прерываний? -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
Keil вообще намного проще для освоения для новичка, как мне кажется. Но ничего не поделаешь, надо пользоваться IARом :) -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
Вот пожалуйста :) __irq __arm void irq_handler(void) { void (*interrupt_function)(); unsigned int vector; vector = VICVectAddr; // Get interrupt vector. interrupt_function = (void(*)())vector; (*interrupt_function)(); // Call vectored interrupt function. VICVectAddr = 0; // Clear interrupt in VIC. } Насчет MEMMAP не знаю, надо будет посмотреть. Другое прерывание пробовал, та же история. А почему 0x40002FFF? В доках на микроконтроллер 0x40003FFF верхняя граница. -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
Посмотрел я сегодня что и как располагается в памяти и вроде бы всё на своих местах. Вот таблица исключительных ситуаций, начинается как ей и положено с 0 адреса 0x0: 0xe59ff018 LDR PC, [PC, #0x18] ; [0x20] ?cstartup 0x4: 0xeafffffe B 0x4 0x8: 0xeafffffe B 0x8 0xc: 0xeafffffe B 0xc FIQ_MODE: USR_MODE: 0x10: 0xeafffffe B FIQ_MODE ; 0x10 __vector_0x14: 0x14: 0xa3202fc0 [ARM instr] 0x18: 0xe59ff018 LDR PC, [PC, #0x18] ; [0x38] irq_handler 0x1c: 0xe59ff018 LDR PC, [PC, #0x18] ; [0x3c] fiq_handler 0x20: 0x00000284 ANDEQ R0, R0, R4, LSL #5 0x24: 0x00000000 ANDEQ R0, R0, R0 0x28: 0x00000000 ANDEQ R0, R0, R0 0x2c: 0x00000000 ANDEQ R0, R0, R0 0x30: 0x00000000 ANDEQ R0, R0, R0 0x34: 0x00000000 ANDEQ R0, R0, R0 0x38: 0x00000080 ANDEQ R0, R0, R0, LSL #1 0x3c: 0x000000b8 STRHEQ R0, [R0], -R8 После рестарта выполняем инструкцию PC, [PC, #0x18], т.е загружаем в PC значение, находящееся по адресу 0х20. При возникновении прерывания переходим к выполнению функции по адресу 0х80. По 284 адресу у меня находится startup, а по 80 функция-обработчик прерывания __irq __arm void irq_handler(void) { irq_handler: 0x80: 0xe24ee004 SUB LR, LR, #4 0x84: 0xe92d503f PUSH {R0-R5, R12, LR} vector = VICVectAddr; // Get interrupt vector. ..... ?cstartup: __iar_program_start: 0x284: 0xe59f0084 LDR R0, _?0 ; MAMCR ldr r1,=MAMTIM 0x288: 0xe59f1084 LDR R1, _?1 ; MAMTIM ldr r2,=0 ..... Сравнивал дизассемблированный код, работающий под JTAG и файл прошивки, который заливал Flash Magic-ом и они совпадают. Поправьте меня пожалуйста если я что неправильно сказал, все-таки я совсем новичок в этом деле. Не может же быть чтобы все было правильно, но программа не работала. -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
А можете в двух словах объяснить как это сделать или дать ссылку на документацию по Flash Magic? Просто никогда им не пользовался :) И ещё, такое "непонятное" поведение микроконтроллера наблюдается только тогда, когда включаю обработку прерываний, если их убрать, то прошивка грузится и работает. Если же добавить код хотя бы инициализации VIC, то работать перестаёт. Т.е если бы контроллер попадал в бут или была бы неправильная КС, то прошивка не работала бы в обоих случаях. Или я не прав? -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
Что-то я вообще ничего не понимаю! Зашил сегодня программу через JTAG и проследил выполнение по шагам - всё работает как надо. Но стоит только отключить JTAG и перезагрузить МК, программа работать перестаёт. Такое ощущение, что управление пользовательской программе не передаётся. Возможно задам глупый вопрос, но можно ли через JTAG посмотреть, куда попадает программа сразу после сброса? -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
Отображение векторов производится на Flash Что касается удаления startup из проекта, то изначально его там и не было. Подставить решил, когда начал проверять работу прерываний, но эффекта все равно никакого нет. -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
Вот код основной программы int main (void) { // System initialization, this will map the exception vectors. LPC2294SystemInit(); // Set up peripheral registers. LPC2294InitPIO(); // First disable interrupts. __disable_interrupt(); // Setup interrupt controller. LPC2294InitVIC(); LPC2294InitTimerInterrupt(TimerBeat); // Periodic timer initialization. LPC2294InitTimer(); // Enable interrupts. __enable_interrupt(); // Start periodic timer. LPC2294StartTimer(); // Loop forever. for (;;) { LPC2294LedSet(); Sleep(200); // Display for 65 ms. LPC2294LedClear(); Sleep(200); // Display for 65 ms. } } Вот, что касается обработки прерываний static void (*timer_function)(void); static void TimerInterrupt(void) { (*timer_function)(); // Call timer callback function. T0IR = 0xff; // Clear timer 0 interrupt line. } __irq __arm void irq_handler(void) { void (*interrupt_function)(); unsigned int vector; vector = VICVectAddr; // Get interrupt vector. interrupt_function = (void(*)())vector; (*interrupt_function)(); // Call vectored interrupt function. VICVectAddr = 0; // Clear interrupt in VIC. } void LPC2294InitVIC() { // Setup interrupt controller. VICProtection = 0; // Disable all interrupts VICIntEnClear = 0xffffffff; VICDefVectAddr = (unsigned int)&DefDummyInterrupt; } void LPC2294InitTimerInterrupt(void(*timer_func)()) { // Setup timer callback function. timer_function = timer_func; VICIntSelect &= ~VIC_TIMER0_bit; // IRQ on timer 0 line. VICVectAddr1 = (unsigned int)&TimerInterrupt; VICVectCntl1 = 0x20 | VIC_TIMER0; // Enable vector interrupt for timer 0. VICIntEnable = VIC_TIMER0_bit; // Enable timer 0 interrupt. } static volatile int ms_ctr = 0; // Timer interrupt callback void TimerBeat(void) { // Called at 1000 Hz rate. ms_ctr++; // Sleep counter. } void Sleep(int milliseconds) { while (ms_ctr < milliseconds) ; ms_ctr = 0; } Файл конфигурации линкера /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x00000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x00000080; define symbol __ICFEDIT_region_ROM_end__ = 0x0003FDFF; define symbol __ICFEDIT_region_RAM_start__ = 0x40000040; define symbol __ICFEDIT_region_RAM_end__ = 0x40003FDF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x2000; define symbol __ICFEDIT_size_svcstack__ = 0x10; define symbol __ICFEDIT_size_irqstack__ = 0x100; define symbol __ICFEDIT_size_fiqstack__ = 0x0; define symbol __ICFEDIT_size_undstack__ = 0x0; define symbol __ICFEDIT_size_abtstack__ = 0x0; define symbol __ICFEDIT_size_heap__ = 0x1000; /**** End of ICF editor section. ###ICF###*/ define symbol __CRP_start__ = 0x000001FC; define symbol __CRP_end__ = 0x00000204;/*0x000001FF*/ /* Memory used by RealMonitor*/ define symbol __RM_start__ = 0x40000040; define symbol __RM_end__ = 0x4000011F; define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__] - mem:[from __CRP_start__ to __CRP_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__] - mem:[from __RM_start__ to __RM_end__]; define region CRP_region = mem:[from __CRP_start__ to __CRP_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; do not initialize { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, block UND_STACK, block ABT_STACK, block HEAP }; place in CRP_region { section .crp }; Файл startup.s ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Part one of the system initialization code, ;; contains low-level ;; initialization. ;; ;; Copyright 2006 IAR Systems. All rights reserved. ;; ;; $Revision: 47021 $ ;; MODULE ?cstartup ;; Forward declaration of sections. SECTION IRQ_STACK:DATA:NOROOT(3) SECTION FIQ_STACK:DATA:NOROOT(3) SECTION ABT_STACK:DATA:NOROOT(3) SECTION SVC_STACK:DATA:NOROOT(3) SECTION UND_STACK:DATA:NOROOT(3) SECTION CSTACK:DATA:NOROOT(3) ; ; The module in this file are included in the libraries, and may be ; replaced by any user-defined modules that define the PUBLIC symbol ; __iar_program_start or a user defined start symbol. ; ; To override the cstartup defined in the library, simply add your ; modified version to the workbench project. SECTION .intvec:CODE:NOROOT(2) PUBLIC __vector PUBLIC __vector_0x14 PUBLIC __iar_program_start EXTERN irq_handler,fiq_handler ARM __vector: ;; ldr pc,[pc,#+24] ;; Reset B . ;; Undefined instructions B . ;; Software interrupt (SWI/SVC) B . ;; Prefetch abort B . ;; Data abort __vector_0x14: DC32 0 ;; RESERVED ldr pc,[pc,#+24] ;; IRQ ldr pc,[pc,#+24] ;; FIQ DC32 __iar_program_start ;; Reset DC32 0 ;; Undefined instructions DC32 0 ;; Software interrupt (SWI/SVC) DC32 0 ;; Prefetch abort DC32 0 ;; Data abort DC32 0 ;; RESERVED DC32 irq_handler ;; IRQ DC32 fiq_handler ;; FIQ ; -------------------------------------------------- ; ?cstartup -- low-level system initialization code. ; ; After a reser execution starts here, the mode is ARM, supervisor ; with interrupts disabled. ; SECTION .text:CODE:NOROOT(2) ; PUBLIC ?cstartup EXTERN ?main REQUIRE __vector ARM __iar_program_start: ?cstartup: ; ; Add initialization needed before setup of stackpointers here. ; ; LPC2148 Errata ; Date: August 5, 2005 ; Document Release: Version 1.0 ; Device Affected: LPC2148 ; Incorrect read of data from SRAM after Reset and MAM is not enabled or partially enabled MAM.1 ; Init MAM before acsses to SRAM MAMCR DEFINE 0xE01FC000 ; MAM Control Register MAMTIM DEFINE 0xE01FC004 ; MAM Timing register ldr r0,=MAMCR ldr r1,=MAMTIM ldr r2,=0 str r2,[r0] ldr r2,=7 str r2,[r1] ldr r2,=2 str r2,[r0] ; ; Initialize the stack pointers. ; The pattern below can be used for any of the exception stacks: ; FIQ, IRQ, SVC, ABT, UND, SYS. ; The USR mode uses the same stack as SYS. ; The stack segments must be defined in the linker command file, ; and be declared above. ; ; -------------------- ; Mode, correspords to bits 0-5 in CPSR MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR USR_MODE DEFINE 0x10 ; User mode FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode IRQ_MODE DEFINE 0x12 ; Interrupt Request mode SVC_MODE DEFINE 0x13 ; Supervisor mode ABT_MODE DEFINE 0x17 ; Abort mode UND_MODE DEFINE 0x1B ; Undefined Instruction mode SYS_MODE DEFINE 0x1F ; System mode mrs r0,cpsr ; Original PSR value bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#SVC_MODE ; Set Supervisor mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(SVC_STACK) ; End of SVC_STACK bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#ABT_MODE ; Set Abort mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(ABT_STACK) ; End of ABT_STACK bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#UND_MODE ; Set Undefined mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(UND_STACK) ; End of UND_STACK bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#FIQ_MODE ; Set FIR mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(FIQ_STACK) ; End of FIR_STACK bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#IRQ_MODE ; Set IRQ mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(IRQ_STACK) ; End of IRQ_STACK bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#SYS_MODE ; Set System mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(CSTACK) ; End of CSTACK #ifdef __ARMVFP__ ; Enable the VFP coprocessor. mov r0, #0x40000000 ; Set EN bit in VFP fmxr fpexc, r0 ; FPEXC, clear others. ; Disable underflow exceptions by setting flush to zero mode. ; For full IEEE 754 underflow compliance this code should be removed ; and the appropriate exception handler installed. mov r0, #0x01000000 ; Set FZ bit in VFP fmxr fpscr, r0 ; FPSCR, clear others. #endif ; Add more initialization here ; Continue to ?main for more IAR specific system startup ldr r0,=?main bx r0 #ifndef __RAM_DEBUG SECTION .crp:CODE:ROOT(2) DATA /* Code Read Protection CRP 0x87654321 - Read Memory is disabled. - Write to RAM is disabled. - Go command is disabled. - Copy RAM to Flash is disabled. - JTAG is disabled. */ DCD 0xFFFFFFFF #endif END -
LPC2294 + IAR + Прерывания
Diablo ответил Diablo тема в ARM, 32bit
Собственно это я и сделал в первую очередь, весь код взят из примеров IARа, но в итоге прошивка работать не хочет. -
LPC2294 + IAR + Прерывания
Diablo опубликовал тема в ARM, 32bit
Добрый вечер! Решил разобраться с работой прерываний на МК LPC 2294. Начал с самого простого - взял готовый пример поставляемый вместе со средой разработки, но он к сожалению оказался нерабочим. Выяснилось, что не работают прерывания, т.к. если убрать обработчики прерываний и формировать задержку простым счетом , то пример работает. В связи с этим у меня возникли несколько вопросов: 1) Почему не работают прерывания, в чем может быть причина? 2) Может быть что-то неправильно проинициализировано (не инициализировано вообще) для обработки прерываний в файле startup.s? 3) Можно ли обойтись в проекте без файла startup.s. (вопрос возник т.к. в прилагаемом проекте он отсутствовал). Возможно при сборке проекта прилинковывается стандартный файл в каталоге со средой, но подходит ли он для моего процессора? Насколько мне известно, в файле startup.s находится таблица векторов исключительных ситуаций и в нем же производится инициализация указателей стек для различных режимов работы, настройка какой-либо периферии (опционально), ну и передача управления функции main. Вместо файла начальной инициализации в настройках проекта указан файл с расширением *.icf (Linker configuration file), в котором указано расположение векторов исключительных ситуаций и размеры стеков. Может ли этот файл заменить startup код или же придется писать его ручками? 4) Если нет, то где можно подчерпнуть информацию по его написанию? В Keil всё очень просто и структура файла довольно понятна, да и в книге Тревора Мартина все подробно описано, а вот в IAR мне не совсем понятно как это делается. Заранее благодарю за ответ P.S. В качестве среды разработки используется IAR EWARM -
LPC2294 + IAR + Прерывания
Diablo опубликовал тема в ARM, 32bit
Добрый вечер! Решил разобраться с работой прерываний на МК LPC 2294. Начал с самого простого - взял готовый Не работают прерывания от таймера, да и думаю, что вообще обработка прерываний не работает. Имеется микроконтроллер LPC2294 и среда IAR EWARM. Имеется пример к этому микроконтроллеру, поставляемый со средой разработки В примере используются прерывания от таймера для формирования задержки. Шьём пример в память МК - не работает. Если убрать прерывания и формировать задержку простым счетом, то пример работает. Но работает если режим процессора установлен как THUMB в настройках проекта. 1) Почему не работают прерывания, в чем может быть причина? 2) Почему запускается программа только в режиме THUMB. 3) Может быть что-то неправильно проинициализировано (не инициализировано вообще) для обработки прерываний? 4) Можно ли обойтись в проекте без файла startup.s. (вопрос возник т.к. в прилагаемом проекте он отсутствовал). Возможно при сборке проекта прилинковывается стандартный файл в каталоге со средой, но подходит ли он для моего процессора? Насколько мне известно, в файле startup.s находится таблица векторов исключительных ситуаций и в нем же производится инициализация указателей стек для различных режимов работы, настройка какой-либо периферии (опционально), ну и передача управления функции main. Вместо файла начальной инициализации в настройках проекта указан файл с расширением *.icf (Linker configuration file), в котором указано расположение векторов исключительных ситуаций и размеры стеков. Может ли этот файл заменить startup код или же придется писаьт его ручками? 5) Если нет, то где можно подчерпнуть информацию по его написанию? В Keil всё очень просто и структура файла довольно понятна, да и в книге Тревора Мартина все подробно описано, а вот в IAR мне не совсем понятно. -
PhyCore-LPC2292/94 + IAR + JLink
Diablo ответил Diablo тема в ARM, 32bit
1) Отладчик отключаю от платы, перезапускаю и ничего не работает. Программу записываю во Flash 2) Дело не в том, что я вообще не могу получить .HEX файл. Я получаю этот файл, записываю его во Flash, но программа не работает. 3) Да я установил Keil uVision версии 4, выбрал в настройках JLink, но получил сообщение о том, что JLink предназначен только для работы в среде IAR. -
PhyCore-LPC2292/94 + IAR + JLink
Diablo опубликовал тема в ARM, 32bit
Добрый день! В моем распоряжении имеется отладочная плата PhyCore для микроконтроллера LPC2294, две среды разработки Keil uVision 3 (в комплекте с платой ) и IAR EWARM 6.30 и JLink. При работе с IAR возникли следующие проблемы: 1) Имеется простейший код мигания светодиодом без прерываний от таймера и прочего. Данный пример записывается во Flash микроконтроллера через JLink и программа работает, но стоит отключить JLink от платы и перезагрузить её программа работать перестаёт. В чем здесь может быть причина? 2) Всё в той же среде IAR не могу создать полноценный рабочий .HEX файл с прошивкой, чтобы можно было записывать во Flash при помощи утилиты LPC2000 Flash Utility. P.S. В Keil uVision аналогичный код работает прекрасно, т.е. на выходе я получаю рабочий .HEX файл, работу Keil и JLink не проверял, так как не смог подружить их друг с другом. В деле программирования микроконтроллеров я совсем новичок, поэтому прошу помощи. В чем может быть проблема? Что можете посоветовать для её решения? Заранее благодарю всех за ответы!