Stm32 iar – IAR Workbench – IDE для STM32

IAR + CMSIS — DiMoon Electronics

Это вторая часть цикла статей про микроконтроллеры STM32F1xxx, начало тут. Здесь мы поговорим о библиотеке CMSIS, зачем она нужна, где взять и как ее подключить к своему проекту. Все стати цикла будут находиться здесь: http://dimoon.ru/category/obuchalka/stm32f1

Введение

Cortex Microcontroller Software Interface Standard (CMSIS) содержит описание всех регистров микроконтроллера, таблицу векторов прерываний и некоторый стартовый код, который выполняется перед передачей управления функции main(). Вообще говоря, СMSIS является необязательным компонентом проекта, однако, в этом случае придется самому заботиться об огромном количестве вещей. Кроме того, эта библиотека позволяет писать в некоторой степени переносимый код с одного микроконтроллера, на другой.

Качаем CMSIS

В данный момент CMSIS поставляется совместно с STM32Cube MCU Package. Скачать его можно на странице выбранного микроконтроллера (там, где качали даташит, Reference manual и так далее), называется STM32CubeF1:

Для скачивания нужно зарегистрироваться у них на сайте. Феее, ну и нафига они это сделали?:\ Оставлю ка я ссылку на архив в конце статьи, чтоб не возится во всеми этими регистрациями. Но все же лучше скачать актуальную версию библиотеки на официальном сайте. Весит архив к стати довольно много, 97 метров.

Создаем проект в IAR ARM

Теперь проводим небольшую подготовительную работу по созданию проекта в IAR ARM. Запускаем среду IAR Embedded Workbench:

В IAR-e все проекты (Projects) находятся внутри Workspace-а, причем количество проектов в одном воркспейсе может быть несколько.

Выбираем Project->Create New Project…

В открывшемся окне выбираем тип проекта: C->main:

Нажимаем ОК, набираем какое-нибудь имя (в моем случае test_proj) и сохраняем в какой-нибудь папке:

Проект создан. После этого выбираем File->Save All и в открывшемся окне набираем имя нашего Workspace-а, его можно назвать так же, как и проект.

Теперь нам надо настроить проект под конкретный микроконтроллер, а именно STM32F103C8. Нажимаем правой кнопкой мыши на названии нашего проекта и выбираем пункт Options…

В разделе General Options на вкладке Target выбираем наш микроконтроллер:

Далее настаиваем уровень оптимизации компиляции. При отладке иногда натыкался на некоторые проблемы при высоком уровне оптимизации, поэтому советую в C/C++ Compiler на вкладке Optimizations ставить None или на крайняк Low:

Складывать все файлы исходников в корень проекта не очень хорошая идея, в дальнейшем будет трудно ориентироваться среди кучи файлов, поэтому для CMSIS создадим одноименную папку CMSIS . Но нам необходимо указать компилятору путь, где искать исходники. Для этого на вкладке Preprocessor надо указать путь к папке с библиотекой. Чтоб не указывать абсолютные пути, в IAR-е существует переменная $PROJ_DIR$, в которой хранится путь к папке с проектом:

$PROJ_DIR$\
$PROJ_DIR$\CMSIS\



$PROJ_DIR$\

$PROJ_DIR$\CMSIS\

Первая строчка указывает на корень проекта, где лежит main.c, это вроде как не обязательно, но пусть будет, вторая на будущую папку с CMSIS. Обращаем внимание на стрелки прокрутки вкладок, выделил синим:

Теперь отладчик. В разделе Debugger на вкладке Setup выбираем ST-LINK, который идет в комплекте с отладочными платами Discovery:

и на вкладке Download ставим галочку Use flash loader(s):

После этого в разделе ST-LINK выбираем тип интерфейса подключения, у нас по SWD:

Фух, проект настроили. Нажимаем OK для сохранения изменений.

После этого идем в каталог с проектом и создаем там папку CMSIS, в нее мы будем складывать файлы библиотеки CMSIS:

Библиотека CMSIS

Архив с STM32CubeF1 скачали, разархивировали. В нем содержится много разных вещей: документация, примеры для отладочных плат, драйверы HAL и сам CMSIS, который нам и нужен. CMSIS расположен в .\STM32Cube_FW_F1_V1.6.0\Drivers\CMSIS.

Вначале идем в .\CMSIS\Device\ST\STM32F1xx\Include:

У нас тут куча .h файлов для разных микроконтроллеров, но чего-нибудь наподобие stm32f103x8.h не видно. Открываем stm32f1xx.h. Там есть вот такая вещь:

