реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> LPC1778 не получается переместить программу, Не могу переместить программу в нужный адрес FLASH
KnightIgor
сообщение May 13 2013, 10:14
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Metallist64 @ May 13 2013, 07:41) *
Попробовал запустить в симуляторе. Там видно что программа крутится в адресе 0х00000000 и не уходит из него.
В обще в окне дизассеблера, первая строка:
Такое ощущение, что какого-то перехода просто не хватает, типа RJMP на нужный адрес...

Вот по этому поводу я и распинался в сообщении №2. Ну не знают компилятор и компоновщик, что Вы хотите! Не будут они прописывать за Вас таблицы векторов, а процессор после сброса ВСЕГДА лезет по адресу 0х0 и загружает оттуда SP и PC. Сделайте, как я посоветовал. Это проверено.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 13 2013, 12:18
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(KnightIgor @ May 13 2013, 16:14) *
а процессор после сброса ВСЕГДА лезет по адресу 0х0 и загружает оттуда SP и PC. Сделайте, как я посоветовал. Это проверено.
А вот передо мной сейчас лежит устройство как раз на LPC1778, только подключено к IAR через JTAG. Стираю FlashMagic-ом ВСЮ память, прошиваю через JTAG начиная с 0x00001000, стартую (из под JTAG) - и удивительно - ПО прекрасно работает. Наверное оно не знает, что у него первые 0x1000 байт забиты 0xFF, если бы знало - точно не работало-бы! smile3046.gif
Go to the top of the page
 
+Quote Post
Metallist64
сообщение May 13 2013, 12:25
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Цитата(jcxz @ May 13 2013, 15:18) *
А вот передо мной сейчас лежит устройство как раз на LPC1778, только подключено к IAR через JTAG. Стираю FlashMagic-ом ВСЮ память, прошиваю через JTAG начиная с 0x00001000, стартую (из под JTAG) - и удивительно - ПО прекрасно работает. Наверное оно не знает, что у него первые 0x1000 байт забиты 0xFF, если бы знало - точно не работало-бы! smile3046.gif


А вы в настройках проекта просто указываете с какого адреса шить? В самой программе ничего не меняете?
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 13 2013, 12:44
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Меняется только адрес начала флеш-памяти, описанный в icf-файле (командный файл линкёра). Больше ничего.
Go to the top of the page
 
+Quote Post
Metallist64
сообщение May 13 2013, 13:17
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Цитата(sensor_ua @ May 12 2013, 08:01) *
Может, всё хорошо, только отладчику скрипт нужен с правильными адресами?
Типа такого, только цифирьки свои вписать
CODE
/*----------------------------------------------------------------------------
* Name: Dbg_ROM.ini
* Purpose: ROM Debug Initialization File
* Note(s):
*----------------------------------------------------------------------------
* This file is part of the uVision/ARM development tools.
* This software may only be used under the terms of a valid, current,
* end user licence from KEIL for a compatible version of KEIL software
* development tools. Nothing else gives you the right to use this software.
*
* This software is supplied "AS IS" without warranties of any kind.
*
* Copyright © 2008-2011 Keil - An ARM Company. All rights reserved.
*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
Setup() configure PC & SP for RAM Debug
*----------------------------------------------------------------------------*/
FUNC void Setup (void) {
SP = _RDWORD(0x00000000); // Setup Stack Pointer
PC = _RDWORD(0x00000004); // Setup Program Counter
_WDWORD(0xE000ED08, 0x00000000); // Setup Vector Table Offset Register
//_WDWORD(0x400FC0C4, _RDWORD(0x400FC0C4) | 1<<12); // Enable ADC Power
//_WDWORD(0x40034034, 0x00000F00); // Setup ADC Trim
}

LOAD %L INCREMENTAL // load the application

Setup(); // Setup for Running

g, main


Может быть, на сайте поддержки Keil сказали, что надо правильные адреса задать.
Только как понять, что куда записывать?
В PC я так понимаю надо начальный адрес программы записать.
А что надо записать в указатель стека?
Плюс еще команда неясная : _WDWORD(0xE000ED08, 0x00000000); // Setup Vector Table Offset Register

Может кто-нибудь сможет объяснить? А то смотрю на все это - как баран на новые ворота...

Go to the top of the page
 
+Quote Post
sensor_ua
сообщение May 13 2013, 15:52
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Вот, например, цифирьки по образу и подобию
https://github.com/ransford/freertos-moo/bl...eil/Dbg_RAM.ini
(Vector Table Offset Register совпадает с SP, а PC смещен на 4, ну и тут рекомендуют начальное смещение кратное 2^6)
Вы же выставляете свои цифирьки в настройках проекта? Впишите их в скрипт


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Metallist64
сообщение May 14 2013, 07:25
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Уважаемые специалисты.
Вроде сделал как надо:

Код
FUNC void Setup (void) {
  SP = _RDWORD(0x10000000);                          // Setup Stack Pointer
  PC = _RDWORD(0x10000004);                          // Setup Program Counter
  _WDWORD(0xE000ED08, 0x10000000);            // Setup Vector Table Offset Register - VTOR
}

LOAD %L INCREMENTAL                                  // load the application

Setup();                                    // Setup for Running

g, main


