STM32F407: быстрый старт Печать
Добавил(а) microsin   

[Что нужно для работы и отладки]

1. Установите IAR Embedded Workbench 6.30, это можно сделать на Windows 7 и Windows 8 (к сожалению, Windows XP не поддерживается).

2. Купите на ebay.com китайский J-LINK (строка для поиска JLINK Emulator V8 site:ebay.com).

J-Link-V8-debugger

3. Купите отладочную плату. Замечательный кандидат - STM32-P407 от Olimex (используется микроконтроллер STM32F407ZGT6).

STM32-P407-IMG 2659 STM32-P407-IMG 2666

Также можно выбрать одну из плат DISCOVERY от компании ST. Достоинство этих плат в том, что у них открытая документация (можно даже самому заказат печатную плату, исходные файлы Altium и Gerber опубликованы), платы DISCOVERY можно купить на AliExpress. Для плат DISCOVERY есть множество готовых примеров, они поддерживаются пакетом CubeMX.

[STM32F407ZGT6 - как сделать новый проект]

В качестве стартовой точки для нового проекта можно просто открыть пример, который предоставлен IAR или Olimex, и начать редактировать и изменять его. Так сделать проще всего, но недостаток в том, что появляются длинные пути к файлам, и название проекта не соответствует Вашему техзаданию. Поэтому можно сделать проект заново, с нуля. Потом можно сделать в нем все нужные настройки (которые были в проекте примера), и подключить к нему нужные файлы, размещенные у ближайших каталогах. Здесь я рассмотрю создание такого нового проекта по шагам. Этот проект будет просто мигать светодиодом.

1. Создание нового проекта C. Создайте в любом удобном месте диска каталог для нового рабочего пространства (workspace). Предположим, это будет каталог MyWorkspace. Запустите IAR 6.30, выберите пункт меню Project - Create New Project..., откроется окно выбора типа нового проекта. Выберите C -> main и нажмите OK.

STM32-create-new-project

Далее откроется окно, где предложат выбрать папку для нового проекта и имя файла проекта (файл с расширением *.ewp). Перейдите в папку MyWorkspace, создайте в ней новую папку HelloWorld, зайдите в неё и в поле имени файла введите имя проекта HelloWorld, нажмите кнопку Сохранить.

STM32-save-ewp-file

Выберите в меню IAR пункт File -> Save all. Откроется окно, где будет предложено выбрать папку и имя файла для рабочего пространства (файл с расширением *.eww). Выберите папку MyWorkspace, зайдите в неё, и в качестве имени файла введите MyWorkspace. Затем нажмите Открыть.

STM32-save-workspace

После этого действия новый проект будет успешно создан, ему будут присвоены настройки по умолчанию, и будут созданы две новые конфигурации проекта Debug и Release. Корневой каталог проекта будет MyWorkspace\HelloWorld, а корневой каталог Workspace MyWorkspace (в этот Workspace Вы при желании можете добавлять другие проекты). В каталоге MyWorkspace\HelloWorldтакже будут созданы подкаталоги Debug (туда по умолчанию попадают выходные и временные файлы результата компиляции), settings (папка для дополнительных настроек проекта), а также будут созданы файлы HelloWorld.dep, HelloWorld.ewd, HelloWorld.ewp и main.c.

2. Настройка проекта. Как ни странно, новый проект будет даже успешно компилироваться (если выбрать Project -> Rebuild all), но это вовсе не означает, что в результате компиляции будет получено именно то, что нам нужно. Необходимо выбрать тип процессора,

Откройте свойства проекта (Project -> Options...), на закладке General Options выберите Processor variant -> Device, нажмите кнопочку справа и выберите процессор ST -> STM32F407 -> STM32F407ZG.

STM32-device-selection

Перейдите в раздел опций Debugger, и в выпадающем списке Driver выберите J-Link/J-Trace (если у Вас подключен именно этот аппаратный отладчик). Нажмите OK.

STM32-set-Debugger

На этом минимальная настройка проекта закончена, его можно даже запустить в отладчике (Project -> Download and Debug). Но пока проект ничего не умеет, потому что в теле функции main (модуль main.c) нет никакого кода, стоит просто заглушка возврата нулевого значения:

int main()
{
   return 0;
}

3. Добавление модулей для управления периферией. В состав библиотеки ST есть готовые модули, которые предоставляют удобные макросы и функции для управление периферией микроконтроллера. Не будем выдумывать велосипед, просто давайте воспользуемся этой прекрасной возможностью.

Сделайте копию файла C:\ Program Files (x86) \ IAR Systems \ Embedded Workbench 6.5 \ arm \ examples \ ST \ STM32F4xx \ STM32F4xx_DSP_StdPeriph_Lib \ Project \ STM32F4xx_StdPeriph_Examples \ GPIO \ IO_Toggle \ stm32f4xx_conf.h, и поместите его в корень проекта, в папку MyWorkspace\HelloWorld.