#if !defined (STM32F100xB) && !defined (STM32F100xE) && !defined (STM32F101x6) && \
!defined (STM32F101xB) && !defined (STM32F101xE) && !defined (STM32F101xG) && !defined (STM32F102x6) && !defined (STM32F102xB) && !defined (STM32F103x6) && \
!defined (STM32F103xB) && !defined (STM32F103xE) && !defined (STM32F103xG) && !defined (STM32F105xC) && !defined (STM32F107xC)
/* #define STM32F100xB */ /*!< STM32F100C4, STM32F100R4, STM32F100C6, STM32F100R6, STM32F100C8, STM32F100R8, STM32F100V8, STM32F100CB, STM32F100RB and STM32F100VB */
/* #define STM32F100xE */ /*!< STM32F100RC, STM32F100VC, STM32F100ZC, STM32F100RD, STM32F100VD, STM32F100ZD, STM32F100RE, STM32F100VE and STM32F100ZE */
/* #define STM32F101x6 */ /*!< STM32F101C4, STM32F101R4, STM32F101T4, STM32F101C6, STM32F101R6 and STM32F101T6 Devices */
/* #define STM32F101xB */ /*!< STM32F101C8, STM32F101R8, STM32F101T8, STM32F101V8, STM32F101CB, STM32F101RB, STM32F101TB and STM32F101VB */
/* #define STM32F101xE */ /*!< STM32F101RC, STM32F101VC, STM32F101ZC, STM32F101RD, STM32F101VD, STM32F101ZD, STM32F101RE, STM32F101VE and STM32F101ZE */
/* #define STM32F101xG */ /*!< STM32F101RF, STM32F101VF, STM32F101ZF, STM32F101RG, STM32F101VG and STM32F101ZG */
/* #define STM32F102x6 */ /*!< STM32F102C4, STM32F102R4, STM32F102C6 and STM32F102R6 */
/* #define STM32F102xB */ /*!< STM32F102C8, STM32F102R8, STM32F102CB and STM32F102RB */
/* #define STM32F103x6 */ /*!< STM32F103C4, STM32F103R4, STM32F103T4, STM32F103C6, STM32F103R6 and STM32F103T6 */
/* #define STM32F103xB */ /*!< STM32F103C8, STM32F103R8, STM32F103T8, STM32F103V8, STM32F103CB, STM32F103RB, STM32F103TB and STM32F103VB */
/* #define STM32F103xE */ /*!< STM32F103RC, STM32F103VC, STM32F103ZC, STM32F103RD, STM32F103VD, STM32F103ZD, STM32F103RE, STM32F103VE and STM32F103ZE */
/* #define STM32F103xG */ /*!< STM32F103RF, STM32F103VF, STM32F103ZF, STM32F103RG, STM32F103VG and STM32F103ZG */
/* #define STM32F105xC */ /*!< STM32F105R8, STM32F105V8, STM32F105RB, STM32F105VB, STM32F105RC and STM32F105VC */
/* #define STM32F107xC */ /*!< STM32F107RB, STM32F107VB, STM32F107RC and STM32F107VC */
#endif


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#if !defined (STM32F100xB) && !defined (STM32F100xE) && !defined (STM32F101x6) && \

    !defined (STM32F101xB) && !defined (STM32F101xE) && !defined (STM32F101xG) && !defined (STM32F102x6) && !defined (STM32F102xB) && !defined (STM32F103x6) && \

    !defined (STM32F103xB) && !defined (STM32F103xE) && !defined (STM32F103xG) && !defined (STM32F105xC) && !defined (STM32F107xC)

  /* #define STM32F100xB  */   /*!< STM32F100C4, STM32F100R4, STM32F100C6, STM32F100R6, STM32F100C8, STM32F100R8, STM32F100V8, STM32F100CB, STM32F100RB and STM32F100VB */

  /* #define STM32F100xE */    /*!< STM32F100RC, STM32F100VC, STM32F100ZC, STM32F100RD, STM32F100VD, STM32F100ZD, STM32F100RE, STM32F100VE and STM32F100ZE */

  /* #define STM32F101x6  */   /*!< STM32F101C4, STM32F101R4, STM32F101T4, STM32F101C6, STM32F101R6 and STM32F101T6 Devices */

  /* #define STM32F101xB  */   /*!< STM32F101C8, STM32F101R8, STM32F101T8, STM32F101V8, STM32F101CB, STM32F101RB, STM32F101TB and STM32F101VB */

  /* #define STM32F101xE */    /*!< STM32F101RC, STM32F101VC, STM32F101ZC, STM32F101RD, STM32F101VD, STM32F101ZD, STM32F101RE, STM32F101VE and STM32F101ZE */

  /* #define STM32F101xG  */   /*!< STM32F101RF, STM32F101VF, STM32F101ZF, STM32F101RG, STM32F101VG and STM32F101ZG */

  /* #define STM32F102x6 */    /*!< STM32F102C4, STM32F102R4, STM32F102C6 and STM32F102R6 */

  /* #define STM32F102xB  */   /*!< STM32F102C8, STM32F102R8, STM32F102CB and STM32F102RB */

  /* #define STM32F103x6  */   /*!< STM32F103C4, STM32F103R4, STM32F103T4, STM32F103C6, STM32F103R6 and STM32F103T6 */

  /* #define STM32F103xB  */   /*!< STM32F103C8, STM32F103R8, STM32F103T8, STM32F103V8, STM32F103CB, STM32F103RB, STM32F103TB and STM32F103VB */

  /* #define STM32F103xE */    /*!< STM32F103RC, STM32F103VC, STM32F103ZC, STM32F103RD, STM32F103VD, STM32F103ZD, STM32F103RE, STM32F103VE and STM32F103ZE */

  /* #define STM32F103xG  */   /*!< STM32F103RF, STM32F103VF, STM32F103ZF, STM32F103RG, STM32F103VG and STM32F103ZG */

  /* #define STM32F105xC */    /*!< STM32F105R8, STM32F105V8, STM32F105RB, STM32F105VB, STM32F105RC and STM32F105VC */

  /* #define STM32F107xC  */   /*!< STM32F107RB, STM32F107VB, STM32F107RC and STM32F107VC */  

#endif

Обращаем внимание на строчку:

/* #define STM32F103xB */ /*!< STM32F103C8, STM32F103R8, STM32F103T8, STM32F103V8, STM32F103CB, STM32F103RB, STM32F103TB and STM32F103VB */



/* #define STM32F103xB  */   /*!< STM32F103C8, STM32F103R8, STM32F103T8, STM32F103V8, STM32F103CB, STM32F103RB, STM32F103TB and STM32F103VB */

Ага, STM32F103C8 тут есть. Значит для нашего микроконтроллера подойдут исходники, от B версии: STM32F103xB. Запомним это. Из этой папки копируем в CMSIS проекта следующие файлы:

stm32f1xx.h
stm32f103xb.h
system_stm32f1xx.h



stm32f1xx.h

stm32f103xb.h

system_stm32f1xx.h

Далее переходим в .\CMSIS\Device\ST\STM32F1xx\Source\Templates и отсюда забираем файл system_stm32f1xx.c

После нам нужен стартап-файл. Заходим в .\CMSIS\Device\ST\STM32F1xx\Source\Templates\iar. Там нас так же ждет большое количество файлов и мы так же ищем тот, который оканчивается на xBstartup_stm32f103xb.s. Копируем его в $PROJ_DIR$\CMSIS\.

Затем переходим в .\CMSIS\Include и забираем вот эти 3 файла:

core_cm3.h
core_cmFunc.h
core_cmInstr.h



core_cm3.h

core_cmFunc.h

core_cmInstr.h

Так как в STM32F103C8 микропроцессорное ядро Cortex M3, то и берем соответствующие исходники.

Итого 8 файлов:

  1. stm32f1xx.h
  2. stm32f103xb.h
  3. system_stm32f1xx.h
  4. system_stm32f1xx.c
  5. startup_stm32f103xb.s
  6. core_cm3.h
  7. core_cmFunc.h
  8. core_cmInstr.h

Вот так это должно выглядеть в папке $PROJ_DIR$\CMSIS:

Теперь эти файлы надо добавить в обозреватель проекта в IAR-е. Для удобства создадим группу с одноименным названием CMSIS. Нажимаем правой кнопкой мыши на названии проекта и выбираем Add->Add Group…

Вводим название группы и нажимаем OK:

После этого в группу CMSIS добавляем файлы из папки CMSIS:

В открывшемся диалоге выбираем все файлы и нажимаем Открыть:

В результате получаем вот это:

После этого открываем файл stm32f1xx.h и раскомментируем стоку с #define STM32F103xB:

