Янв 112015
 

Язык C++ в проектах для STM32 мне до этого использовать не приходилось. Для программирования микроконтроллеров возможности языка Си с лихвой перекрывали все мои скромные потребности. Однако, все когда-то случается в первый раз, вот и мне понадобилось настроить проект в IAR для использования C++. Сразу скажу, что этот язык программирования я практически не знаю, когда-то был опыт программирования на языке высокого уровня, но это был Delphi. Помочь с настройкой проекта меня попросили, были какие-то проблемы с подключением готовых библиотек на C++. Поэтому я сделал простейший проект с настройками для использования этого языка. В дальнейшем, после выполнения данных настроек, каких-либо проблем не возникало, функции из библиотек C++ выполняются, и программа работает как нужно. Однако, как я уже говорил, делал подобный проект в первый раз, поэтому всего лишь расскажу о процедуре настройки проекта в моем исполнении.

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

image001

Далее создаем новый проект.

image003

 

Создаем файл программы на С++

image005

Сохраняем проект

image007

Правой кнопкой кликаем по названию проекта и добавляем нужные файлы

image009

Вот такие файлы я добавил для данного проекта

image011

Файлы stm32f10x_gpio.c и stm32f10x_rcc.c я добавил, поскольку в проекте использовал функции стандартных библиотек для настроек порта. Проект был сделан для микроконтроллера STM32F103RC и содержит всего две функции на C++. В теле первой функции включается тактирование порта и его выводы конфигурируются как выходы в режиме Push-Pull. Вторая функция всего лишь устанавливает высокий уровень на одном из выводов порта, к которому у меня на макетной плате подключен светодиод. Внутри функций на C++ для этих целей используются функции из стандартных библиотек, вот такой получился симбиоз.

Далее снова клик правой кнопкой по названию проекта для выполнения настроек

image013

Сначала выбираем кристалл

image015

На этой вкладке устанавливаем следующие значения

image017

Переходим на C/C++ Compiler, выбираем язык программирования

image019

Здесь я не могу сказать, какой именно из пунктов лучше выбирать в разделе C++ dialect, по умолчанию был уже выбран Extended Embedded C++, так я и оставил.

Оптимизацию пока можно отключить

image021

На вкладке Proprocessor прописываем пути к файлам. Пути относительные, чтобы проще переносить проект на другой компьютер. Там же прописываем define, дабы не писать их в коде.

image023

У меня пути к фалам следующие:

$PROJ_DIR$\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\

$PROJ_DIR$\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar\

$PROJ_DIR$\..\Libraries\STM32F10x_StdPeriph_Driver\inc\

$PROJ_DIR$\..\Libraries\STM32F10x_StdPeriph_Driver\src\

А дефайны такие:

STM32F10X_HD

USE_STDPERIPH_DRIVER

cplusplus

Переходим в пункт Output Converter, там делаем такие настройки для генерации hex-файла:

image025

Теперь настраиваем линкер. Здесь надо выбрать файл, в котором прописаны размеры и адреса памяти для конкретного микроконтроллера. Я его обычно переношу в папку с проектом, чтобы тоже прописать к нему относительный путь. Ставим галочку и жмем кнопку справа от адреса для выбора файла.

image027

В открывшемся окне выбираем файл stm32f103xC.icf, копируем его и в этом же окне переходим в каталог с нашим проектом, вставляем туда этом файл и жмем «Открыть»

image029

image031

Теперь изменяем путь к файлу на относительный. Такой путь будет сначала, он абсолютный.

image033

Меняем его на такой путь

image035

Теперь у нас путь относительно каталога с проектом и при переносе проекта на другой компьютер эти пути не придется изменять.

Переходим к пункту Debugger. Выбираем драйвер для своего отладчика, у меня ST-Link

image037

Переходим на вкладку Download, ставим галочки для прошивки flash-памяти

image039

Переходим к пункту ST-Link и выбираем интерфейс отладчика SWD

image041

Жмем ОК, настройки сохранены.

Как видно, отличия в настройках проектов для C и C++ совсем небольшие.

Теперь по коду. Там всего две функции, одна настраивает PORTB, вторая выставляет высокий уровень на ножке PB0. Сами функции на C++, а внутри код на C, поскольку используются стандартные библиотеки.

#include "stm32f10x.h"

GPIO_InitTypeDef    GPIO_InitStructure;

class BlinkTest 
{
  
public:
 
  void run() 
  {
    GPIOB->BSRR |= GPIO_BSRR_BS0;
  }
};

class InitPeriph 
{
 
public:
  
  void run() 
  {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //Тактирование порта В  
    GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_All); 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
  }
};
int main()
{
  InitPeriph init;
  init.run();
  BlinkTest blink;
  blink.run();
  while(1);
}