Добавите в корень проекта HelloWorld новую группу, куда мы будем подключать библиотечные модули для управления периферией. Для этого нажмите правой кнопкой на имя проекта, выберите Add -> Add Group... -> и введите имя группы STM32F4xx_StdPeriph_Driver.

STM32-add-group

В каталоге рабочего пространства (у нас это папка MyWorkspace) сделайте копию папки Libraries, которую можно найти в папке примеров IAR C:\ Program Files (x86) \ IAR Systems \ Embedded Workbench 6.5 \ arm \ examples \ST \ STM32F4xx \ IAR-STM32F407ZG-SK\. После этого добавьте в папку проекта STM32F4xx_StdPeriph_Driver готовый модуль Libraries \ STM32F4xx_StdPeriph_Driver \ src\ stm32f4xx_gpio.c. Для этого нажмите правую кнопку на папке проекта STM32F4xx_StdPeriph_Driver и выберите Add -> Add Files..., и выберите нужный файл.

Добавьте в настройки проекта пути поиска для заголовочных файлов. Для этого откройте Project -> Options -> C/C++ Compiler -> закладка Preprocessor, и добавьте в Additional include directories пути поиска:

$PROJ_DIR$
$PROJ_DIR$\..\Libraries\STM32F4xx_StdPeriph_Driver\inc
$PROJ_DIR$\..\Libraries\CMSIS\Device\ST\STM32F4xx\Include
$TOOLKIT_DIR$\CMSIS\Include

Здесь $PROJ_DIR$ макрос, который раскрывает абсолютный путь до папки, в которой находится файл проекта HelloWorld.ewp. Макрос $TOOLKIT_DIR$ раскрывает полный путь до рабочего каталога текущего инструментария IAR (C:\ Program Files (x86) \ IAR Systems \ Embedded Workbench 6.5 \ arm).

Добавьте в окно Defined symbols символы (они используются в заголовочных файлах):

STM32F40XX
USE_STDPERIPH_DRIVER

STM32-options-Preprocessor

4. Мигание светодиодом. Давайте сделаем проект более осмысленным - научимся мигать светодиодом STAT1, который установлен на отладочной плате STM32-P407.

Добавьте в папку проекта STM32F4xx_StdPeriph_Driver модуль stm32f4xx_rcc.c (Add -> Add Files..., выберите файл MyWorkspace \ Libraries \ STM32F4xx_StdPeriph_Driver \ src \ stm32f4xx_rcc.c).

Добавьте код инициализации ядра процессора. Создайте в Workspace группу EWARM (Add -> Add Group... -> введите имя группу EWARM -> OK) и добавьте туда файл startup_stm32f40xx.s (Add -> Add Files... -> выберите файл MyWorkspace \ Libraries \ CMSIS \ Device \ ST \ STM32F4xx \ Source \ Templates \ iar \ startup_stm32f40xx.s).

Также добавьте группу CMSIS, и добавьте туда модуль MyWorkspace \ Libraries \ CMSIS \ Device \ ST \ STM32F4xx \ Source \ Templates \ system_stm32f4xx.c.

Откройте файл исходного кода main.c, и замените его старый код на следующий:

/* Простейший пример мигания светодиодом для платы
 Olimex STM32-P407. Пример мигает светодиодом STAT1. */
#include "stm32f4xx.h"
GPIO_InitTypeDef GPIO_InitStructure;
//Простейшая функция задержки void Delay(__IO uint32_t nCount) { while(nCount--) {} } void main() { /* Разрешить тактирование GPIOF */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); /* Конфигурирование ножки PF6, туда подключен светодиод STAT1      платы разработчика Olimex STM32-P407 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOF, &GPIO_InitStructure); /* Бесконечный цикл мигания */ while(1) { GPIOF->BSRRL = GPIO_Pin_6; //STAT==1, светодиод горит Delay(3000000L); GPIOF->BSRRH = GPIO_Pin_6; //STAT==0, светодиод погас Delay(3000000L); } }

Светодиод STAT1 подключен к порту PF6 микроконтроллера (см. схему в архиве [2]).

Примечание: есть на мой взгляд некая несуразица в именовании регистров BSRRL и BSRRH, предназначенных для управления состоянием портов GPIO. Ведь по идее L значит Low, т. е. лог. 0, а H означает High, т. е. логическую единицу. Но здесь почему-то происходит все с точностью до наоборот - установка бита в регистре BSRRL почему-то приводит не к сбросу порта в 0, а в установку его в 1. Аналогично установка бита в регистре BSRRH почему-то приводит не к установке порта в 1, а к его сбросу в 0. Запись 0 никакого влияния на состояние порта не оказывает.

[Работа с портами ввода/вывода GPIO, примеры IOToggle и JTAG_Remap]

Запустите IAR 6.30, на стартовой странице выберите EXAMPLE PROJECTS -> ST -> STM32F4xx -> CMSIS and STM32F4xx stdperiph lib 1.1.0 -> GPIO, далее выберите папку, куда будет копирован пример. Откроется окно Workspace, где будет два примера работы с портами ввода-вывода: "IOToggle - STM324x7I_EVAL" и "JTAG_Remap - STM324x7I_EVAL".