#if !defined (STM32F100xB) && !defined (STM32F100xE) && !defined (STM32F101x6) && \
!defined (STM32F101xB) && !defined (STM32F101xE) && !defined (STM32F101xG) && !defined (STM32F102x6) && !defined (STM32F102xB) && !defined (STM32F103x6) && \
!defined (STM32F103xB) && !defined (STM32F103xE) && !defined (STM32F103xG) && !defined (STM32F105xC) && !defined (STM32F107xC)
/* #define STM32F100xB */ /*!< STM32F100C4, STM32F100R4, STM32F100C6, STM32F100R6, STM32F100C8, STM32F100R8, STM32F100V8, STM32F100CB, STM32F100RB and STM32F100VB */
/* #define STM32F100xE */ /*!< STM32F100RC, STM32F100VC, STM32F100ZC, STM32F100RD, STM32F100VD, STM32F100ZD, STM32F100RE, STM32F100VE and STM32F100ZE */
/* #define STM32F101x6 */ /*!< STM32F101C4, STM32F101R4, STM32F101T4, STM32F101C6, STM32F101R6 and STM32F101T6 Devices */
/* #define STM32F101xB */ /*!< STM32F101C8, STM32F101R8, STM32F101T8, STM32F101V8, STM32F101CB, STM32F101RB, STM32F101TB and STM32F101VB */
/* #define STM32F101xE */ /*!< STM32F101RC, STM32F101VC, STM32F101ZC, STM32F101RD, STM32F101VD, STM32F101ZD, STM32F101RE, STM32F101VE and STM32F101ZE */
/* #define STM32F101xG */ /*!< STM32F101RF, STM32F101VF, STM32F101ZF, STM32F101RG, STM32F101VG and STM32F101ZG */
/* #define STM32F102x6 */ /*!< STM32F102C4, STM32F102R4, STM32F102C6 and STM32F102R6 */
/* #define STM32F102xB */ /*!< STM32F102C8, STM32F102R8, STM32F102CB and STM32F102RB */
/* #define STM32F103x6 */ /*!< STM32F103C4, STM32F103R4, STM32F103T4, STM32F103C6, STM32F103R6 and STM32F103T6 */
#define STM32F103xB /*!< STM32F103C8, STM32F103R8, STM32F103T8, STM32F103V8, STM32F103CB, STM32F103RB, STM32F103TB and STM32F103VB */
/* #define STM32F103xE */ /*!< STM32F103RC, STM32F103VC, STM32F103ZC, STM32F103RD, STM32F103VD, STM32F103ZD, STM32F103RE, STM32F103VE and STM32F103ZE */
/* #define STM32F103xG */ /*!< STM32F103RF, STM32F103VF, STM32F103ZF, STM32F103RG, STM32F103VG and STM32F103ZG */
/* #define STM32F105xC */ /*!< STM32F105R8, STM32F105V8, STM32F105RB, STM32F105VB, STM32F105RC and STM32F105VC */
/* #define STM32F107xC */ /*!< STM32F107RB, STM32F107VB, STM32F107RC and STM32F107VC */
#endif


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#if !defined (STM32F100xB) && !defined (STM32F100xE) && !defined (STM32F101x6) && \

    !defined (STM32F101xB) && !defined (STM32F101xE) && !defined (STM32F101xG) && !defined (STM32F102x6) && !defined (STM32F102xB) && !defined (STM32F103x6) && \

    !defined (STM32F103xB) && !defined (STM32F103xE) && !defined (STM32F103xG) && !defined (STM32F105xC) && !defined (STM32F107xC)

  /* #define STM32F100xB  */   /*!< STM32F100C4, STM32F100R4, STM32F100C6, STM32F100R6, STM32F100C8, STM32F100R8, STM32F100V8, STM32F100CB, STM32F100RB and STM32F100VB */

  /* #define STM32F100xE */    /*!< STM32F100RC, STM32F100VC, STM32F100ZC, STM32F100RD, STM32F100VD, STM32F100ZD, STM32F100RE, STM32F100VE and STM32F100ZE */

  /* #define STM32F101x6  */   /*!< STM32F101C4, STM32F101R4, STM32F101T4, STM32F101C6, STM32F101R6 and STM32F101T6 Devices */

  /* #define STM32F101xB  */   /*!< STM32F101C8, STM32F101R8, STM32F101T8, STM32F101V8, STM32F101CB, STM32F101RB, STM32F101TB and STM32F101VB */

  /* #define STM32F101xE */    /*!< STM32F101RC, STM32F101VC, STM32F101ZC, STM32F101RD, STM32F101VD, STM32F101ZD, STM32F101RE, STM32F101VE and STM32F101ZE */

  /* #define STM32F101xG  */   /*!< STM32F101RF, STM32F101VF, STM32F101ZF, STM32F101RG, STM32F101VG and STM32F101ZG */

  /* #define STM32F102x6 */    /*!< STM32F102C4, STM32F102R4, STM32F102C6 and STM32F102R6 */

  /* #define STM32F102xB  */   /*!< STM32F102C8, STM32F102R8, STM32F102CB and STM32F102RB */

  /* #define STM32F103x6  */   /*!< STM32F103C4, STM32F103R4, STM32F103T4, STM32F103C6, STM32F103R6 and STM32F103T6 */

#define STM32F103xB     /*!< STM32F103C8, STM32F103R8, STM32F103T8, STM32F103V8, STM32F103CB, STM32F103RB, STM32F103TB and STM32F103VB */

  /* #define STM32F103xE */    /*!< STM32F103RC, STM32F103VC, STM32F103ZC, STM32F103RD, STM32F103VD, STM32F103ZD, STM32F103RE, STM32F103VE and STM32F103ZE */

  /* #define STM32F103xG  */   /*!< STM32F103RF, STM32F103VF, STM32F103ZF, STM32F103RG, STM32F103VG and STM32F103ZG */

  /* #define STM32F105xC */    /*!< STM32F105R8, STM32F105V8, STM32F105RB, STM32F105VB, STM32F105RC and STM32F105VC */

  /* #define STM32F107xC  */   /*!< STM32F107RB, STM32F107VB, STM32F107RC and STM32F107VC */  

#endif

Далее пишем следующий main:

#include «stm32f1xx.h»

int main()
{
return 0;
}



#include «stm32f1xx.h»

 

int main()

{

  return 0;

}

Выбираем Project->Make. Если все сделали правильно, то получаем сообщение об успешной компиляции проекта:

Вот мы и научились подключать CMSIS к нашему проекту. В следующей статье мы продолжим изучение микроконтроллеров STM32 😉 Продолжение тут.

Ссылки:

STM32CubeF1: https://yadi.sk/d/E0BHVVrj3ZuZ9o

Пустой проект для STM32F103C8 на GitHub: https://github.com/DiMoonElec/stm32f103c8_empty_project

Все статьи цикла: http://dimoon.ru/category/obuchalka/stm32f1

dimoon.ru

Установка IAR

 

Мы продолжаем изучение программирования микроконтроллеров STM32.
 

 
Прежде всего познакомимся с фирмой производителем — ST Microelectronics.

