Easyelectronics.ru

Электроника для всех
Текущее время: 25 ноя 2017, 01:28

Часовой пояс: UTC + 5 часов



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 19 июл 2017, 17:57 
Только пришел

Зарегистрирован: 19 июл 2017, 16:47
Сообщения: 6
Я изучаю STM32 почти с самого низкого уровня (в плане программирования): хотя и не на асме (это еще впереди), но без библиотек. Хочу разобраться, как происходит работа с регистрами, когда нет удобных констант для обращения к нужным адресам в памяти. Возникли проблемы. Вот что я хочу:

- Разобраться, что я делаю не так
- Научиться использовать отладчик для поиска проблем (есть опыт работы с OllyDbg, но это не совсем то)

У меня STM32VL Discovery, микросхема STM32F100RBT6B.
Я начал с мигания светодиодом (программа нииже не работает):

Код:

#define RCC_BASE 0x40021000
#define RCC_APB2ENR (RCC_BASE + 0x018)
#define GPIOC_BASE 0x40011000
#define GPIOC_CRL GPIOC_BASE
#define GPIOC_ODR (GPIOC_BASE + 0x0C)

void wait()
{
   volatile int i = 0x200000;
   while (i > 0) --i;
}

void main()
{
   *((volatile unsigned long *)RCC_APB2ENR) = 1 << 4;

   volatile unsigned long i = 0;
   ++i; ++i; ++i;
   i = 0;

   *((volatile unsigned long *)GPIOC_CRL) |= 0x1;

   while (1)
   {
      *((volatile unsigned long *)GPIOC_ODR) ^= 0x1
      wait();
   }
}


Теперь по порядку о том, как я считал адреса.

Для начала надо затактировать периферию на порте GPIOC. Диод подключен к PC0. Смотрю, где в памяти располягается RCC:

Изображение

Периферия GPIO подключена к шине APB2. Смотрю в Reference Manual, где находится APB2ENR: его смещение от начала RCC равно 0x18:

Изображение

Порт GPIOC четвертый, считая от нуля, поэтому я записываю 1 << 4 в APB2ENR (единица в четвертом бите), чтобы подать тактирование.

Теперь надо научиться управлять пином PC0. Он принадлежит младшей половине пинов, поэтому мне нужен регистр CLR:

Изображение

Поскольку диод на пине PC0, меня интересует вот это поле (или я ошибаюсь?):

Изображение

Для настройки порта GPIOC нужно записать биты 01 в нулевой и первый биты регистра CRL. То есть записываем туда число 0x1. Кроме того, смещение регистра CLR относительно базового адреса GPIOC равно нулю, поэтому по сути я записываю эти биты по базовому адресу порта GPIOC.

Теперь надо подать сигнал на ножку PC0. Для этого используется регистр ODR, который находится по смещению 0x0C:

Изображение

Прибавляю 0x0C к базовому адресу GPIOC, чтобы найти адрес регистра ODR.

Чтобы изменить состояние пина PC0 порта GPIOC, надо записать 0 или 1 в нулевой бит регистра GPIOC_ODR.

Теперь сборка программы:

Таблица прерываний без всего лишнего:

boot.s
Код:
.cpu cortex-m3
.thumb

.word _stack_base
.word main    /* Reset vector */
.word hang



.thumb_func
hang:   b .

.global hang


Файл для линкера, в котором я не понимаю значения констант:

Код:
_stack_base = 0x10002000;
_boot_checksum = 0 - (_stack_base + main + 1);

MEMORY
{
   rom(RX)     : ORIGIN = 0x00000000, LENGTH = 0x8000
   ram(WAIL) : ORIGIN = 0x10000000, LENGTH = 0x2000
}

SECTIONS
{
   .text : { *(.text*) } > rom
   .bss  : { *(.bss*)  } > ram
}


Кстати, где почитать о том, что это за файл, и как управлять линкером в таком роде?

Я написал такой Makefile:

Код:
all: main

main: boot.o main.o
   arm-none-eabi-ld -T mem.ld boot.o main.o -o main.elf
   arm-none-eabi-objcopy main.elf main.bin -O binary

boot.o: boot.S
   arm-none-eabi-as boot.S -o boot.o

main.o: main.c
   arm-none-eabi-gcc -c main.c

install: main.bin
   st-flash write main.bin 0x08000000
clean:
   rm -rf *.o main.elf main.bin