Пример предназначен для работы на микроконтроллерах STM32F40xx/STM32F41xx, STM32F427x/STM32F437x, и был протестирован на плате разработчика STM324xG-EVAL и STM32437I-EVAL (я его запускал на плате STM32-P407 от Olimex). Само собой, пример может быть с успехом запущен и на других отладочных платах.

Порты GPIO подключены к шине микроконтроллера AHB. С использованием регистров BSRRH и BSRRL требуется только один цикл, чтобы установить в лог. 1 любой вывод микроконтроллера, и еще 1 цикл чтобы сбросить в его 0. Таким образом, ножки GPIO можно переключать с частотой шины AHB, поделенной на 2.

В этих примерах показывается, как использовать BSRRH и BSRRL (аббревиатуры расшифровываются как Port Bit Set/Reset Register High and Low) для переключения выводов IO.

Порты PG6 и PG8 (сконфигурированные в режиме output pushpull) переключаются в бесконечном цикле:
- PG6 и PG8 устанавливаются в лог. 1 путем установки соответствующих бит в регистре BSRRL.
- PG6 и PG8 сбрасываются в лог. 0 путем установки соответствующих бит в регистре BSRRH.

В этом примере HCLK сконфигурирована на 168 МГц, так что PG6 и PG8 переключаются с частотой 84 МГц (на плате STM324xG-EVAL/STM32437I-EVAL туда подключены светодиоды LED1 и LED2). Чтобы достичь максимально возможной частоты переключения IO, опции Вашего компилятора должны быть сконфигурированы на максимальную оптимизацию по скорости.

Таблица 1. Содержимое папок примера GPIO IO Toggle.

GPIO/IOToggle/stm32f4xx_conf.h Файл конфигурации библиотеки.
GPIO/IOToggle/stm32f4xx_it.c Обработчики прерывания.
GPIO/IOToggle/stm32f4xx_it.h Заголовочный файл для stm32f4xx_it.c.
GPIO/IOToggle/main.h Заголовочный файл для main.c.
GPIO/IOToggle/main.c Основная программа.
GPIO/IOToggle/system_stm32f4xx.c Системный файл кода STM32F4xx (настройка тактовой частоты).

Примечание: файл system_stm32f4xx.c сгенерирован автоматически инструментарием конфигурации тактовой частоты (clock configuration tool), и может быть просто откорректирован с учетом Ваших потребностей. Чтобы выбрать другие настройки тактирования, используйте файл STM32F4xx_Clock_Configuration_V1.1.0.xls, предоставленный в апноуте AN3988, доступном на сайте ST [4].

По умолчанию проект настроен на запуск в симуляторе, но его легко можно перенастроить на загрузку через JTAG, и он будет работать на реальном железе (Options -> Debugger -> в выпадающем списке выберите J-Link/J-Trace). Проект GPIO IO Toggle можно с успехом использовать как стартовую точку для своих собственных проектов, особенно если Вы только начинаете разбираться с платформой STM32.

Этот пример показывает, как использовать ножки JTAG/SWD кристалла как обычные порты ввода/вывода, и дает для этого последовательность конфигурирования. Все, что было сказано про предыдущий пример IOToggle касательно используемых микроконтроллеров, отладочных плат, также относится и к примеру JTAG_Remap. Чтобы переключиться в IAR на пример JTAG_Remap - STM324x7I_EVAL, щелкните правой кнопкой мыши на заголовок проекта, и выберите в контекстном меню Set as Active.

Таблица 2. Содержимое папок примера GPIO JTAG/SWD Remap.

GPIO/GPIO_JTAGRemap/stm32f4xx_conf.h Файл конфигурации библиотеки.
GPIO/GPIO_JTAGRemap/stm32f4xx_it.c Обработчики прерывания.
GPIO/GPIO_JTAGRemap/stm32f4xx_it.h Заголовочный файл для stm32f4xx_it.c.
GPIO/GPIO_JTAGRemap/main.h Заголовочный файл для main.c.
GPIO/GPIO_JTAGRemap/main.c Основная программа.
GPIO/GPIO_JTAGRemap/system_stm32f4xx.c Системный файл кода STM32F4xx (настройка тактовой частоты).

Кроме ножек JTAG/SWD как выход используются порты PG6 и PG8, и как вход кнопки используется порт PG15 (переключает режим инициализации программы).

[Ссылки]

1. 140808STM32F4xx_Clock_Configuration.zip - Clock configuration tool for STM32F40x/41x microcontrollers (AN3988) site:st.com.
2. 140808STM32F407.zip - документация по микроконтроллерам STM32F40x/41x, по плате Olimex STM32-P407, схема, примеры кода.
3. 140810STM32-HelloWorld.zip - пример кода мигания светодиодом на макетной плате Olimex STM32-P407, проект IAR 6.30.
4. Olimex STM32-P407.
5STM32: аббревиатуры и термины.