Переходим в раздел Products -> Microcontrollers. Выбираем вкладку STM32 ARM Cortex.

Фирма ST производит микроконтроллеры STM32 в трех основных сегментах:

  • Ультранизкопотребляющие
  • Общего назначения
  • Высокопроизводительные.

На данной схеме указано соответствие названия микроконтроллера и ядра ARM Cortex, примененного в нем.

Микроконтроллер STM32F303VCT6, с которым нам предстоит познакомиться поближе, стоит в самой середине указанной схемы и может работать на тактовой частоте до 72 МГц. Производительность микроконтроллера оценена в 90 миллионов операций в секунду.

На страницах с описанием микроконтроллеров каждого семейства обозначены основные периферийные модули, а также приведены базовые линейки микроконтроллеров этого семейства.

Зайдем на страницу линейки STM32F303 и посмотрим на позиционирование микроконтроллеров в зависимости от объема Flash-памяти программ и корпусного исполнения. Микроконтроллер STM32F303VC обладает объемом Flash памяти 256 килобайт и конструктивно выполнен в 100-выводном корпусе. На отладочной плате установлен корпус LQFP.

На странице микроконтроллера имеется обзорная документация на соответствующий микроконтроллер – так называемый Data Sheet.
Скачиваем его.
Здесь приведены основные технические характеристики микроконтроллера, его внутренняя структура, цоколевка или назначение выводов корпуса микроконтроллера, а также особенности подключения и использования периферийных модулей. К сожалению, вся документация – на чистейшем английском языке.
Кроме того, нам может потребоваться руководство по использованию микроконтроллера – Reference Manual, которое, как правило, является общим для всего семейства микроконтроллеров. Здесь уже содержится более 1000 страниц с описанием различных режимов работы периферийных модулей и настройки служебных регистров для их использования.

Из документов нам еще понадобится документация на саму отладочную плату Discovery. Найти ее можно по этой ссылке. И скачиваем на эту плату руководство пользователя – User Manual, где в конце приводится принципиальная схема, содержащая все подключения элементов на плате.

 

Установка IAR

Для установки средств разработки выбираем вкладку STM32 Software Development Tools.
При выборе средств разработки мы остановимся на программном пакете IAR. Переходим на сайт IAR. Проходим по ссылке Tools for ARM. Раскрываем меню Download a free trial и
загружаем программу.

Пакет IAR может использоваться в двух режимах – это

  • режим 30-дневной полнофункциональной версии
  • режим с ограничением по объему компилируемого кода.

Для STM32 это 32 килобайта кода (из имеющихся 256 килобайт Flash-памяти). Но для учебных задач вполне достаточно, поэтому будем использовать именно этот вариант.

Запускаем скачанный архив и переходим в раздел Install IAR Embedded Workbench.

Программа IAR начинает свою установку. Принимаем лицензионное соглашение и указываем папку, куда будет установлена среда разработки. Можно оставить по умолчанию.

Дальше нам предлагается выбрать драйвера USB-устройств, которые нам понадобятся. Поскольку мы будем пользоваться программатором ST-link, я рекомендую убрать остальные драйвера, что немного ускорит процесс установки.

Далее идет предупреждение о создании соответствующей папки в Program Files. И переходим к установке. Ждем пока установщик скопирует все требуемые файлы.
Dongle-драйвер можно не ставить.

Далее нам предлагается установить STlink USB драйвер. Запускается мастер установки, нажимаем «Далее», и копируются файлы драйвера.

Устанавливаем программное обеспечение для STM микроконтроллеров, и на этом программа IAR завершает свою установку.

Теперь устанавливаем лицензионную информацию. Запускаем IAR License Manager, и нам предлагается ввести лицензионный ключ. Для этого необходимо зарегистрировать продукт на сайте IAR Systems. Если Вы уже имеете лицензионный ключ, можете ввести его. Если нет, переходим на сайт. Регистрация бесплатная. И нажимаем кнопку Register.

В соответствующей форме вводим тип лицензии – code size limited и заполняем обязательные поля. E-mail необходимо указать корректно, поскольку туда придет подтверждающее письмо. Также требуется указать отрасль, в которой будет применяться среда разработки IAR и указать производителя микроконтроллеров, для которых мы планируем применять эту среду – ST Microelectronics.
Отвечаем на несколько вопросов и подтверждаем регистрацию. Получаем соответствующее письмо подтверждения на указанный адрес электронной почты.

Проходим по указанной ссылке и получаем лицензионный номер. Этот номер нужно ввести в окне регистрации. В окне регистрации нажимаем «Далее» … и подтверждаем лицензионный ключ.

Лицензия успешно активирована, программа IAR готова к работе. Можем запустить IAR Systems. Выбираем язык интерфейса и видим окно среды разработки.

Слева – рабочая область проекта.
Справа – код программы, и снизу – окно состояния проекта, где будут выводиться предупреждения и ошибки компиляции.

Назад: Программирование STM32

prog-cpp.ru

ARM. Учебный курс. IAR EWARM. Создание проекта.

Если ничего нет, но очень хочется… 🙂

Не Keil’ом единым…
Есть такая компания, называется она IAR Systems. Делает много вещей, в том числе и среды разработки и компиляторы для различных архитектур, список которых довольно обширен. Также в числе продуктов компании есть отладчики, наборы разработчиков и т.д. Более подробно со всем этим разнообразием можно ознакомиться на их родном сайте iar.com

Нас же сейчас интересует среда для разработки приложений для архитектуры ARM, в частности Cortex-M3. Есть в их ассортименте и такой продукт и называется он EWARM, что является сокращением от Embedded Workbench for ARM, что в свою очередь, в моем вольном переводе на великий и могучий, звучит примерно как «Среда разработки для встроенных систем на архитектуре ARM», впрочем, за точность я не ручаюсь…

Данная среда поддерживает большое количество микропроцессоров и микроконтроллеров построенных на базе архитектуры ARM разных версий. Полный список можно посмотреть на их сайте Т.к. это серьезная среда разработки, то она поддерживает различные отладочные интерфейсы и средства сопряжения как производства самой IAR так и сторонних компаний, имеет встроенный отладчик, симулятор и т.д.

Но по причине отсутствия у меня какого либо девайса для внутрисхемной отладки рассказать я про все это не могу. А пользоваться симулятором как-то в голову даже не приходило. Я по старинке, пишу, заливаю в контроллер и смотрю что происходит. (Зато их есть у меня. И я вам скоро выдам пример того, какой это рулез. прим. DI HALT)

Есть мнение, что компилятор С/С++ у IAR один из самых лучших, но за это я не ручаюсь, хотя кое какие мои сравнения с Keil uVision v3 показали его превосходство.

