|
LPC1549 в ISP режиме, не корректно выходит |
|
|
|
Feb 12 2016, 14:26
|
Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482

|
Изучаю МК LPC1549 на демо плате LPCXpresso V2 Boards, IDE LPCXpresso. Разбираюсь с режимом работы в ISP, связь МК с ПК по CAN. Переход в ISP осуществляется из функции main() с помощью IAP команды: Код Chip_IAP_ReinvokeISP(BOOT_CAN);//invoke ISP CAN Param0: ISP mode. 3 = C_CAN ISP Счытываю тип прибора, идентификационный номер (не записываю ни во Flash ни в RAM). Обмен виден утилитой USB-CAN моста. Потом выхожу из ISP в приложение командой «Go». Команда отрабатывается, но МК куда то улетает, а нужно в начало пользовательського приложения. Что я делаю не так?
|
|
|
|
|
 |
Ответов
|
Feb 12 2016, 17:22
|

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

|
QUOTE (kolisnichenko_r @ Feb 12 2016, 16:26)  Изучаю МК LPC1549 на демо плате LPCXpresso V2 Boards, IDE LPCXpresso. Разбираюсь с режимом работы в ISP, связь МК с ПК по CAN. Переход в ISP осуществляется из функции main() с помощью IAP команды: CODE Chip_IAP_ReinvokeISP(BOOT_CAN);//invoke ISP CAN Param0: ISP mode. 3 = C_CAN ISP Счытываю тип прибора, идентификационный номер (не записываю ни во Flash ни в RAM). Обмен виден утилитой USB-CAN моста. Потом выхожу из ISP в приложение командой «Go». Команда отрабатывается, но МК куда то улетает, а нужно в начало пользовательського приложения. Что я делаю не так? А что Вы считаете "началом приложения"? Ну а в общем случае Вы по "Go" кортекс M3 не запустите  . Попытка сляпать "никакой" startup увенчалась "успехом' в результате которого в стартапе нет, например, явной установки стека. Если в начале Вашего приложения лично Вы не добавили инициализацию, то по Go улетите. Про младший бит адреса помните?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 12 2016, 19:50
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zltigo @ Feb 12 2016, 23:22)  А что Вы считаете "началом приложения"? Ну а в общем случае Вы по "Go" кортекс M3 не запустите  . Попытка сляпать "никакой" startup увенчалась "успехом' в результате которого в стартапе нет, например, явной установки стека. Если в начале Вашего приложения лично Вы не добавили инициализацию, то по Go улетите. Про младший бит адреса помните? У Вас видно старая версия FlashMagic-а. Последние умеют переходить по содержимому начала таблицы векторов (есть там чекбокс соответствующий). А сама идея конечно бредовая, можно наверное трусы и через голову надевать, но есть более традиционные методы. И товарищ, с большой долей вероятности, не задумался в каком состоянии находится периферия в момент сего перехода, и как написан его код инициализации периферии, переварит-ли он недефолтные значения в её регистрах. Но если всё-таки хочется трусы через голову, то можно например посоветовать ему написать функцию, дёргающую аппаратный сброс (например через WDT), слинковать её на фиксированный адрес и передавать сей адрес команде Go. Так есть шанс не застрять ушами в трусах.
|
|
|
|
|
Feb 12 2016, 20:50
|
Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482

|
Цитата(jcxz @ Feb 12 2016, 22:50)  У Вас видно старая версия FlashMagic-а. Последние умеют переходить по содержимому начала таблицы векторов (есть там чекбокс соответствующий). А сама идея конечно бредовая, можно наверное трусы и через голову надевать, но есть более традиционные методы. И товарищ, с большой долей вероятности, не задумался в каком состоянии находится периферия в момент сего перехода, и как написан его код инициализации периферии, переварит-ли он недефолтные значения в её регистрах. Но если всё-таки хочется трусы через голову, то можно например посоветовать ему написать функцию, дёргающую аппаратный сброс (например через WDT), слинковать её на фиксированный адрес и передавать сей адрес команде Go. Так есть шанс не застрять ушами в трусах.  На счет идеи, если больше нету связи кроме как CAN и дергать питанием тоже нельзя. Использовать ISP как раз когда можно в него перейти с работающей программы переписать код и потом в новую вернуться. Но на даном этапе не получилось просто войти и вернуться. Как оно не просто... Цитата(zltigo @ Feb 12 2016, 23:43)  Вы это что спросить хотели?
Детский сад какой-то. Вы слово стек когда-нибудь слышали? Вы прервали программу и потом НЕ возвратились, а послали (ну в Вашем варианте вообще на 3 веселых буквы) в другое место. Про то, зарезервировали-ли Вы память в своей программе для работы ISP, спрашивать, видимо, вообще не имеет смысла? Для того что бы задать вопрос надо знать хотя бы часть ответа. Вот этим и надо заняться. А с чего начать?
|
|
|
|
|
Feb 12 2016, 21:03
|

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

