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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> STM32: Отладка в RAM
aaarrr
сообщение May 27 2010, 20:22
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ May 28 2010, 00:03) *
Как получается, что флэш начинается с 0x08000000, RAM с 0x20000000, а таблица векторов с 0? Где же она физически находится?

Ответ, как ни странно, находится в разделе 2.4 мануала:
Цитата
Depending on the selected boot mode main Flash memory, System memory or SRAM is
accessible as follows:
● Boot from main Flash memory: the main Flash memory is aliased in the boot memory
space (0x0000 0000), but still accessible from its original memory space (0x800 0000).
In other words, the Flash memory contents can be accessed starting from address
0x0000 0000 or 0x800 0000.
● Boot from System memory: the System memory is aliased in the boot memory space
(0x0000 0000), but still accessible from its original memory space (0x1FFF F000).
● Boot from the embedded SRAM: SRAM is accessible only at address 0x2000 0000.


Скажите, а какой, собственно, смысл грузиться из SRAM?
Go to the top of the page
 
+Quote Post
KRS
сообщение May 27 2010, 20:30
Сообщение #17


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(aaarrr @ May 28 2010, 00:22) *
Скажите, а какой, собственно, смысл грузиться из SRAM?

Хороший вопрос smile.gif
IMHO ноги растут от предыдущих чипов, где это было с внешней памяти.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 27 2010, 20:31
Сообщение #18


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(aaarrr @ May 27 2010, 23:22) *
Ответ, как ни странно, находится в разделе 2.4 мануала:


Скажите, а какой, собственно, смысл грузиться из SRAM?

За ссылку в мануал спасибо, это я проглядел...
А грузиться из RAM - в первую очередь хочу разобраться в механизме. А во вторую - жалко флэш насиловать - чуть что-то изменил в программе, заходишь в отладку - опять зашивай!
Go to the top of the page
 
+Quote Post
KRS
сообщение May 28 2010, 07:56
Сообщение #19


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(ViKo @ May 28 2010, 00:31) *
А грузиться из RAM - в первую очередь хочу разобраться в механизме. А во вторую - жалко флэш насиловать - чуть что-то изменил в программе, заходишь в отладку - опять зашивай!

Вы что ноги будете перепаивать? Или там джамперы есть?
Что бы под отладчиком грузиться из ОЗУ - нужен правильный скрипт, который VTOR ставит. И все отлично работает.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 28 2010, 08:55
Сообщение #20


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(KRS @ May 28 2010, 10:56) *
Вы что ноги будете перепаивать? Или там джамперы есть?
Что бы под отладчиком грузиться из ОЗУ - нужен правильный скрипт, который VTOR ставит. И все отлично работает.

Выдайте свой скрипт, если не жалко.
Джамперы есть, а как же.
Дальнейшие размышления привели к следующим выводам.
Загрузка из флэш или систем понятна - выставил джамперы, сбросился, скакнул в адрес 0x0, прочитал, куда назначить стек, скакнул в 0x4, прочитал и перешел на адрес.
Можно сразу задать, что микроконтроллер имеет память по нулевым адресам.
А при загрузке из ОЗУ на нулевые адреса ничего не отображается. Т.е. по нулевым адресам ничего нет. Как тогда прочитать вектор сброса? В отладчике это можно сделать предварительно, настроив VTOR 0xE000ED08 (кстати, а это где описано? с ходу не нашел).
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 28 2010, 12:12
Сообщение #21


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



И еще один вывод получился. Если я загружаюсь из флэш, установив перемычки в (0,0), то я могу доступиться к флэш по нулевым адресам и по 0x08000000. А также я могу доступиться и в систем память (загрузчик) по адресам 0x1ffff000.
Go to the top of the page
 
+Quote Post
KRS
сообщение May 28 2010, 15:15
Сообщение #22


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(ViKo @ May 28 2010, 12:55) *
Выдайте свой скрипт, если не жалко.

Для IAR
Код
execUserReset( )
{
    __message "RAM START";
    __writeMemory32(0x20000000,0xE000ED08,"Memory");
}
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 31 2010, 08:57
Сообщение #23


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



У Keil есть чуть более "хитрый" файл ini
Код
FUNC void Setup (void) {
  SP = _RDWORD(0x20000000);  // Setup Stack Pointer
  PC = _RDWORD(0x20000004);  // Setup Program Counter
  _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register
}