В общем, это мощнейшая полноценная среда для разработчика. Кому интересно, изучайте описания на официальном сайте Есть ли версия для линукса я на сайте нигде не углядел, поэтому точно не скажу. (Боюсь, что как всегда 😉 Впрочем, там есть могучий и универсальный GCC и обязательно есть поддержка ARM. Так что если есть желающие показать старт проекта под линухом — ждем с распростертыми обьятьями. Пишите на [email protected] прим. DI HALT)

На момент написания данной статьи доступна версия 6.10 (я же буду рассказывать на примере версии 5.4).

Сколько стоит данное чудо я, к сожалению, на их официальном сайте найти так и не смог, а лазить по сайтам дилеров как-то недосуг… На наше счастье, данный продукт доступен в демо режиме для ознакомления. (Я тоже полазил, не нашел. Кейл стоит около 3 килобаксов. IAR, думаю, в тех же пределах. Вполне подьемно для коммерческого применения прим. DI HALT)

И здесь есть 2 варианта

  • 1. Полнофункциональная версия с ограничением использования в 30 дней.
  • 2. Версия без ограничения по времени использования но генерирующая код не более 32Кб. Под наши ковыряния хватит с лихвой.

Обе версии, кроме того имеют следующие ограничения:

  • Они не включают исходный код библиотек.
  • Они не включают поддержку MISRA C (что это такое, к сожалению не знаю).
  • Имеют ограниченную техническую поддержку.
  • Версия с ограничением кода в 32Кб не имеет поддержки расширенной отладки (что это такое, к сожалению не знаю)

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

После установки можно приступать к созданию проекта. Запускаем IAR Embedded Workbench и видим следующее окно:

Лирическое отступление.
Если кто-то, как я, привык для копирования/вставки использовать сочетание клавиш Ctr+Insert/Shift+Insert, то его ждет засада! EWARM по умолчанию понимает только Ctrl+C/Ctrl+V и при нажатии Ctr+Insert или Shift+Insert только меняет режим вставки/перезаписи текста. Почти месяц меня это жутко бесило, пока однажды мне не стукнуло что-то в голову и не пришла мысль порыться в настройках… Оказалось, что это легко лечится путем назначения сочетаний клавиш командам! Делается это во вкладке меню Tools->Options, далее Keybindings.

Выбираем в меню:

 Project->Create New Project

Project->Create New Project

Открывается окошко создания нового проекта.
На данном этапе можно выбрать из шаблонов, что именно мы хотим создать, но выбор там не велик, а все шаблоны содержат пустые заготовки файлов с нужным расширением и заголовками. Поэтому не ломаем голову а выбираем

и жмем кнопочку ОК

Появится диалог выбора имени проекта и указания, куда его сохранить. Называем проект милым вашему сердцу названием и сохраняем в укромном месте. Я же назвал его LEDTest, что какбы намекает… В итоге получаем следующую картину:

Создался новый проект содержащий только один файл main.c который содержит только одну пустую функцию main(). А вы хотели большего? Дальше все ручками.

На данном этапе желательно нажать на кнопку с изображением трех дискеток или через меню

EWARM попросит ввести имя WorkSpace (воркспейс может содержать множество проектов) и не мудрствуя лукаво я назвал его также LEDTest.

В отличие от Keil’a EWARM не попросил указать целевое устройство и все остальное, поэтому лезем в свойства проекта и начинаем его настраивать.

По аналогии с Microsoft Visual Studio EWARM позволяет создавать произвольное число конфигураций и по умолчанию создает в проекте 2 конфигурации Debug и Release, что подразумевает 2 набора параметров, одни для компиляции кода содержащего отладочную информацию и другой для кода без нее. Выбираем наиболее подходящую для себя.

Я, например, сразу выставляю Release и настраиваю только ее, но это дело вкуса и наличия или отсутствия у вас средств отладки.

Итак, идем в меню

Либо нажимаем Alt+F7, либо тыкаем правой кнопкой мыши на корне дерева слева и выбираем в меню Options. Появляется окно настроек проекта.

Первая категория – General Options
Здесь желательно выбрать ядро для которого нужно откомпилировать код или указать конкретное устройство. По умолчанию указано ядро ARM7TDMI. Переключаем радиобуттон на Device, нажимаем на кнопку справа от поля ввода и в списке выбираем

, где Y соответствует семейству имеющегося у вас микроконтроллера. Я выберу ST STM32F10xxE.

Далее по вкладкам и категориям буду пробегаться кратко и без картинок т.к. вкладок много и не все они важны для нас на данном этапе. На существенных остановлюсь подробно.

Output (вывод)
Здесь указываем что мы хотим получить навыходе, исполняемую программу или библиотеку. Оставляем без изменения – Executable. Также здесь можно прописать пути куда ложить откомпилированную программу/библиотеку, объектные файлы и файлы листингов. Меняем, если душа того просит.

Library Configuration (конфигурация runtime библиотеки языка С). Это тема отдельной телепередачи 🙂 но сейчас можно смело поставить None и пройти дальше.

Library options (опции стандартной библиотеки языка С)
Здесь настраивается работа функций printf и scanf. Вернее поддержка различных ключей строки форматирования. Ниже кратко расписано какая опция что поддерживает, а более подробно можно прочитать в документации идущей в комплекте с EWARM. Поддержка более сложных ключей форматирования увеличивает размер кода т.к. обработчики строки форматирования разные по сложности реализации. В данном проекте нам это не важно т.к. данными функциями мы пользоваться не будем. А в последущием я освещу данный вопрос подробнее.

MISRA-C: 2004 и MISRA-C: 1998. Настройки расширений MISRA-C. Что это такое, я честно не знаю. 🙂

C/C++ Compiler (настройки компилятора С/С++)
Здесь настраивается поддержка расширений языков С/С++, режимы оптимизации компилятора, генерация отладочной информации, пути к инклудам и т.д. Здесь пока можно ничего не трогать.

Assembler
Соответственно настройки языка ассемблера. Здесь пока можно ничего не трогать.

Output Converter (конвертация вывода)
Вот это нам нужно. Дело в том, что по умолчанию EWARM генерирует исполняемый файл в формате ELF, что какбы намекает, что Unix и прочие линуксы IAR’у не чужды.

Но нам то они ни к чему, поэтому смело тыкаем галку Generate additional output (генерировать дополнительный выходной файл) и в списке Output format (формат выходного файла) выбираем подходящий для себя, вернее для используемого вами программатора, формат.

Выбор особо не велик и реально для большинства будет состоять из двух вариантов: Intel extended, в простонародье именуемый HEX или binary. Я лично пользуюсь вариантом binary. Здесь же, если того требуют ваши религиозные убеждения, можно задать имя выходного файла отличающееся от дефолтного.

Custom build (пользовательская сборка)
Здесь можно задать дополнительные утилиты и их параметры которые будут использоваться при сборке проекта, но нам это ни к чему — пропускаем.

