воскресенье, 2 апреля 2017 г.

Maple mini. Первая программа и пробуем дебаггер.

Дебаг как и старые игры... не такой уж и страшный...
Под виндовс есть куча сред разработки для STM32 и из этого разнообразия тяжело выбрать что-то одно. Начать я решил со всеми любимого IAR, но есть минус - платный, из плюсов - существует бесплатная версия + хорошая поддрежка этой среды.


Предисловие.


В STM32, так же как и в AVR микроконтроллерах балом правили регистры. Все регистры растасованны по определенным адресам, в башке их удержать невозможно - им дали названия. Для это в библотеке CMSIS, названия регистров и их адреса связали и закинули в структуры + обеспечили удобную работу с ними, но об этом в других статьях.

В последних версиях IAR библиотека CMSIS встроена, поэтому не все файлы библиотеки нужны для проекта. У меня IAR версией 7.5.

Первый проект.


После установки, запускаем IAR.
Project -> Create New Project.
Выбираем вкладочку C и жмем на main.c и выбираем папочку для проекта.

Слева вверху под Workspace можно увидить слово Debug с выпадающим меню, в котором можно выбрать Release. Эта два разных режима разработки, которые имеют свою конфигурацию, первый нацелен на процесс дебага без создания скомпилированных файлов, второй рассчитан конкретно на релиз версию продукта - то есть создает скомпилированные файлы прошивки. Оставляем Debug и попробуем его сконфигурировать.

Жмем правой клавишой на названии проекта в окошке Workspace далее Options...
В категории General Option, в вкладке Target жмем Device и выбираем чип из списка. Я выбрал STM32F103xB. В Library Configuration ставим галочку в Use CMSIS.

Настраиваем дебаггер. Категория Debugger. Вкладка Download, ставим галочки у Use Flash Loader(s) (опцию Override default не трогаем)  и Verify Download. Далее смотрим подпункт Driver выбираем ST-LINK, потом в категории ST-LINK выбираем SWD.

В категории Linker, в вкладке Config, можно переписать стандартный файл конфигурации линковщика. Здесь можно настроить, адрес памяти таблицы векторов, диапазон памяти RAM, ROM, а также размер стека и кучи. В эти настройки особо лучше не лезть, кроме размера стека и кучи, но об этом еще пока рано говорить. Проверели что все адреса в порядке идем дальше.

Теперь нужно подключить файлы CMSIS библиотеки. В папочку проекта забрасываем файлики stm32f10x.h, system_stm32f10x.h, system_stm32f10x.c, startup_stm32f10x_md.s. Для старых версий IAR нужны еще core_cm3.c и core_cm3.h. Все их можно найти в архиве скачанной CMSIS. Потом опять жмем правой клавишей на названии проекта -> Add -> Add Files... и выбираем эти файлики.

Теперь выбираем группу чипов для CMSIS библиотеки. Категория C/C++ Compiler, вкладка Preprocessor, в Defined Symbols добавляем "STM32F10X_MD" - добавляем без КАВЫЧЕК, пробелов. Для подробностей почитай код с 65 строки stm32f10x.h файла.

Все, теперь можно писать текст программы.

Первая программа.


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

    main.c:
#include "stm32f10x.h"
void main(void) {  
  //Enabling clock for GPIOC
  RCC->APB2ENR|=RCC_APB2ENR_IOPBEN;
  //Configuring GPIO1 as push-pull output
  GPIOB->CRL &=~(GPIO_CRL_CNF1_0);
  //GPIOB->CRL &=~(GPIO_CRL_CNF1_1);
  //and set max output speed:
  GPIOB->CRL |= (GPIO_CRL_MODE1_1);
  GPIOB->CRL |= (GPIO_CRL_MODE1_0); 
  while (1) {
      GPIOB->BSRR = GPIO_BSRR_BS1;
      GPIOB->BSRR = GPIO_BSRR_BR1;
  }
}

Сохраняем. Делаем make нажимая F7.

Некоторые сложности.


В новых версиях IAR может появиться warning:
Warning[25]: Label 'NMI_Handler' is defined pubweak in a section implicitly declared root startup_stm32f10x_md.s 132
В таких случаях, нужно в startup_stm32f10x_md.s (не забудь убрать галочку с атрибута "Только чтение") нужно подобавлять :NOROOT. То есть:
было:
PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER(1)
стало:
PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)

Дебаг.


Жмем Ctrl+D, ждем когда прошивка зальется в память и вуаля - зелёненькая строчка появилась в тексте программы.

Тот самый дебаг

Жмем F10 для перемещения по программе. Теперь можно наблюдать когда светодиод загорается, а когда гаснет.

Послесловие.


Отладка очень важная часть разработки любой программы. Уметь дебажить очень важный шаг, который должен быть освоен как можно раньше. В следующей статье попытаюсь более подробно разобраться с CMSIS и побаловаться с портами ввода/вывода.

Комментариев нет:

Отправить комментарий