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

 
 
 
Reply to this topicStart new topic
> STM32F103VE отладка в RAM, Не могу запустить. Помогите
pvo125
сообщение Apr 23 2016, 14:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 9-04-14
Из: Черногорск Хакасия
Пользователь №: 81 299



Здравствуйте Все!
Пытаюсь отладить проект во внутренней RAM (0x20000000 адрес). Проц stm32f103VE (64k памяти). Среда Кейл.
Ставлю на вкладке Target
IROM1 0x20000000 size 0x8000
IRAM1 0x20008000 size 0x2000
Далее компилируется и собирается проект все без ошибок.
В файле system_stm32f10x.c раскоментирую строку #define VECT_TAB_SRAM
На выводы Boot0 Boot1 по 3 вольта.


Далее компилируется и собирается проект все без ошибок. Нажимаю кнопку Debug начинается загрузка проекта. Дальше должно остановиться на main (если установил галочку Run to main()) или на векторе сброса адрес 0x20000004. (если не путаю). такое делал на stm32f429 ).
Но у меня получается след. PC=0x200001e0 SP=0x20005000. В регистрах значения похожие на мусор. Скрин шот приложил.
Если нажимаю Reset в отладке то счетчик сбрасывается на PC=0x200001e0. Далее если шагать по шагам в окне дизассемблера то след. идет BX LR при этом в LR 0xFFFFFFFF. После этого PC перескакивает на 0xFFFFFFFF затем видимо сброс и PC=0x20000004 далее отладчик вылетает с ошибкой и окно закрывается.Заранее извиняюсь если сумбурно любые вопросы и подробности уточню. Вроде не должно быть так геморно. Тем более сам отлаживал таким способом stm32f429. А здесь не идет. Вообще может такое быть что пины Boot0 Boot1 не корректно срабатывают а точнее Boot1 так как при отладке через flash все нормально.(там как раз Boot0=0 а Boot1 не важно)
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 23 2016, 18:02
Сообщение #2


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

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



Похоже, вы улетаете в HardFault из-за не Thumb команды. Я пользовался таким 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
  xPSR = 0x01000000;            // Thumb
}

LOAD Objects\<ваш.axf> incremental    // Download
Setup();                                 // Setup for Running
G , main
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2016, 05:48
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(pvo125 @ Apr 23 2016, 17:56) *
На выводы Boot0 Boot1 по 3 вольта.

BOOT трогать вовсе не обязательно. Отладчик подцепится в любом случае.
Насколько я понимаю, кейловский отладчик не инициализирует SP и PC. Поэтому нужно делать это в скрипте инициализации отладчика. Я пишу там что-то такое:
Код
SP = *(int*)0x20000000;
PC = *(int*)0x20000004;

Update:
Да, верно ViKo указал про вот это: "xPSR = 0x01000000;"
У меня и без этой строчки временами работало. Не разбирался, от чего это зависит.
Go to the top of the page
 
+Quote Post
pvo125
сообщение Apr 24 2016, 13:13
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 9-04-14
Из: Черногорск Хакасия
Пользователь №: 81 299



Спасибо за наводку про Init file Dbg_RAM.ini У меня этот файл был я с ним пробовал но главный косяк был в том что у меня было написано
LOAD RAM\ myfile.axf incremental
пробовал так как писал Viko
LOAD Objects\ myfile.axf incremental
Тем не менее как часто бывает эмпирическим путем выяснил что строчка должна быть такой
LOAD RAM\myfile.axf incremental без пробелов кстати такая строчка тоже работает
LOAD myfile.axf incremental
После этого стало все запускаться или в стартап или до функции main.

Цитата
BOOT трогать вовсе не обязательно. Отладчик подцепится в любом случае.

Верно подметили перемычки можно ставить как на флэш так и на RAM если файл ini верно написан то отладчик подцепится как описано в файле.

Одно не пойму как быть когда в отладке я нажимаю ресет и отладчик снова ставит счетчик команд на адрес 0x200001e0 как и было. Получается что нужно каждый раз загружать отладку debug session. И тогда контроллер нормально отрабатывает сброс.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2016, 13:54
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(pvo125 @ Apr 24 2016, 16:13) *
Одно не пойму как быть когда в отладке я нажимаю ресет и отладчик снова ставит счетчик команд на адрес 0x200001e0 как и было. Получается что нужно каждый раз загружать отладку debug session. И тогда контроллер нормально отрабатывает сброс.

Если в скрипте определить функцию, как функция Setup() у ViKo, то после сброса в отладчике можно в командной строке вызвать её: "Setup()". Вот и всё. Для удобства можно назвать функцию покороче, скажем, "f()" laughing.gif
Go to the top of the page
 
+Quote Post
pvo125
сообщение Apr 24 2016, 15:36
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 9-04-14
Из: Черногорск Хакасия
Пользователь №: 81 299



Цитата
Для удобства можно назвать функцию покороче, скажем, "f()"

Да действительно так работает. Спасибо Вам за науку!

....Сейчас проверил отладку на таком контроллере stm32f429. Я изначально на нем пробовал и помню что вообще с ним проблем не было даже init file не нужен был хотя я его и подсовывал. В общем скомпилировал проект для отладки в озу как и писал ранее. Далее просто нажал клавишу debug session и у меня кейл сам все адреса стека и PC правильно выставил. Если стоит галочка то до main выполняется если нет то на функции SystemInit из стартапа. И при сбросе в отладчике тоже правильно выставляется PC на SystemInit(). Получается более правильно работает ... только не понял что ядро M4 или кейл с контроллером 429?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2016, 16:07
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(pvo125 @ Apr 24 2016, 18:36) *
....Сейчас проверил отладку на таком контроллере stm32f429. Я изначально на нем пробовал и помню что вообще с ним проблем не было даже init file не нужен был хотя я его и подсовывал...
Получается более правильно работает ... только не понял что ядро M4 или кейл с контроллером 429?

У STM32F4xx выбор BOOT работает более правильно: там выбранная память отображается на адрес 0. В отличие от STM32F1xx, где ОЗУ на адрес 0 не отображается, а сделан какой-то странный и неведомый механизм загрузки из ОЗУ. В этом и причина, как мне кажется.
Совсем недавно обсуждалось.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:40
Рейтинг@Mail.ru


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