Build Actions (действия при сборке)
Здесь можно указать команды которые нужно выполнить перед сборкой или после. Поступаем аналогично предыдущему пункту.

Категория Linker (линковщик)
Вот и добрались до второго, после указания целевого устройства, важного момента! Ибо от линковщика, вернее его настроек, очень сильно зависит запуститься ваш проект в микроконтроллере или нет т.к. именно линковщик располагает код и различные таблицы (например векторов прерываний) по нужным адресам.

Вкладка Config (конфигурация). Здесь содержится ссылка на используемый файл конфигурации линковщика. Это очень важный файл т.к. именно в нем прописана конфигурация нашего микропроцессора в части памяти (ее наличия или отсутствия, адресации и размера), размещения таблицы векторов прерываний, размеры стека и кучи. По умолчанию проставлена ссылка на файл конфигурации идущий в комплекте с EWARM’ом и едином для всех устройств на базе ядра Cortex, что не есть хорошо, т.к. устройства все разные, объемы флеша и ОЗУ у них разные и т.д. К счастью, есть возможность отредактировать этот файл самостоятельно, что дает широчайший простор творчеству, либо с использованием кнопки Edit… находящейся здесь же.

Самостоятельная конфигурация файла настроек линковщика, занятие бесспорно увлекательное и плодотворное, но оно выходит далеко за рамки данной статьи т.к. только об этом можно написать не одну статью. Подробно все описано в руководстве пользователя, идущем в комплекте с EWARM. Скажу лишь, что там можно создавать сегменты памяти, указывать их тип, размер, размещение и еще много чего. Иногда это очень нужно, но это уже в более серьезных проектах.
Поэтому ограничимся нажатием кнопочки Edit… Правда перед этим нужно решить один концептуальный вопрос.

Дело в том, что как я уже сказал выше, данный файл является заготовкой для всей архитектуры Cortex, поэтому если вы его измените, а потом захотите создать проект для другого контроллера, того-же NXP LPC17XX, то его опять придется редактировать уже под этот процессор. Тут есть 3 варианта решения:

  • Сказать себе, что кроме STM32F меня ничего не интересует и отредактировать данный файл.
  • Скопировать данный файл в той-же папочке где он лежит (а лежит он, как можно догадаться, в папке диск:путь куда установили EWARM\arm\CONFIG\) во что-то типа STM32F10XXX.icf и редактировать его.
  • Скопировать его в папочку с проектом переименовав во что-то типа STM32F10XXX.icf и редактировать его.

Итак, выбираем вариант себе по душе (я лично пользуюсь 3-им вариантом а путь прописываю так:

$PROJ_DIR$\stm32f103re.icf

$PROJ_DIR$\stm32f103re.icf

Переменная $PROJ_DIR$ разворачивается в путь до папки с проектом автоматически, т.е. путь получается относительным. Таким образом можно папку с проектами копировать потом куда угодно и файл не «потеряется» в отличие от использования жесткого пути), выбираем свой файл отредактировав путь или нажав кнопку выбора файла (кнопка с «…» справа от едита) и нажимаем кнопку Edit…

В появившемся окошке в первой вкладке Vector Table задаем адрес таблицы векторов прерываний. Что это такое, для тех кто не в курсе, я не буду раскрывать. (Я тоже не скажу :), т.к. все уже сказано в разделе про AVR. Тут все точно также, только векторов больше. прим DI HALT)

Адрес может быть либо 0х00000000 либо 0х08000000. Я предпочитаю ставить 0х08000000 т.к. он указывает на начало внутренней флеш памяти, а адрес 0х00000000 может мэпиться на флешку а может и нет, в зависимости от состояния входов BOOT в момент инициализации контроллера, но это нужно уже курить даташит на устройство.

Вкладка Memory Regions (регионы памяти).
Здесь задается 2 важных для работы контроллера вида памяти ROM (ПЗУ) и RAM (ОЗУ) вернее их адреса начала и окончания. ROM — это наша внутренняя флеш память. Начинается она с адреса 0х08000000, это заложено в архитектуре контроллера. А вот заканчивается у каждого по разному. Зависит от объема который есть в вашем контроллере.

У меня ее 512Кб, а у вас может быть 32, 64, 128, 256. Т.е. адрес окончания этой области памяти вычисляете сами. Для меня он будет равен 0x0807FFFF (адрес начала 0x08000000 + размер флеша (512*1024) – 1 в шестнадцатеричном формате). Для вас это может быть 0x08007FFF, 0x0800FFFF, 0x0801FFFF и т.д. Желательно указывать точный размер чтобы полученная прошивка не превысила этот размер, а так линковщик ругнется в случае чего. Но нам это не грозит пока. Аналогично заполняем поля для RAM, зная из чтения даташита, что она начинается с адреса 0x20000000 и посчитав где она закончится.

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

Вкладка Stack/Heap Sizes (размеры стека и кучи)
Параметры говорящие сами за себя.
Стек нужен для передачи параметров функциям, сохранения точек возврата из них и т.д. Сильно большим его делать не имеет смысла т.к. зря будет расходоваться ОЗУ, а если сделать сильно маленьким, то может не хватить (особенно если будет использоваться много вложенных функций). Поставим его равным 0x200 т.е. 512 байт. В нашем проекте этого более чем достаточно.
Куча – это часть ОЗУ выделенная для функций работы с памятью языка С/С++ таких как malloc, оператор new и т.д. В данном проекте мы их использовать не планируем, поэтому ставим 0.

Все, нажимаем кнопочку Save.

В остальных вкладках категории Linker настраиваются подключаемые внешние библиотеки, пути к ним, настройка имени выходного файла, настройки генерации листингов, расчета контрольных сумм и т.д. Нам в данном проекте ничего из этого не понадобиться, а объяснять все слишком долго. Будут конкретные вопросы — спрашивайте в комментах.

Категория Debuger (отладчик)
Здесь настраиваются аппаратные средства внутрисхемной отладки либо отладка в симуляторе. Как я уже говорил, аппаратных средств у меня нет, а симулятором я не пользуюсь. Поэтому рассказать тут особо ничего не могу.

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

Теперь можно смело нажать кнопку F7 или в меню

и откомпилировать наш проект.

В папочке которую вы указали для выходных файлов программы (если ничего не меняли, то это будет, в зависимости от выбранной конфигурации, папка Debug/exe либо Release/exe в папке с проектом) увидим 2 файла. Один с раширением .out и второй .bin или .hex, в зависимости от того, что вы указали в качестве дополнительного выходного файла.

Все, наша первая программа готова! Можно прошивать ее в контроллер и она заработает! Не верите? А вы попробуйте.

На этом позвольте закончить мою первую статью т.к. она и так получилась не маленькой. А к написанию более функционально насыщенной программы мы перейдем на следующем нашем шаге.

PS:
Хочу еще пару слов сказать о прошивке контроллера. Как я написал в эпиграфе, если ничего нет, но очень хочется… Если у вас нет аппаратного прошивальщика и/или отладчика, то это не большая проблема. Дело в том, что прошить контроллер STM32F можно с использованием обычного интерфейса USART, в простонародье это называется через COM порт. В идеале, если на плате с микроконтроллером распаян преобразователь уровней USART в TTL и заведен на порт USART1 контроллера (ножки PA.8 PA.9). Если нет, то тоже не большая беда. Можно немного распотрошить любой кабель-переходник USBCOM (в крайнем случае покупается в магазине), там внутри стоит микросхема с TTL уровнями, и пользоваться им подключаясь напрямую к ножкам контроллера. Про выставление уровней BOOT0/1 и как входить в режим бутлоадера можно узнать из даташита. А прошивать можно программой Flash Loader Demo производства самой ST Microelectronics. Я пользуюсь именно ей. Правда почему-то найти ее на сайте ST невозможно, поэтому прикладываю ее к своей статье, спасибо за нее нашим китайским братьям!

easyelectronics.ru

IAR — создание проекта на примере STM32F103RBT6

Пошаговая инструкция создания нового проекта для микроконтроллеров STM32 в IAR Embedded Workbench 7.50, с установкой и подключением библиотеки ST SPL — Standard Peripheral Library.

Пример для платы на контроллере STM32F103RBT6.
Перед началом создания проекта необходимо скачать библиотеку для микроконтроллеров серии STM32F10x с сайта ST. или уже обработанный, с удалением не нужных файлов, мой архив.

Запустив IAR, в меню Project выбрать пункт создания нового проекта. Выбрать шаблон на языке C.

Будет создано новое рабочее пространство c пустым шаблоном программы.

В левом окне Workspace в ниспадающем меню, нажатием правой кнопки мыши по названию проекта, выбрать пункт Options…, появится окно установки настроек данного проекта.
Первым шагом в окне настроек, в разделе меню General Options необходимо выбрать тип используемого микроконтроллера, в данном примере на фото выбран STM32F103x8, нам нужен STM32F103xB, отличающийся типом корпуса и количеством ножек.

В том же меню, General Options, перейдя на вкладку Library Configuration установить галочку использования библиотеки CMSIS.

Переход в меню окна компилятора C/C++ Compiler, выбор вкладки оптимизации компилятора. Предлагается на выбор 4 варианта предустановленных режимов оптимизации. Так же можно в ручном режиме галочками задать свои настройки. Для начала рекомендуется установить низкий уровень оптимизации. С такой установкой при отладке будет более точно повторен исходный код, без удаления/сокращения.

Для создания HEX файла, необходимого для заливки в контроллер по UART или SWD, нужно установить галочку создания файла в меню Output Converter, а в ниспадающем подменю выбрать тип генерируемого файла: Intel — файл HEX, Motorola — файл BIN.

Выбор отладчика произвести в меню Debuger, на вкладке Setup, установив ST-Link. Возможно использование внешнего USB отладчика ST-Link или установленного на платы типа Discovery и Nucleo.

Перейти на вкладку Download установить галочки проверки загрузки кода в контроллер и применения флеш лоадера.

Перейдя в меню настроек ST-Link, выбрать режим программирования и отладки по интерфейсу SWD.

 

ank.spin-w.com

Использование примеров для STM32F4DISCOVERY в IAR Embedded Workbench for ARM

В  статье «Программное обеспечение для STM32F4DISCOVERY  (http://firsthand.ru/node/298)» я уже писал, что примеры которые идут вместе с IAR EWARM (IAR Embedded Workbench for ARM) для микроконтроллеров STM32F4 не работают с STM32F4Discovery, потому что они ориентированы на их собственную отладочную плату IAR KickStart Kit for STM32F407ZG.

Для того чтобы работать в IAR EWARM с STM32F4Discovery нужны примеры именно для STM32F4-Discovery и именно для среды разработки или toolchain IAR EWARM (IAR Embedded Workbench for ARM).

Такие примеры есть у самой компании STMicroelectronics и их можно свободно использовать.

Скачать примеры можно с сайта «www.st.com» компании «STMicroelectronics» со страницы с названием

STSW-STM32068
STM32F4DISCOVERY board firmware package, including 22 examples (covering USB Host, audio, MEMS accelerometer and microphone) (AN3983)

Попасть на неё легче через поиск. Можно и по другому, но мне нравиться через поиск. Так быстрее. Просто набираешь «STSW-STM32068» и первая ссылка ведет куда надо.

Ищем внизу на странице раздел «Get Software» и жмем на кнопочку «Download» напротив STSW-STM32068. После этого загружается zip-архив stsw-stm32068.zip.

В данном архиве, после распаковки, видим папку STM32F4-Discovery_FW_V1.1.0. Эта папка и содержит примеры для STM32f4discovery. Эту папку можно теперь перенести в папку с проектами IAR EWARM, оставить там где она есть или перенести в, специально созданную для экспериментов, свою папку. У меня такой папкой является E:\PROJ\STM32F4, вот туда я и перенес папку STM32F4-Discovery_FW_V1.1.0. со всем её содержимым.

Практически во всех примерах от официальных изготовителей микроконтроллеров и изготовителей отладочных плат файлы проектов для IAR EWARM (IAR Embedded Workbench for ARM) размещаются в папках с названием EWARM. Например, есть папка «Demonstration» с файлами проекта демонстрации некоторых основных возможностей отладочной платы, а в ней есть папка  EWARM, в которой находятся файлы проекта для IAR EWARM.

Пример работы с портами ввода/вывода GPIO я нашел в папке «E:\PROJ\STM32F4\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\IO_Toggle» и файлы проекта для  IAR EWARM соответственно в папке «E:\PROJ\STM32F4\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\IO_Toggle\EWARM«

 

Далее находим файл с расширением «.eww» — это IO_Toggle.eww. Это основной файл для проекта в IAR EWARM. Щелкаем по нему мышкой и если toolchain IAR EWARM установлен правильно, то вскоре откроется IAR Embedded Workbench for ARM с загруженным проектом IO_Toggle.

Слева отображается состав проекта, а внизу две строчки сообщают что проект создан для STM32F407VG.

В папке User находиться файл main.c в котором содержиться основной код программы и откуда всегда стоит начинать изучать примеры. Но сейчас мы этот шаг изучения пропустим, потому что основная цель — это проверить работоспособность примеров для STM32F4discovery в среде разработки IAR Embedded Workbench for ARM.

Для этого просто откомпилируем пример работы с портом ввода/вывода GPIO. Для этого в меню выбираем «Project», затем «Rebuild All». Так проверим наличие ошибок, все ли файлы присутствуют и, если всё хорошо, откомпилируем пример.

После компиляции проекта выходит сообщение о том, что ошибок нет и замечаний нет.

Теперь загрузим полученную прошивку в микроконтроллер в режиме отладки. Если отладочная плата STM32F4discovery ещё не подключена, то самое время её подключить. В меню выбираем «Project», затем «Download and Debug».

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

Теперь можно проверить работу программы в пошаговом режиме, или запустить непрерывное выполнение. Для непрерывного выполнения нажимаем на кнопочку «Go». Ранее погасшие светодиоды начинают мигать по часовой стрелке. То есть, пример откомпилировался, загрузился и нормально себя чувствует в памяти микроконтроллера, выполняя заданную работу.

Теперь можно остановить отладку. При этом программа в микроконтроллере никуда не изчезает, а спокойно продолжает работать.

И как итог, получаем что примеры для STM32F4-Discovery с сайта st.com для IAR EWARM вполне рабочие и ими можно пользоваться для изучения и освоения микроконтроллера STM32F407VG.

 

firsthand.ru

HowToDoIt » Создаём первую программу для микроконтроллера STM32F103 в IAR

В данной статье речь пойдет о том, какие шаги необходимо выполнить для создания минимального и удобного проекта под микроконтроллер серии STM32  в среде разработки IAR. Этот пост скорее напоминалка для меня самого дабы не забыть мелких нюансов IDE в ответственный момент. Ведь в любой момент я смогу просто зайти на эту страницу и скачать готовый стартап проект. Ну а Вам, дорогие читатели, самим решать, чего полезного можно почерпнуть из этого поста! Ну что ж, приступим?

Естественно, в первую очередь необходимо скачать и установить программу IAR. Дальше необходимо скачать полезную библиотеку от производителя процессора, которая называется STM32F10x_StdPeriph_Lib_V3.5.0 (версия в Вашем случае может отличаться). После этого, запускаем установленную среду разработки. Создаем новый проект Project->Create New Project…

Выбираем пустой проект

Получаем

Создаем желаемые условные разделения внутри проекта (с помощью команд Add->Add Group…)

Добавляем необходимые файлы

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

Переходим к настройке проекта. Выбираем процессор


Устанавливаем галочку в настройках для использования библиотеки CMSIS

Добавляем путя к библиотечным файлам, а также добавляем определения (Defines) в настройки препроцессора C/C++

Кроме этого есть возможным получать на выходе будущей сборки проекта выходные файлы разного формата. Одним из возможных форматов является обычный двоичных файл. Для его генерации нужно зайти в настройки проекта и установить их следующим образом

Ради приличия считаю должным, упомянуть о самой программе, которую мы собираемся скомпилировать. Что она должна делать? Это своего рода «Hello World» в мире встроенных систем. Иными словами — будем мигать светодиодом. Рассмотрим исходный код главного файла:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_flash.h"
 
int main()
{
    GPIO_InitTypeDef GPIO_InitStructure;
 
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div2);
    RCC_PCLK1Config(RCC_HCLK_Div4);
 
    /* Select HSI as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
 
    /* Wait till HSI is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x00) {}
 
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_0);
 
    // Enable peripherals clocks
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
 
    /* LED configuration */
    /* Configure PD.05 as output push-pull */
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
 
    while(1)
    {
        GPIO_SetBits(GPIOD, GPIO_Pin_5);
        for(long i=0; i<200000; i++)
            ;
        GPIO_ResetBits(GPIOD, GPIO_Pin_5);
        for(long i=0; i<200000; i++)
            ;
    }
}

Что тут творится? В первую очередь настраиваем систему тактирования микропроцессора и выбираем внутренний источник тактирования (HSI, 8 MHz). Дальше подаём тактирование на порт GPIOD, который «висит» на шине APB2. После, настраиваем 5-ый пин порта GPIOD на выход (к этому пину подключаем светодиод). Ну а дальше видим бесконечный цикл в котором и происходит поочерёдное включение и выключение светодиода. Между включением и выключением также добавлены циклы. Они выполняют роль задержки, дабы человеческий глаз успевал замечать мигание светодиода.

Теперь проект должен без особых проблем собраться по нажатии клавиши F7. Нами была создана возможно первая прошивка для микропроцессора STM32F103. Поздравляю! На выходе получим желаемый двоичный файл. В одной из следующих статьей рассмотрим способ загрузки полученного бинарного файла, собственно в сам микропроцессор. Это сделать очень просто, если у Вас имеется в наличии переходник USB-UART.

Загрузка

Скачать исходный код проекта и файлы к статье

howtodoit.com.ua

STM32 + LAN8720 + FreeRTOS + IAR

Я две недели разбирался с тем, чтобы запустить Ethernet-модуль в STM32F107 с использованием микросхемы физического уровня LAN8720. Именно эта микросхема PHY установлена на отладочной плате MikroElectronica, и планировалось её использовать в боевом проекте — она маленькая, дешёвая и доступная.

Похоже на то, что я — единственный человек, запустивший lwIP-стек на STM32F107 с микросхемой PHY LAN8720 в IAR, или по крайней мере, единственный написавший об этом. Вся сложность заключалась в том, чтобы найти/написать необходимый драйвер для микросхемы PHY именно в этом МК и именно в этом компиляторе. Этот драйвер так и не нашёлся, и в итоге я написал свой.

Проблема в том, что хоть протокол MII/RMII и стандартизирован, но адреса управляющих регистров всё-таки остаются на откуп производителю микросхемы. Стек lwIP не имеет никаких средств доступа к железу, поскольку железо у всех слишком разное, поэтому HAL, т.е. драйверы, для всех микросхем PHY немного отличаются. Однако, не так много народу поднимали именно такую связку технологий, и готовых примеров нет. На сайте ST есть пример для микросхемы DP83848, которая всё же отличается от LAN7820, и он не работает сходу.

Поэтому я адаптировал этот пример к своему стеку технологий написанием своего драйвера — конечно, по мотивам драйвера из примеров, и с неоценимой помощью товарища core_dumped с easyelectronics.ru.

В итоге это увенчалось успехом. После всех мучений к полученному проекту установить FreeRTOS оказалось делом двух минут

Состав проекта

В архиве проекта лежат:

  • стек lwIP версии 1.3.1 (довольно старый. нужно перейти на 1.4.1)
  • библиотеки CMSIS и SPL от ARM и ST
  • драйвер PHY для STM32F107/LAN8720
  • операционка FreeRTOS версии 8.0.0 (свежайшая)
  • файл проекта для IAR.

Весь код от ST основательно проверен и вычищен, компилируется без ошибок. Проект переведён на рельсы FreeRTOS, что, кстати, сильно его упростило.

Включен HTTP-сервер и Telnet-сервер. IP — 192.168.1.59, шлюз — 192.168.1.1.

Скачать архив проекта

catethysis.ru