LOAD RAM\Blinky.axf INCREMENTAL  // Download
Setup();    // Setup for Running
G ,main     // Выполнить программу до main


Blinky.axf, понятно, должен быть скомпилирован для RAM.
Go to the top of the page
 
+Quote Post
_Макс
сообщение Jun 11 2010, 19:24
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Цитата(aaarrr @ May 27 2010, 23:22) *
Скажите, а какой, собственно, смысл грузиться из SRAM?

Я решил для себя, что смысл есть. Во-первых быстрее грузится и моментально подгружает части кода, если это нужно. Во-вторых Flash имеет конечное количество циклов перезаписи.

Сообщение отредактировал _Макс - Jun 11 2010, 19:24
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 11 2010, 19:45
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(_Макс @ Jun 11 2010, 23:24) *
Во-первых быстрее грузится и моментально подгружает части кода, если это нужно.

Зато объем меньше и скорость исполнения программы ниже.

Цитата(_Макс @ Jun 11 2010, 23:24) *
Во-вторых Flash имеет конечное количество циклов перезаписи.

10K - это уже ограничение не столько на число загрузок программы, сколько на число модификаций флеш со стороны самой программы.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 14 2011, 09:25
Сообщение #26


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Обнаружил непонятное явление - в Keil при отладке программы в RAM невозможно пользоваться симулятором. На первой же команде выскакивает HardFault.

Go to the top of the page
 
+Quote Post
-JonnS-
сообщение Feb 14 2011, 17:41
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-05-07
Из: Болгария
Пользователь №: 27 577



Наверно надо добавить в RAM.INI строку:
xPSR = 0x1000000;
Подробнее здесь
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 14 2011, 19:05
Сообщение #28


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(-JonnS- @ Feb 14 2011, 19:41) *
Наверно надо добавить в RAM.INI строку:
xPSR = 0x1000000;
Подробнее здесь

Спасибо, помогло.
Теперь новая напасть вылезла. Не находится main функция в минимально простеньком проекте.
Код
  LOAD Keil_Minimal.axf incremental // Download
  Setup();                              // Setup for Running
  GO ,main
______^
*** error 34, line 26: undefined identifier

Хотя main в проекте есть, и по командам симулятор доходит и до нее.
Go to the top of the page
 
+Quote Post
-JonnS-
сообщение Feb 14 2011, 20:07
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-05-07
Из: Болгария
Пользователь №: 27 577



Возможно что надо еще разписать и периферию в ini файле:
Код
MAP 0x40000000, 0x40023400 read write      // Peripferial

Вобщем лучше отключить "go main" запустить симуляцию, смотреть по асм.
Прилагаю свой ram.ini

Ps
Добавить в "Option for Target"->"C/C++"->"Define"

Код
VECT_TAB_SRAM


Сообщение отредактировал -JonnS- - Feb 14 2011, 20:23
Прикрепленные файлы
Прикрепленный файл  RAM.rar ( 583 байт ) Кол-во скачиваний: 70
 
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 14 2011, 20:39
Сообщение #30


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(-JonnS- @ Feb 14 2011, 22:07) *
Прилагаю свой ram.ini
Добавить в "Option for Target"->"C/C++"->"Define"

У меня, практически, такой же файл upd Такой, да не совсем. Посмотрите на мои 2 и 3 строки. По-моему, у вас ошибка.
Код
FUNC void Setup(void) {
  SP = _RDWORD(0x20000000);          // Setup Stack Pointer
  PC = _RDWORD(0x20000004);          // Setup Program Counter
  _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register
  xPSR = 0x1000000;
}
//  RESET  
//  MAP 0x64000000, 0x6407ffff read write
//  MAP 0x6c000000, 0x6c03ffff read write
//  MAP
  LOAD Keil_Minimal.axf incremental // Download
  Setup();                              // Setup for Running
  G , main

А периферию я не использую, выкинул все. Может, перестарался sm.gif Вот весь файл с майн
Код
#include "stm32f10x.h"
uint32_t Cnt;
int32_t main(void)
{
  while (1) {
    Cnt++;
  }
}

А "Define" что? sm.gif Ага, нашел. Нет, у меня такого нет. Работает и так. У меня: STM32F10X_HD

upd2 И с Go разобрался - нужно писать G, а не GO. Исправил в файле, все работает! (ну и лох же я) sm.gif
Go to the top of the page
 
+Quote Post

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

 


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


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