STM32 на keil с нуля. Помогите пожалйста

Кто любит RISC в жизни, заходим, не стесняемся.
Konstantin_
Родился
Сообщения: 12
Зарегистрирован: Вт сен 01, 2015 16:55:09

STM32 на keil с нуля. Помогите пожалйста

Сообщение Konstantin_ »

Подскажите пожалуйста, нашёл в интернете на первый взгляд очень хороший цикл статей по STM32 на keil, но у меня ничего не получается с самого первого шага - создания пустого проекта. Все выполнено согласно статье, но в результате огромное количество ошибок.
Почему так?
И как вообще лучше подойти к изучению этого вопроса? "С" не знаю - сначала его изучать по Кернигану и Ричи или с необходимой частью "С" разберусь по ходу? (есть хорошая статья на коте:http://radiokot.ru/articles/56/ но она по работе с CooCox, а мне нужен именно keil)
Вложения
1.jpg
(244.31 КБ) 885 скачиваний
Реклама
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Mishany »

через это наверное каждый проходит))) сам бился над этим больше мес. понимание придет с опытом.
http://radiokot.ru/forum/viewtopic.php?f=59&t=67578 читайте с самого начала, мне помогло.
http://easyelectronics.ru/rabota-s-stm3 ... brary.html
Реклама
Konstantin_
Родился
Сообщения: 12
Зарегистрирован: Вт сен 01, 2015 16:55:09

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Konstantin_ »

Спасибо)
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

Добрый день. Не могу понять поведение KEIL. В начале программы пытаюсь в RAM инициализировать три переменных. RAM начинается с адреса 0x20000000. По идее, исходя из скаттер файла, кейл должен положить эти переменные начиная с вышеприведенного адреса. Но в самом начале идет какой-то мусор и соответственно эти константы он кладет после. При считывании адреса переменной, адрес начинается как положено с 0х20000000
http://img.radiokot.ru/files/113953/vk3vby3gm.png
Реклама
Эиком - электронные компоненты и радиодетали
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

Как вообще в KEILе инициализировать именованные переменные в RAM? Всю голову сломал.

____AREA my_var, DATA, READWRITE
blala DCD 1000

Не прокатывает. В начале RAM нет этой переменной
Реклама
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 953
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение GARMIN »

Попробую подсказать.
1) Скажите, где располагается таблица прерываний в вашем процессоре?
2) int Foo = 11234;
Реклама
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

Таблица прерываний в начале флеша, вестимо, по адресу 0х08000000
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 953
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение GARMIN »

А если посмотреть файл листинга, там же есть адреса переменных?
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

Файл листинга.
Изображение
Не могу понять, почему переменные с нулевого адреса? И почему unused? Как-то надо инициализировать ?
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение pixar »

relocatable symbols
иницированы 0х0, asdf 0x4;
не использованы нигде , поэтому unused.
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

Так как всё-таки поместить именованную переменную в ОЗУ с помощью конструкции:

AREA mydata, DATA, READWRITE
blabla DCD 1000

Что-то надо добавить?
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

Никто не знает или не хочет рассказать?
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение menzoda »

Kolbaskin_Kirov писал(а):Никто не знает или не хочет рассказать?
В скрипте компоновщика для этой секции нужно назначить адрес загрузки (load address, должен быть в энергонезависимой памяти) и адрес исполнения (execution address, должен быть в оперативной памяти). Затем, перед переходом к основной программе, необходимо скопировать данные инициализации из энергонезависимой памяти в оперативную. Еще наверное можно поместить переменные в стандартную секцию (.data называется, если не ошибаюсь). Тога можно будет воспользоваться имеющимся алгоритмом инициализации, который выполняется в __main. В общем начни читать про load и execution адреса, там потихоньку до остального дойдешь.
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

Вот скаттер файл
Изображение
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение menzoda »

Ну хорошо, стандартный скрипт вроде бы подходит, осталось скопировать данные.
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

При объявлении переменных в RW области они лежат в конце прошивки и в RAM не переписываются. Как сделать, чтобы они там были? Можно и вручную переписать, а как сделать автоматом?
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение menzoda »

В энергонезависимой памяти лежат их начальные значения, сами они должны находиться в оперативной памяти, то есть blabla должен указывать на область 0x20000000 - 0x20001000.
Kolbaskin_Kirov писал(а):Можно и вручную переписать, а как сделать автоматом?
Ну я же все написал! Может всё же стоить НАЧАТЬ копать в указанном направлении, а не ждать, пока всё разжуют? В общем еще раз говорю. Можно попробовать вызвать __main из стандартной библиотеки, тем более, что её все равно так или иначе нужно вызывать. Если она определяет секции для копирования по атрибуту RW, то должно получиться. Если же она находит секцию для копирования по имени, например .data, то тогда необходимо назвать свою секцию этим же именем (вместо mydata), чтобы она её скопировала.

Если я ошибаюсь, и __main работает как-нибудь по-другому, то придется САМОМУ писать код, который будет САМ копировать данные. В любом случае, копирование будет происходить в коде, иначе НИКАК нельзя. Разве что только указать для секции mydata load address равным execution address, но это будет работать только при заливке ПО отладчиком, до первого выключения питания.
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

Подключить к проекту startup файл и библиотеку CMSIS ?
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение menzoda »

Нет, "C Run-Time Library". Она сама подключится, если в коде импортировать и вызвать __main. В стандартных startup уже есть вызов __main, так что можно или использовать стандартный startup, или подсмотреть, как в нем вызывается __main и сделать так же в своем.
Kolbaskin_Kirov
Родился
Сообщения: 11
Зарегистрирован: Вс мар 06, 2016 19:12:38

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Kolbaskin_Kirov »

С предыдущим вопросом разобрался. Теперь с прерываниями, вернее с выходом из него. В programming reference manual (ядро М0) написано, что при возникновении прерывания в стек автоматически сохраняются регистры r0-r3,r12,LR,PC и xPSR. Причем в регистр LR сохраняется некая константа EXC_RETURN, которая говорит, что это не обычная подпрограмма, а именно прерывание. С этим все ясно, не ясно другое: выход из прерывания возможен двумя командами - POP и BX.
1. Как использовать инструкцию POP для окончания прерывания? Что писать в reglist: регистры, которые сохраняются автоматически писать надо или нет? Добавлять ли в реглист РС?
2. По инструкции BX. Причем после ВХ надо указать регистр, в котором лежит адрес возврата. Непонятно что происходит дальше? Дальше выгружается стек и РС? Если так, то непонятно что происходит: адрес возврата есть в РС и адрес возврата в инструкции ВХ.
Ответить

Вернуться в «ARM»