|
QUOTE (kolisnichenko_r @ Feb 12 2016, 22:50)  А с чего начать? В Вашем случае с самого начала: 1) Архитектура контроллера и как он стартует. 2) Какие ресурсы использует ISP и как с ним сосуществовать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 13 2016, 07:51
|
Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482

|
Цитата(zltigo @ Feb 13 2016, 00:03)  В Вашем случае с самого начала: 1) Архитектура контроллера и как он стартует. 2) Какие ресурсы использует ISP и как с ним сосуществовать. Спасибо. Пошел читать... Цитата(jcxz @ Feb 13 2016, 10:24)  Начать Вам надо с открытия юзермануала и прочтения разделов "IAP" (прошивка флешь) и WDT (аппаратный сброс после обновления ПО). ISP тут совсем не к месту. Обоснуйте, пожалуйста
|
|
|
|
|
Feb 17 2016, 10:57
|
Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482

|
Уже возвращается в приложение и отрабатывает его нормально, если не использовать прерывания. С прерываниями - не работают прерывания, а все остальное работает. Ремап векторов прерывания и перенос указателя стека делаю в начале: Код int main(void) { // TODO: insert code here uint32_t sysTickRate, addr; CopyInterruptToSRAM(); //remap interrupt vector to SRAM LPC_SYSCON->SYSMEMREMAP = 0x1; //change memory map 0x1 - RAM // Set vector table offset addr=0x1000; uint32_t *p; SCB->VTOR = addr; p = (uint32_t *)addr; __set_MSP(*p);//Set stack pointer to given address SystemCoreClockUpdate(); Board_Init(); Board_LED_Set(0, false); Board_LED_Set(1, true); ..... Зарезервировал память: Flash -> Location: 0x1000 | Size: 0x3f000 RAM -> Location: 0x2000200 | Size: 0x3e00 с низу для таблицы векторов RAM -> Location: 0x2008000 | Size: 0xde0 и с верху для ISP А прерывания не отрабатываются. Подсобите наводкой
|
|
|
|
|
Feb 17 2016, 12:11
|
Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482

|
Цитата(kolisnichenko_r @ Feb 17 2016, 13:57)  Зарезервировал память: Flash -> Location: 0x1000 | Size: 0x3f000 RAM -> Location: 0x2000200 | Size: 0x3e00 с низу для таблицы векторов RAM -> Location: 0x2008000 | Size: 0xde0 и с верху для ISP Нашел, что модуль C_CAN ISP использует RAM от 0x0200 0100 до 0x0200 09E4 Зарезервировал так: RAM -> Location: 0x2000А00 | Size: 0x3600 с низу для таблицы векторов и C_CAN ISP Работает так же...
|
|
|
|
Сообщений в этой теме
kolisnichenko_r LPC1549 в ISP режиме Feb 12 2016, 14:26 kolisnichenko_r Цитата(zltigo @ Feb 12 2016, 21:22) А что... Feb 12 2016, 18:56  zltigo QUOTE (kolisnichenko_r @ Feb 12 2016, 20... Feb 12 2016, 19:47   kolisnichenko_r Цитата(zltigo @ Feb 12 2016, 22:47) Ой, к... Feb 12 2016, 20:31    zltigo QUOTE (kolisnichenko_r @ Feb 12 2016, 22... Feb 12 2016, 20:43  zltigo QUOTE (jcxz @ Feb 12 2016, 21:50) У Вас в... Feb 12 2016, 19:58   jcxz Цитата(zltigo @ Feb 13 2016, 01:58) У мен... Feb 13 2016, 07:24    zltigo QUOTE (jcxz @ Feb 13 2016, 09:24) что зна... Feb 13 2016, 15:59     jcxz Цитата(zltigo @ Feb 13 2016, 21:59) Остал... Feb 14 2016, 16:39      zltigo QUOTE (jcxz @ Feb 14 2016, 18:39) Ну нет,... Feb 14 2016, 17:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|