|
Ликбез, вопрос к "отцам" |
|
|
|
Nov 16 2006, 10:02
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
Только начинаю работать с микроконтроллерами, объясните, пожалуйста, как зашить написанную прогу в камень, что бы получить нормально работающий прошитый проц. Писал в IAR, проц - philips lps2138.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Nov 16 2006, 10:26
|
Знающий
   
Группа: Свой
Сообщений: 851
Регистрация: 28-08-04
Пользователь №: 559

|
Цитата Принципиально доступны два пути программирования кристалла: первый - через JTAG; второй - через UART0 средствами встроенного загрузчика.
О заливке через JTAG. Через JTAG программу можно залить в ОЗУ (для отладочных целей). Это могут делать любые отладчики без специальных ухищрений. Нужно лишь при линковке прописать размещение кода программы в ОЗУ. Записать программу во Flash через JTAG пока можно только одним способом - написав промежуточный код загрузчика который исполняется в ОЗУ и пишет вашу программу во флешь. Так поступает, например, IAR EWARM версий 4.хх.
О заливке через бутлоадер При поставке кристалл прошит загрузчиком (bootloader), который получает управление при аппаратном сбросе и по определенным признакам принимает решение - отдать управление программе пользователя или не стоит. Этих признаков два - состояние ноги P0.14 в момент сброса и корректная CRC программы пользователя. Загрузчик работает через порт UART0 и имеет автодетект скорости. Исчерпывающее описание протокола загрузчика и его работы приведено в LPC2100 Manual.
Филипс бесплатно распространяет программу под Windows, которая именуется ISP. Она умеет загружать программу во Flash и запускать ее на исполнение.
Загрузчик не умеет грузить программу в ОЗУ, однако, при смене версии bootloader'а, код загружается именно в ОЗУ и ему передается управление. Он (загрузчик) , как утверждается Филипсом, не имеет также никаких функций мониторинга или отладки.
Бутлоадер сидит во Flash и вполне доступен для стирания ))). Если в результате отладки Вы его затерли, то единственный способ вернуть контроль над кристаллом - через JTAG. http://www.caxapa.ru/faq/lpc2000.htmlНе помешает заглянуть сюда - FAQ, по АРМам
|
|
|
|
|
Nov 16 2006, 10:47
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
2 COMA спасибо.
2 IV_K все есть, плата - lpc2148 EB v 1.1
|
|
|
|
|
Nov 16 2006, 11:09
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
Цитата в иаре по умолчанию через j-link default loader работает нормально т.е если я выставляю j-link/j-trace то во вкладке download ничего выставлять не надо
|
|
|
|
|
Nov 16 2006, 11:15
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
Цитата в иаре по умолчанию через j-link default loader работает нормально т.е если я выставляю j-link/j-trace то во вкладке download ничего выставлять не надо если я заливаю прогу через j-tag нужно ли ее преобразовывать в hex файл
|
|
|
|
|
Nov 16 2006, 12:25
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
т.е. "симпл код" означает, что произойдет генерация hex файла
|
|
|
|
|
Nov 17 2006, 12:07
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
для чего нужен CSTACK
|
|
|
|
|
Nov 22 2006, 18:11
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
Tакой вопрос, если я размещаю код во флэше, значит ли это, что в регистре MEMMAP нужно выставить режим User Flash Mode. Как в IAR объявить isr если прерывание произошло из-за ошибки выборки команды или из-за неверного обращения к памяти, я нашел только __fiq, __irq, __swi. Хотя в кейле существуют extended keywords для подобных случаев.
|
|
|
|
|
Nov 23 2006, 12:38
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 17-06-05
Пользователь №: 6 087