Прошиваю под ArchLinux при помощи st-flash и программатора ST-Link. После прошивки затерлась рабочая программа с применением CMSIS, которые я заливал Keil'ом, однако новая прошивка не зажигает диод.

Если прошить один раз, возникает сообщение об ошибке:

Код:
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Starting Flash write for VL/F0/F3 core id
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/flash_loader.c: Successfully loaded flash loader in sram
2016-10-11T09:06:56 ERROR /home/flanker/mydev/tools/stlink/src/flash_loader.c: flash loader run error
2016-10-11T09:06:56 ERROR /home/flanker/mydev/tools/stlink/src/common.c: stlink_flash_loader_run(0x8000000) failed! == -1
stlink_fwrite_flash() == -1


Если прошить второй раз, отображается сообщение об успехе, но снова ничего не работает:

Код:
2016-10-11T09:02:48 INFO /home/flanker/mydev/tools/stlink/src/flash_loader.c: Successfully loaded flash loader in sram
  5/5 pages written
2016-10-11T09:02:49 INFO /home/flanker/mydev/tools/stlink/src/common.c: Starting verification of write complete
2016-10-11T09:02:49 INFO /home/flanker/mydev/tools/stlink/src/common.c: Flash written and verified! jolly good!


Это не мои логи, но мои выглядят точно так же.

Что я делаю не так? Почему прошивка не работаеет? Как ее отладить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 19 июл 2017, 18:19 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 314
Откуда: дальнее надмосковье
Я бы все-таки CMSIS оставил, написать дефайны регистров вручную мозгов особо не добавляет, главное что Вы знаете как это делать.

А откуда Вы взяли такой минималистический скрипт компоновщика? ORIGIN у ROM должен быть 0x08000000, не? Стартап кода у Вас нет, будете использовать не read-only глобальные переменные - получите нерабочий код, потому что нужно в стартапе скопировать их из ROM в RAM.

Linker Script:
http://www.embedds.com/programming-stm3 ... er-script/
http://www.stf12.org/developers/freerot ... cript.html
http://www.emprog.com/support/documenta ... -guide.pdf


Последний раз редактировалось arm999 19 июл 2017, 18:30, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 19 июл 2017, 18:29 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 355
arm999 писал(а):
Я бы все-таки CMSIS оставил, написать дефайны регистров вручную мозгов особо не добавляет, главное что Вы знаете как это делать.

Естественно, там как раз определены все регистры и биты, при этом нет практически ничего лишнего.

Aoizora писал(а):
Что я делаю не так? Почему прошивка не работаеет? Как ее отладить?

Страдать подобной фигней конечно при большом желании можно, но сначала добейся работы со стандартными хедерами и скриптами линковщика, а потом постепенно подменяй их на свои.


Последний раз редактировалось Reflector 19 июл 2017, 18:46, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 19 июл 2017, 18:29 
Только пришел

Зарегистрирован: 19 июл 2017, 16:47
Сообщения: 6
arm999 писал(а):
А откуда Вы взяли такой минималистический скрит компоновщика? ORIGIN у ROM должен быть 0x08000000, не?


Отсюда: https://habrahabr.ru/post/189484/
Но там другая микросхема.
Тем не менее поковырять регистры в памяти полезно и добавляет понимание, а также дает удовольствие.

>ORIGIN у ROM должен быть 0x08000000, не?
Да, поправил, но это не помогло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 19 июл 2017, 18:38 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 314
Откуда: дальнее надмосковье
Вот хорошая книжка (+исходники), там все на STM32VL Discovery, как и у Вас. Глава "Skeleton Program", есть и linker script, и стартап, и прочее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 19 июл 2017, 23:05 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1079
мазохизм какой-то


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 20 июл 2017, 02:15 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 3390
А ида не мазохизм? ))))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 20 июл 2017, 02:25 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1079
Нет конечно. С Идой по любви.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 21 июл 2017, 01:59 
Старожил

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 280
Откуда: Санкт-Петербург
а мне вот эта статья понравилась
https://habrahabr.ru/post/274541/
так конечно цикл статей про ассемблер, но не в нем суть, а в том как автор рассказывает про компиляцию, линковку и т.д. что для чего и как использовать. в общем для общего образования достаточно любопытно. по крайней мере мне понравилось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не работает прошивка STM32VL, собранная руками
СообщениеДобавлено: 21 июл 2017, 02:35 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1079
Труд конечно большой проделан. Конечно кому-то понравится.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB