Цитата(Pat @ Nov 13 2014, 23:38)

Код
xPSR: 0xc1000000 pc: 0x1fff0040 msp: 0x10000ffc
Тут видно, что процессор находится во встроенном загрузчике. Встроенный загрузчик запускается низким уровнем на ноге PIO0_1. Проверьте, не притянута ли эта нога у вас к земле. Это раз. Второе - у LPC есть "фишка" - контроллер при старте проверяет контрольную сумму начального участка области векторов. И если эта сумма не совпала - контроллер считает, что программы нет и уходит во встроенный загрузчик. IAR эту контрольную сумму добавляет на лету во время загрузки. Родная утилита загрузки через ISP тоже добавляет эту сумму. OpenOCD сам ничего не добавляет, значит проблема может быть в том, что ваш файл не содержит контрольной суммы. Если это так, то вариантов решения два:
1) немного изменить стартап-файл и скрипт линкера, чтобы заставить линкер считать эту сумму и вставлять в нужное место.
2) в скрипте OpenOCD добавить функцию, исполняющуюся после сброса и в этой функции сделать принудительный ремап на флеш, считать из таблицы векторов начальное значение стека в MSP, считать адрес вектора сброса и занести его в PC.
Цитата(Pat @ Nov 13 2014, 23:38)

Причем только смог подключится через openOcd-0.6.0
восьмерка не захотела работать ругаясь на транспорт swd
Там синтаксис этих опций менялся. Я работал с LPC1114 и восьмой версией OpenOCD и девятой.
Цитата(Pat @ Nov 13 2014, 23:38)

Может есть у кого рабочие файлы скриптов для LPC1112?
Дайте если не жалко.
В текущей версии из репозитория уже есть готовые скрипты для LPC11xx в комплекте. Но они заточены именно под эту последнюю версию, поэтому надо брать ее целиком. Отдельно скрипты к старой версии не подойдут. И, кстати, там исправлено множество ошибок (одну с прошивкой именно LPC11xx исправлял я) и недоработок, поэтому я вам очень не советую бороться со старыми версиями. Берите последнюю - в ней все работает.
Если захотите считать контрольную сумму линкером, то вот как я делал:
1) В cstartup разбил таблицу векторов на две части (до и после контрольной суммы).
Код
extern uint32_t _estack[];
typedef void( * const intfunc )( void );
__attribute__ ((section(".isr_vector_part1")))
intfunc g_pfnVectors_part1[] =
{
/* Core interrupt vectors */
(intfunc)_estack,
Reset_Handler,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler
};
__attribute__ ((section(".isr_vector_part2")))
intfunc g_pfnVectors_part2[] =
{
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSVC_ISR,
SystemTimer_ISR,
.........
В скрипте линкера разместил эти две секции и сумму между ними:
Код
.text :
{
. = ALIGN(4);
KEEP(*(.isr_vector_part1))
LONG(0 - (6 + _estack + Reset_Handler + NMI_Handler + HardFault_Handler + MemManage_Handler + BusFault_Handler + UsageFault_Handler));
KEEP(*(.isr_vector_part2))
/* code read protection */
. = 0x2FC;
/* LONG(0x87654321);*/
. = ALIGN(4);
..............