|
у меня например сделано так.. MEMMAP = 2; /* Remap 64 bytes of int. RAM to 0x00 */
по прерываниям.. кусок из cstartup.s79 __program_start ; ldr pc,[pc,#24] ; Absolute jump can reach 4 GByte b ?cstartup ; Relative branch allows remap, limited to 32 MByte ; Vectors can be enabled by removing the comments below or by ; using #pragma vector from C code. org 0x04 b undef_handler ; ldr pc,[pc,#24] ; Branch to undef_handler org 0x08 b swi_handler ; ldr pc,[pc,#24] ; Branch to swi_handler org 0x0c b prefetch_handler ; ldr pc,[pc,#24] ; Branch to prefetch_handler org 0x10 b data_handler ; ldr pc,[pc,#24] ; Branch to data_handler org 0x18 b OS_CPU_IRQ_ISR ; ldr pc,[pc,#24] ; Branch to irq_handler org 0x1c b OS_CPU_FIQ_ISR ; ldr pc,[pc,#24] ; Branch to fiq_handler
кусок из сишного файла обработчика.
#pragma location="ICODE" __interwork void undef_handler(void){ __disable_interrupt(); // error("undefined instr"); while (1) {} } #pragma location="ICODE" __interwork void swi_handler(void){ __disable_interrupt(); // error("swi"); while (1) {} } #pragma location="ICODE" __interwork void prefetch_handler(void){ __disable_interrupt(); // error("prefetch abort"); while (1) {} } #pragma location="ICODE" __interwork void data_handler(void){ __disable_interrupt(); // error("data abort"); while (1) {} }
вроде все работает..
|
|
|
|
|
Nov 28 2006, 12:42
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
при попытке проошить возникают проблемы
в log окне IAR'а пишется следующее:
Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000181 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000182 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x000001DC Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x000001E8 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x000001F8 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000200 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000210 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000212 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000236 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000242 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000248 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x0000024C Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000250 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000255 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000256 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000038 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x0000003C Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000050 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x000000D4 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000102 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000128 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x0000026C Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000270 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000276 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x000002D4 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000284 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000294 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x000002B0 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x00000170 Tue Nov 28 12:36:31 2006: Warning: Target inconsistency detected at Memory address 0x000002C8 Tue Nov 28 12:36:31 2006: There were warnings during download, see Log Window Tue Nov 28 12:36:33 2006: Loaded debugee: C:\Projects\new\Debug\Exe\new.d79 Tue Nov 28 12:36:33 2006: Target reset Tue Nov 28 12:36:34 2006: The stack 'CSTACK' is filled to 100% (1280 bytes used out of 1280). The warning threshold is set to 90%. Tue Nov 28 12:36:34 2006: The stack pointer for stack 'CSTACK' (currently 0x40001294) is outside the stack range (0x40000000 to 0x40000500) Tue Nov 28 12:36:34 2006: The stack pointer for stack 'SVC_STACK' (currently 0x400032A0) is outside the stack range (0x40000900 to 0x40000B00) Tue Nov 28 12:36:34 2006: The stack pointer for stack 'IRQ_STACK' (currently 0x400022A0) is outside the stack range (0x40000500 to 0x40000700) Tue Nov 28 12:36:34 2006: The stack pointer for stack 'UND_STACK' (currently 0x400032A0) is outside the stack range (0x40000D00 to 0x40000F00) Tue Nov 28 12:36:34 2006: The stack pointer for stack 'ABT_STACK' (currently 0x400032A0) is outside the stack range (0x40000B00 to 0x40000D00)
как с этим справиться??
|
|
|
|
|
Nov 28 2006, 14:22
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
после установки MEMMAP = 1 или MEMMAP = 2 картина изменилась:
Tue Nov 28 14:18:08 2006: J-Link firmware: V1.20 (J-Trace ARM Rev.1 compiled Feb 8 2006 19:01:36) Tue Nov 28 14:18:08 2006: JTAG speed is initially set to: 32 kHz Tue Nov 28 14:18:08 2006: Halting CPU core Tue Nov 28 14:18:08 2006: Software reset was performed Tue Nov 28 14:18:08 2006: Initial reset was performed Tue Nov 28 14:18:08 2006: J-Link found 1 JTAG device. ARM core Id: 4F1F0F0F(ARM7) Tue Nov 28 14:18:08 2006: Device at TAP0 selected Tue Nov 28 14:18:08 2006: Auto JTAG speed: 1600 kHz Tue Nov 28 14:18:08 2006: Auto JTAG speed: 1600 kHz Tue Nov 28 14:18:09 2006: 736 bytes downloaded and verified (1.07 Kbytes/sec) Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000181 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000182 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x000001E8 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x000001F8 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000208 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000210 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000220 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000222 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000246 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000252 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000258 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x0000025C Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000261 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000264 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000266 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000050 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x000000D4 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000102 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000128 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000280 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000284 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x0000028B Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x000002E8 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000299 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x000002A8 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x000002C4 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x00000170 Tue Nov 28 14:18:09 2006: Warning: Target inconsistency detected at Memory address 0x000002DC Tue Nov 28 14:18:09 2006: There were warnings during download, see Log Window Tue Nov 28 14:18:10 2006: Loaded debugee: C:\Projects\new\Debug\Exe\new.d79 Tue Nov 28 14:18:10 2006: Target reset Tue Nov 28 14:18:10 2006: Profiler: No cycle counter could be found. Profiler will only count function calls. Tue Nov 28 14:18:10 2006: Failed to set breakpoint at 0x00000220 (out of hardware breakpoints) Tue Nov 28 14:18:10 2006: Profiler: Could not set enough breakpoints.
|
|
|
|
|
Dec 1 2006, 17:13
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
ниче не понимаю, никак не могу войти в прерывание.
1. Это кусок из стартапа:
MODULE ?RESET COMMON INTVEC:CODE:NOROOT(2) PUBLIC __program_start EXTERN ?cstartup EXTERN undef_handler, swi_handler, prefetch_handler EXTERN data_handler, my_irq_handler, fiq_handler CODE32 ; Always ARM mode after reset
~часть текста не показана~ org 0x18 __irq_handler ldr pc,[pc,#24] ; Branch to irq_handler
org 0x1c __fiq_handler ldr pc,[pc,#24] ; Branch to fiq_handler ; Constant table entries (for ldr pc) will be placed at 0x20 ; Exception vectors can be specified in C code by #pragma vector or by filling ; in the vectors below. The vector address is the ARM vector number + 0x20.
~часть текста не показана~
org 0x38 dc32 my_irq_handler org 0x3c dc32 fiq_handler LTORG ; ENDMOD __program_start ENDMOD
2. Разрешил прерывание каждую секунду (от RTC) CIIR_bit.IMSEC = 1;
3. Инициализация прерывания VICIntEnable = (1 << 13); VICVectCntl0 = 0xd ; VICVectCntl0 = VICVectCntl0 | 0x20; VICVectAddr0 = (unsigned)RTC_isr_handler;
4. Обработчик.
__irq void my_irq_handler (void) { ISR_pntr isr_pntr; isr_pntr = (ISR_pntr)VICVectAddr; while (isr_pntr != 0) { VICVectAddr = 0; (*isr_pntr)(); isr_pntr = (ISR_pntr)VICVectAddr; } }
|
|
|
|
|
Dec 4 2006, 13:15
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
Цитата(IV_K @ Dec 2 2006, 13:48)  __enable_interrupt() в функции main есть? =) Как раз ее-то и не хватало. Спасибо.
|
|
|
|
|
Dec 7 2006, 16:35
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 13-11-06
Пользователь №: 22 246

|
прочитал, что в одном из слотов векторов прерываний должно храниться какое-то значение, чтобы чексумма векторов с этим значением давала 0, в связи с этим вопрос: это значение как то надо вычислять или оно само определяется??
|
|
|
|
|
Dec 8 2006, 09:37
|
Частый гость
 
Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557

|
Цитата(hoggar @ Dec 7 2006, 16:35)  прочитал, что в одном из слотов векторов прерываний должно храниться какое-то значение, чтобы чексумма векторов с этим значением давала 0, в связи с этим вопрос: это значение как то надо вычислять или оно само определяется?? Обычно его определяет программатор.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|