Создаём первую программу для микроконтроллера STM32F103 в IAR
on 09.08.2014 at 20:49В данной статье речь пойдет о том, какие шаги необходимо выполнить для создания минимального и удобного проекта под микроконтроллер серии 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_GPIOB, ENABLE); /* LED configuration */ /* Configure PB.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(GPIOB, &GPIO_InitStructure); while(1) { GPIO_SetBits(GPIOB, GPIO_Pin_5); for(long i=0; i<200000; i++) ; GPIO_ResetBits(GPIOB, GPIO_Pin_5); for(long i=0; i<200000; i++) ; } } |
Что тут творится? В первую очередь настраиваем систему тактирования микропроцессора и выбираем внутренний источник тактирования (HSI, 8 MHz). Дальше подаём тактирование на порт GPIOB, который «висит» на шине APB2. После, настраиваем 5-ый пин порта GPIOB на выход (к этому пину подключаем светодиод). Ну а дальше видим бесконечный цикл в котором и происходит поочерёдное включение и выключение светодиода. Между включением и выключением также добавлены циклы. Они выполняют роль задержки, дабы человеческий глаз успевал замечать мигание светодиода.
Теперь проект должен без особых проблем собраться по нажатии клавиши F7. Нами была создана возможно первая прошивка для микропроцессора STM32F103. Поздравляю! На выходе получим желаемый двоичный файл. В одной из следующих статьей рассмотрим способ загрузки полученного бинарного файла, собственно в сам микропроцессор. Это сделать очень просто, если у Вас имеется в наличии переходник USB-UART.
Все сделал , как тут написано и ничего. Контроллер STM32F103CB, с помощью ардуино работает, а через эту программу компилируется , заливаю в контроллер bin -файл и ничего не моргает и не горит. Какие могут быть подводные камни?
Здравствуйте sink3d,
спасибо за вопрос. Советую проверить адрес по которому вы загружаете прошивку в контроллер.
Адрес при загрузке должен совпадать с тем, что указан в настройках линкера.
Если рассматривать пример из этой статьи, то в данном случае используются настройки конфигурационного файла по умолчанию.
На моей машине это следующий файл:
«c:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\config\linker\ST\stm32f103xB.icf».
Если заглянуть внутрь, то можно увидеть там следующие строки:
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
Как видим, код должен ложится по адресу 0x08000000.
Других версий у меня пока нет. Если это не поможет, более детально опишите свои действия при загрузке «.bin» файла.
Если сделали «как тут написано», то не удивительно, что не заработало. Потому что у STM32F103C нет порта D, который использован в данной статье.
ПС спустя 4 года вряд ли он прочитает ответ, но вдруг кто-то столкнётся. У меня тоже не заработало, пока не стал вникать — на автомате думал что пример под blue pill с Ali, где светодиод на РС13, и что код под неё.
К моему сожалению, вы правы!
Можно использовать, например, порт B.
Код в статье исправил.
Статью поправил.
Спасибо за вашу внимательность.
П.С. Прикрепленный архив не менял, пока что.