Начало работы с STM32 в Keil MDK-ARM

Статья посвящается Пановой Ксении.

Все картинки в этой статье кликабельны.

STM32 — это семейство 32-разрядных микроконтроллеров фирмы STMicroelectronics.

Микроконтроллеры содержат микропроцессорное ядро ARM, точнее ARM Cortex-M. Это ядро присуще не только микроконтроллерам STM32, оно существует само по себе, и на его основе выпускается множество микроконтроллеров от разных производителей.

Keil MDK-ARM (произносится «Кеил эм-ди-кей арм») — это среда разработки для микроконтроллеров с ядром ARM Cortex-M.

Читать далее Начало работы с STM32 в Keil MDK-ARM

Реклама

Такой код по разному воспринимается разными компиляторами:

const int data_size = 7;
int data[data_size] = {1,2,3,4,5,6,7};

Если использовать компилятор из Keil MDK-ARM, то код компилируется и работает нормально. Но компилятор (gcc) из Sourcery Сodebench выдает ошибку:

variable-sized object may not be initialized

При этом, без ошибок компилируется код:

const int data_size = 7;
int data[data_size];

MDK-ARM: замена десятичного разделителя

Чтобы локализовать представление чисел при программировании в среде MDK-ARM требуется выполнить несколько простых шагов:

  1. Скачать ассемблерный файл и добавить в свой проект.
  2. В настройках проекта на вкладке Asm в поле Include Paths указать каталог, в котором расположен файл rt_locale.s. По умолчанию этот файл расположен в «C:\Keil\ARM\ARMCC\include».

При этом в программе не требуется производить никаких настроек локали, например вызывать функцию setlocale, локаль будет жестко задана.

После этого функции (например printf) преобразующие число в строку и наоборот будут воспринимать запятую в качестве разделителя дробной и целой части.

Подробнее о реализации ассемблерного файла можно почитать в официальной документации на MDK-ARM. Стоит учесть, что в коде, приведенном в документации, есть недочет: отсутствует строчка экспортирующая функцию _get_lc_CATEGORY, в представленном здесь ассемблерном файле эта строчка: «EXPORT _get_lc_numeric». Без неё локализация не заработает.

Привожу код из ассемблерного файла.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Определение русского десятичного разделителя.
;
; Файл предназначен для программирования в среде Keil MDK-ARM.
;
; В настройках проекта на вкладке Asm в поле Include Paths
; требуется указать каталог, в котором расположен файл rt_locale.s.
; По умолчанию этот файл расположен в "C:\Keil\ARM\ARMCC\include".
;
; В программе не требуется вызывать функцию setlocale().

    GET rt_locale.s ; Подключить файл с макросами

    AREA locales, DATA, READONLY
    LC_NUMERIC_begin russian_numeric_locale, "russian"
    LC_NUMERIC_point ","     ; Десятичный разделитель
    LC_NUMERIC_thousands "." ; Разделитель групп цифр
    LC_NUMERIC_grouping "\3" ; Количество цифр в группе
    LC_NUMERIC_end
    AREA locale_func, CODE, READONLY
    EXPORT _get_lc_numeric
_get_lc_numeric FUNCTION
    LDR r0, =russian_numeric_locale_start
    BX lr
    ENDFUNC

    END ; Конец ассемблерного файла

ST-Link + MDK-ARM + Linux

Пользователям Linux, желающим программировать микроконтроллеры фирмы STM.

Будем использовать:

MDK-ARM прекрасно работает под wine. Чтобы не было проблем с кодировкой при комментировании в своей программе, надо в uVision в меню Edit выбрать пункт «Configuration…» и на вкладке «Editor» выбрать кодировку (Encoding) UTF-8: «Encode in UTF-8 without signature».

Чтобы разобраться с texane/stlink, скачаем его для начала:

  1. если не установлен git (кто не знает: система контроля версий, должна быть у каждого программиста), установим:
    sudo apt-get install git
    
  2. скачиваем texane/stlink с помощью git:
    git clone git://github.com/texane/stlink.git
    

Теперь собираем:

  1. Удовлетворяем зависимости:
    sudo apt-get install libusb-1.0 pkg-config libtool autoconf
    
  2. Собираем:
    cd stlink
    ./autogen.sh
    ./configure
    make
    

Не выходя из каталога stlink выполним пару команд:

sudo cp 49-stlinkv1.rules 49-stlinkv2.rules /etc/udev/rules.d
sudo udevadm control --reload-rules

чтобы у нас всегда был доступ к программатору ST-Link без прав суперпользователя.

Команда, чтобы прошить микроконтроллер:

~/stlink/st-flash write путь адрес

где:

  • путь — путь к двоичному файлу прошивки (*.bin),
  • адрес — шестнадцатеричный адрес в памяти (например, начало флеш-памяти в STM32: 0x08000000).

Утилита st-flash позволяет также считывать данные, если вместо write задать read и указать поcле адреса объем данных в байтах.

Получить двоичный файл можно средствами MDK-ARM. Чтобы при сборке проекта генерировался двоичный файл, добавляем в настройках проекта на вкладке User в секцию «Run User Programm After Build/Rebuild» строку:

FromElf.exe --bin --output путь_к_bin путь_к_axf

где:

  • путь_к_bin — путь к двоичному файлу, который будет генерироваться,
  • путь_к_axf — путь к стандартному файлу прошивки, который по умолчанию генерируется при сборке проекта.

На панели uVision имеется кнопка «Load» для загрузки прошивки в микроконтроллер. Настроим поведение этой кнопки. В настройках проекта на вкладке Utilities выбираем «Use external Tool for Flash programming» и в поле «Command» добавляем: load-firmware.sh. Ставим галочку «Run Independent», чтобы интерфейс не зависал. В папке проекта создаем файл load-firmware.sh и добавляем в него следующие строки:

#!/bin/bash
~/stlink/st-flash write путь адрес

подставив путь к двоичному файлу и адрес начала флеш-памяти программируемого микроконтроллера. Файл необходимо сделать исполняемым.

Асcемблер MDK-ARM

Язык ассемблера — это язык кода, который анализируется и собирается ассемблером (armasm) в итоговый объектный код.

Синтаксис строк на языке ассемблера

Общий вид строк:

{обозначение} {инструкция|директива|псевдоинструкция} {;комментарий}

Строка состоит из трех необязательных секций.

обозначение — обычно, это метка. С инструкциями и псевдоинструкциями — всегда метка. С некоторыми директивами — обозначение переменной или константы.

Для облегчения чтения кода, длинная строка может быть разбита на несколько строк с помощью обратной косой черты (\) как на языке С. За обратной косой чертой не должны следовать любые другие символы (включая пробелы и табуляции).

Также можно использовать пустые строки для улучшения читаемости.

Ограничение строки составляет 4095 символов. Строка, разбитая обратными косыми чертами, имеет то же ограничение.

Литеры

Литеры могут выражаться:

  • Десятичными числами, например 123
  • Шестнадцатеричными числами, например 0x7B
  • Числами с любым основанием от 2 до 9 включительно, например 5_204 — число 204 с основанием 5
  • Числами с плавающей точкой, например 123.4
  • Логическими значениями: {TRUE} или {FALSE}
  • Одиночным символом, заключенным в одинарные кавычки, например 'w'
  • Строкой, заключенной в дойные кавычки, например "This is a string"
В большинстве случаев, строка, содержащая один символ, считается одиночным символом. Например ADD r0,r1,#"a" — верно, но ADD r0,r1,#"ab" — ошибка.