Авторы MIK32 Amur предпочитают использовать C в примерах, однако C++ имеет больше возможностей.
Оказывается, можно очень легко использовать C++ на микроконтроллере Амур!
Основной прием, который позволяет писать программы на C++ это оборачивание сторонних библиотек, которые написаны на C в ключевое слово extern
extern "C" {
#include <library.c>
}
Ключевое слово позволяет импортировать в программу на C++ функции, написанные на языке C.
Далее приведена программа Blink, мигающая встроенным светодиодом, с использованием объектно-ориентированного программирования (ООП).
Хотя в данном примере использование объектов может показаться излишним, для многих других целей ООП станет очень полезным инструментом.
extern "C" {
#include <mik32_memory_map.h>
#include <pad_config.h>
#include <gpio.h>
#include <power_manager.h>
#include <wakeup.h>
}
void InitClock()
{
PM->CLK_APB_P_SET |= PM_CLOCK_APB_P_UART_0_M | PM_CLOCK_APB_P_GPIO_0_M | PM_CLOCK_APB_P_GPIO_1_M | PM_CLOCK_APB_P_GPIO_2_M; // включение тактирования GPIO
PM->CLK_APB_M_SET |= PM_CLOCK_APB_M_PAD_CONFIG_M | PM_CLOCK_APB_M_WU_M | PM_CLOCK_APB_M_PM_M; // включение тактирования блока для смены режима выводов
}
class Gpio{ // Появились классы (в C их нет)
public :
GPIO_TypeDef* port; // Здесь хранится номер порта, например GPIO_0
uint32_t pin; // Здесь хранится номер вывода у порта, например 9
Gpio(GPIO_TypeDef* _port, uint32_t _pin) { // Функция-конструктор
port = _port;
pin = _pin;
}
void toggle() { // Метод класса для переключения уазанного GPIO
port->OUTPUT ^= 1 << pin;
}
};
int main() {
InitClock(); // Включение тактирования GPIO
auto LED = Gpio(GPIO_0, 9); // Создание объекта LED
PAD_CONFIG->PORT_0_CFG &= ~(0b11 << (2 * LED.pin)); // Установка вывода 9 порта 0 в режим GPIO
LED.port->DIRECTION_OUT = 1 << LED.pin; // Установка направления вывода 9 порта 0 на выход
while(true) {
LED.toggle(); // Вызов метода "переключить" для объекта LED
for (volatile int i = 0; i < 500000; i++) ; // 1 мс = 2000 проходов этого пустого цикла
}
}