Указатель стека указывает на ОЗУ, PC тоже задан со смещением +4. VTOR задан.
Данный .INI фаил я добавил в debug/simulator.
Но ничего не изменилось. В симуляторе стою на нулевом адресе. Насколько я понял, в регистре VTOR бит[29] установлен, значит таблица должна быть размещена в ОЗУ. Вроде все нормально.
Где же я еще торможу...? Симулятор даже не хочет работать... Вот беда..
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение May 14 2013, 11:48
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Указатель стека указывает на ОЗУ...
А настройки во вкладке проекта Target совпадают?


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Metallist64
сообщение May 14 2013, 12:46
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Цитата(sensor_ua @ May 14 2013, 14:48) *


Да, настройки RAM в проекте совпадают с теми, которые я указываю в .INI файле.
Чувствуется, что нет начальной инициализации. Не стартует процессор...
В симуляторе даже не работает... Тупик какой-то...
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение May 14 2013, 14:53
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



А для ROM со смещением так пробовал? Я из RAM не пускался - по идее туда чем-то нужно загрузить. Это либо должна сделать программа путём копирования откуда-то из ROM (наверно в стартапе), либо подгрузить отладчик.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Metallist64
сообщение May 14 2013, 20:57
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Цитата(sensor_ua @ May 14 2013, 17:53) *
А для ROM со смещением так пробовал? Я из RAM не пускался - по идее туда чем-то нужно загрузить. Это либо должна сделать программа путём копирования откуда-то из ROM (наверно в стартапе), либо подгрузить отладчик.


Немного не понял, о чем речь.
Для ROM я указываю смещение в проекте...
Задаю стартовый адрес и длину.
Go to the top of the page
 
+Quote Post
Metallist64
сообщение May 15 2013, 07:36
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Пока решил оставить затею отлаживать прошивку с любого адреса флэши.
Теперь решил попробовать создать простой бутлоадер,
который просто передает управление программе, которую записываю с нужным смещением.
Бутлоадер вроде как делает все правильно, выполняется даже часть кода из основной программы.
Но потом опять все ламается.
И при заливке основной прошивки видно, что прошивальщик очищает нулевой сектор...В которм лежит бут...
(поэтому приходится его прошивать повторно)
И потом что-то записывает с адреса 0х300. А потом переходит на нужный 0х10000...
Может кто-нибудь знает, почему такое поведение?
Зачем прошивальщик лезет в 0й сектор?
Да и опять после записи основной программы отваливается отладчик. Для прошивки бута приходится использовать внутренний загрузчик.

P.S. В настройках проектов везеде разделил и ROM и RAM. Они не должны пересекаться.
P.P.S. Проекты бута и основной программы пересоздавал заново. Ничего не изменилось.

Сообщение отредактировал Metallist64 - May 15 2013, 07:39
Go to the top of the page
 
+Quote Post
Metallist64
сообщение May 15 2013, 08:44
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



В руководстве пользователя написано, что с адреса 0х0 по 0х400 располагается таблица активных векторов.
Но я так понимаю, что таблицы разных программ должны располагаться в разных местах(адреса обработчиков разные).
Может кто-нибудь знает, правильно происходит процесс? Или надо принудительно смещать таблицу векторов пользовательской программы? Потому что видимо они лезут в один и тот же адрес...
А то уже и не знаю куда копать...
Go to the top of the page
 
+Quote Post
Metallist64
сообщение May 15 2013, 13:05
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 29-01-08
Пользователь №: 34 558



Вот я баран!
Я в коде объявил несколько переменных, которые имеют абсолютный адрес во флэши.
Поэтому при записи основной программы, затирались сектора, в которых лежал бутлоадер.
Теперь бут не затирается, основная программа отлаживается, PLL вроде работает правильно(частоты показываются правильные), но с прерываниями пока не разобрался.
Как только прерывание - получаем ступор. Хотя бут вроде все корректно настраивает.
Может в стартапе снова инициализируется адрес 0х0 для таблице векторов?

Сообщение отредактировал Metallist64 - May 15 2013, 13:07
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение May 15 2013, 20:56
Сообщение #30


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Metallist64 @ May 15 2013, 14:05) *
Как только прерывание - получаем ступор. Хотя бут вроде все корректно настраивает.
Может в стартапе снова инициализируется адрес 0х0 для таблице векторов?

Модицифируйте startup_xxxx.s, как я предлагал:
Код
__Vectors       DCD     __initial_sp            ; Top of Stack
                DCD     Reset_Handler           ; Reset Handler
                DCD     NMI_Handler             ; NMI Handler
...
VTOR            EQU     (0xE000E000 + 0x0D08)
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
; ++++++++++++++++++++++++++++++++++++++++++++++
                MOV32   R1, #VTOR       ; Load VTOR register address
                LDR     R0, =__Vectors  ; Load user program vector table address
                STR     R0, [R1]         ; Store to VTOR to relocate the vector table
; ++++++++++++++++++++++++++++++++++++++++++++++
                LDR     R0, =SystemInit
                BLX     R0              
                LDR     R0, =__main
                BX      R0
                ENDP


Между +++ в стандартный startup_xxxx добавлены команды, которые "следят" за тем, чтобы указатель на векторную таблицу всегда был настроен правильно.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 12:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016