пʼятницю, 31 серпня 2018 р.

stm8 toolchain під Linux

stm8 ST-Link v2 sdcc
Недавно я зацікавився мікроконтролерами stm8. Це чудові сучасні контролери. Особливо приваблювала можливість повноцінного внутрішньо-схемного відлагодження та відсутність фьюз-бітів, як в AVR. Щодо інструментарію розробника - то під Windows ситуація цілком зрозуміла: ST Visual Develop + С компілятор від Cosmic задовільно працюють з коробки. А от під Linux все виявилось не так гладко. Про налаштування інструментарію для stm8 під Linux і піде мова у цьому пості.

У якості апаратного забезпечення буду використовувати китайський клон ST-Link v2 у зв"язці разом із тестовим мікроконтролером stm8f103f2. Програматор ST-Link v2 та тестові плати з stm8 чіпами можна замовити напряму у китайців, і коштують вони в межах кількох доларів. Всі програми я буду ставити на Ubuntu 18.04 LTS (насправді Lubuntu, але для нас це не має принципового значення).

Оскільки програмуванням в Linux середовищі, як правило, займаються люди з певним досвідом, тому будемо вважати, що на машині вже встановлені всі базово-необхідні інструменти. А також, що в разі їх відсутності, користувач легко зможе їх встановити. Надалі я буду описувати лише інструментарій для stm8. В будь-якому випадку вам знадобляться пакунки
gcc g++ make cmake bison flex libboost-all-dev gputils texinfo git 
libusb-1.0 libtool pkg-config autoconf automake
Варто заздалегідь перевірити їх наявність і доставити те, чого не вистачає.

Перш за все встановимо компілятор sdcc (http://sdcc.sourceforge.net/). Річ у тім, що наявний у репозитарії sdcc версії 3.6.0 для stm8 може генерувати лише бінарні файли у форматах .ihx та .s19. Нам же для відлагодження будуть потрібні ще й .elf файли. На щастя, у версії 3.7.0 така можливість вже додана. Але доведеться збирати компілятор sdcc вручну. Тому йдемо на https://sourceforge.net/projects/sdcc/files/ і викачуємо архів з вихідними файлами, розпаковуємо їх та збираємо.
./configure
make
sudo make install
Для подальших тестів нам знадобиться простенький main.c, в якому запрограмоване блимання світлодіода.
#define PB_ODR *(unsigned char*)0x5005
#define PB_DDR *(unsigned char*)0x5007
#define PB_CR1 *(unsigned char*)0x5008

void sleep(unsigned int ticks)
{
    for(; ticks; ticks--);
}

void blink(unsigned int delay)
{
    for(int i = 0; i < 7; i++) {
        PB_ODR = ~PB_ODR;
        sleep(delay);
    }
}

int main()
{
    PB_DDR = 0xFF;
    PB_CR1 = 0xFF;
    
    while(1) {
        blink(50000);
        blink(150000);
    }
}

Перевіряємо компілятор sdcc.
sdcc -mstm8 --debug --stack-auto --all-callee-saves --out-fmt-ihx ./main.c
sdcc -mstm8 --debug --stack-auto --all-callee-saves --out-fmt-elf ./main.c
В результаті маємо отримати main.ihx та main.elf.

Для прошивки мікроконтролерів stm8 будемо використовувати утиліту stm8flash (https://github.com/vdudouyt/stm8flash). І знову доведеться збирати із сирців.
git clone https://github.com/vdudouyt/stm8flash.git
cd stm8flash/
make
sudo make install
cd ..

Тепер пробуємо залити у мікроконтроллер тестову прошивку отриману під час перевірки sdcc
sudo stm8flash -c stlinkv2 -p stm8s103f2 -s flash -w main.ihx

Наступний крок - це збірка stm8-binutils (https://stm8-binutils-gdb.sourceforge.io/). Цей пакунок включає в себе модифікований GDB для stm8 та інші корисні інструменти. Качаємо архів (https://sourceforge.net/projects/stm8-binutils-gdb/files/cygwin/) та розпаковуємо його. Далі збираємо.
./patch_binutils.sh
./configure_binutils.sh
cd binutils-2.30
make
sudo make install
cd ..

Залишилось встановити OpenOCD - це програмний прошарок між дебагером та ST-Link v2. Але, на жаль, підтримка stm8 платформи доступна лише в розробницькій версії.
git clone https://github.com/ntfreak/openocd.git
./bootstrap
./configure
make
sudo make install

Перевіряємо, чи працює відлагодження в консольномо варіанті. Для цього спочатку запускаємо сервер OpenOCD
sudo openocd -f interface/stlink.cfg -f \
target/stm8s.cfg -c "init" -c "reset halt"

Якщо сервер запустився без помилок, у консолі маємо побачити щось подібне
Open On-Chip Debugger 0.10.0+dev-00523-g2a3b709a (2018-08-30-23:48)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
adapter speed: 1 kHz
srst_only separate srst_gates_jtag srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 1 kHz, using 5 kHz
Info : Unable to match requested speed 1 kHz, using 5 kHz
Info : clock speed 5 kHz
Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.262475
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, pc: 0x00008000
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections

Тепер відкриваємо ще один термінал і запускаємо у ньому stm8-gdb вказавши як параметр попередньо зібраний main.elf
stm8-gdb main.elf

GNU gdb (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=stm8-none-elf32".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main.elf...done.
(gdb) 

Запускаємо відлагодження
(gdb) start
Temporary breakpoint 1 at 0x8058: file ./main.c, line 23.
Starting program: /home/yura/stm8-tools/code/main.elf 
Remote debugging using localhost:3333
main () at ./main.c:23
23        PB_DDR = 0xFF;
Loading section HOME, size 0x7 lma 0x8000
Loading section GSINIT, size 0x1a lma 0x8007
Loading section GSFINAL, size 0x3 lma 0x8021
Loading section CODE, size 0x51 lma 0x8024
Loading section SSEG, size 0x1 lma 0xffffffff
Start address 0x8007, load size 118
Transfer rate: 50 bytes/sec, 23 bytes/write.
(gdb) 
Temporary breakpoint 1, main () at ./main.c:23
23        PB_DDR = 0xFF;
(gdb) 

GDB автоматично ставить брейкпоінт на функції main та зупиняє виконання на ньому. Продовжуємо виконання командою continue
(gdb) continue
Continuing.

Для зупинки натискаємо Ctrl+C
Program received signal SIGINT, Interrupt.
0x00008027 in sleep (ticks=18928) at ./main.c:8
8        for(; ticks; ticks--);
(gdb) 

Переконавшись, що все працює як належить, припиняємо роботу GDB
(gdb) q
A debugging session is active.

    Inferior 1 [Remote target] will be detached.

Quit anyway? (y or n) y 

Отже, підсумуємо. Ми маємо компілятор, утиліту для прошивки та консольний відлагоджувач. Такий набір дозволяє навіть написати простеньку прошивку, але про зручність розробки з консольним GDB, звісно, не йдеться.

На цьому перша частина налаштування інструментарію завершена. В наступній частині я розповім як налаштувати QtCreator для роботи у зв"язці з sdcc та stm8-gdb. В результаті ми отримаємо повноцінне IDE з усіма вигодами.

Немає коментарів:

Дописати коментар