- PVSM.RU - https://www.pvsm.ru -

STM32 + EmBlocks — мигаем светодиодами

Сегодня я покажу от начала и до конца как создать в EmBlocks простой проект для мигания парой светодиодов.
В качестве отладочной платы мы будем использовать кроху на STM32F103C8 [1].
Вот наш стенд:
STM32 + EmBlocks — мигаем светодиодами
Подключаем аноды светодиодов к пинам PB5 и PB6, катоды через резсторы в 390 Ом к земле.

Итак, если еще не скачали EmBlocks [2], сделайте это. Распакуйте в любой удобный каталог и запускайте.
Создаем проект, выбрав в меню «File->New->Project...»
В категории Projects выбираем «STmicro-Arm».
STM32 + EmBlocks — мигаем светодиодами
Называем проект и выбираем папку, в которой он будет создан. В дальнейшем новые проекты будут автоматически сохраняться там же, если не выберете другую.
STM32 + EmBlocks — мигаем светодиодами
В окне выбора компилера ничего не трогаем и двигаем дальше.
В окне выбора процессора из первого списка выбираем «STM32F10x_md» т.к. STM32F103C8 принадлежит к семейству F1 и содержит 64к FLASH, что относит его к medium density девайсам.
Если будете использовать ColinkEx, то выбираем в следующем окне конкретное название процессора, это нужно для прошивки утилитой CoFlash.
Если будете пользоваться ST-Link, то можно не трогать.
Галка «Create hex file» отвечает за создание .hex на выходе вместо .elf файла. ColinkEx принимает и те и другие, а вот ST-Link Utility только .hex
STM32 + EmBlocks — мигаем светодиодами
Жмем Finish. Мастер предложит выбрать отладчик и настроить его. Причем дважды — для цели Debug, а затем для Release… Если будете использовать другой, нажмите отмену и выберите другой отладчик. О других отладчиках расскажу как-нибудь в другой раз.
По-умолчанию предлагается ST-Link, нас это устраивает, поэтому просто жмем Ok дважды для каждой цели (Debug, Release)
Все, болванка проекта готова. Если теперь нажать F7, проект скомпилируется и готов к прошивке с напоминанием, которое уже учтено в настройках Release цели.

Разберем структуру проекта:

STM32 + EmBlocks — мигаем светодиодами [3]
Все файлы проекта автоматически раскладываются по папкам Sources, Headers и ASM Sources для ,.h и .S файлов соответственно.

В папке Sources у нас есть подпапка cmsis_boot с файлом библиотеки CMSIS.
В подпапке stm_libsrc у нас уже лежит пара файлов, которые нужны практически в любом проекте:
stm32f10x_gpio.c
stm32f10x_rcc.c

Это части StdPeriph Library для работы с GPIO и системой тактирования.
В подпапке Src лежит файл main.c — заготовка для нашей программы.

В папке Headers заголовки, разложенные по точно таким же папкам.
В дальнейшем нужные части StdPeriph Library мы будем добавлять в подпапки stm_libinc и stm_libsrc и включать в проект, щелкнув правой кнопкой по названию и выбрав «Add files...» или «Add files recursively...». Но сегодня нам это не понадобится.

За запуск микроконтроллера отвечает файл startup_stm32f10x_md.S, в папке ASM Sourcescmsis_bootstartup.
Скрипт линкера лежит в папке Others и называется gcc_arm.ld

Cо структурой проекта мы бегло познакомились, пора писать код, ради которого и затевали дело.
Окрываем файл SourcesSrcmain.c и заменяем текст в нем на такой:

#include <stm32f10x.h>
#include <stm32f10x_conf.h>

#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
#define RCC_GPIO RCC_APB2Periph_GPIOB
#define LED_PORT GPIOB
#define LED1_PIN GPIO_Pin_5
#define LED2_PIN GPIO_Pin_6

void Delay(volatile uint32_t nCount) {
	for (; nCount != 0; nCount--);
}

int main(void) {
	/* SystemInit() уже отработала в startup_stm32f10x_md_vl.S */

	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_GPIO, ENABLE);

	GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init( LED_PORT , &GPIO_InitStructure);

	LED_PORT->ODR ^= LED2_PIN;
	while (1) {
		LED_PORT->ODR ^= LED2_PIN;
		LED_PORT->ODR ^= LED1_PIN;
		Delay(0x7FFFF);
	}

	return 0;
}

Мы определили макросы RCC_GPIO, LED_PORT, LED_PIN1 и LED_PIN2, изменив которые, мы можем подключить светодиоды к пинам другого порта.

В функции main() заполняем структуру GPIO_InitStructure, настраивая пины PB5 и PB6 на работу в режиме PushPull с максимальной частотой 50MHz.
Затем инвертируем состояние LED_PIN2, чтобы светодиоды перемигивались и в цикле переключаем их с небольшой задержкой.

Жмем F7, убеждаемся, что проект собрался без ошибок
Build [4]
Подключаем отладчик ST-Link/v2 к плате и подаем на нее питание например через USB, сняв перемычку P2, чтобы ПК не пытался определить плату как USB девайс, а просто подал питание. Жмем F6, чтобы прошить с помощью ST-Link/V2 или выбираем «Tools->Flash w ST-Link/V2» ждем несколько секунд и если все сделали правильно, то светодиоды начнут моргать попеременно, чего мы и добивались:
STM32 + EmBlocks — мигаем светодиодами

Довольно просто, неправда ли?

Весь процесс занимает примерно минуту. Если у вас все же не получилось, скачайте проект [5] и сравните с тем, что получилось у вас.
Для другой платы изменится только выбор процессора из списка, если он отличается и макроопределения светодиодов, если он подключены к другому порту.

Оригинал статьи [6]

Автор: RaJa

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/stm32/41907

Ссылки в тексте:

[1] STM32F103C8: http://ravenium.ru/stm32-vs-arduino/

[2] EmBlocks: http://ravenium.ru/emblocks-ide/#download

[3] Image: http://habrastorage.org/storage3/0a4/e7b/919/0a4e7b91912dae99da361e83bf7b85aa.png

[4] Image: http://habr.habrastorage.org/post_images/188/6c1/e08/1886c1e087511aeeaa1a009032efef38.png

[5] скачайте проект: http://ravenium.ru/wp-content/uploads/2013/08/tstBlink.rar

[6] Оригинал статьи: http://ravenium.ru/stm32-emblocks-мигаем-светодиодом/

[7] Источник: http://habrahabr.ru/post/191624/