ST1. Первая программа для микроконтроллера STM32. Моделирование в Proteus

Создадим для микроконтроллера STM32 программу для подключения четырех светодиодов и кнопки, управляющей миганием светодиодов. Смоделируем работу программы в Proteus. Для разработки кода программы будем использовать среду программирования STM32CubeIDE.
Начнем с создания в Proteus проекта Button_Proteus и создания в рамках этого проекта электрической схемы с микроконтроллером. Для этого вытаскиваем на рабочее поле программы Proteus микроконтроллер STM32F103C6, четыре желтых светодиода, блок POWER, две кнопки и землю. Кнопка 1 (обозначим Kn1) подключает питание к светодиодам. Кнопка 2 (обозначим Kn2) управляет миганием светодиодов. В программе будет задействована именно эта кнопка.

Рис. 1. Электрическая схема в Proteus

Собираем схему, как показано на рис. 1. В учебном пособии “Программирование микроконтроллеров” приводится подробное описание работы с программой Proteus. После того, как схема собрана, выбираем в меню опции: Design > Configure Power Rails (конфигурация силовых цепей). Появляется окно, показанное на рис. 2.

Рис. 2. Окно “Конфигурация силовых цепей”

В поле Name щелкаем по стрелочке справа и устанавливаем значение VCC/VDD. В поле Voltage устанавливаем значение +3.3. Обозначения VDDA и VSSA переносим из левой части окна в правую, щелкая по кнопке Add. Окончательно окно принимает вид, показанный на рис. 3. Щелкаем по кнопке OK. На этом подготовка программы Proteus к моделированию заканчивается. Переходим к работе с программой STM32CubeIDE.

Рис. 3. Окончательный вид окна “Конфигурация силовых цепей”

Запускаем программу STM32CubeIDE. Создаем новый проект: File > New > STM32 Project. В появившемся окне выбираем микроконтроллер STM32F103C6 (рис. 4).

Рис. 4. Выбор модели микроконтроллера

Нажимаем Next. В появившемся окне указываем имя проекта (в нашем случае Button) и папку расположения проекта (рис. 5).

Рис. 5. Название и расположение проекта

Нажимаем Finish. Появляется окно со схемой микроконтроллера (рис. 6). В окне на рис. 1 мы подсоединили светодиоды к выводам PA1, PA2, PA3, PA4 и кнопку_2 к выводу PB10. Потому на схеме микроконтроллера надо задать работу  выводов PA1 … PA4 на выход, а вывод PB10 – на вход. Для этого щелкаем левой кнопкой мыши по выводам и для PA1 … PA4 выбираем GPIOOutput, а для вывода PB10 выбираем GPIOInput. После этого щелкаем правой кнопкой мыши по указанным выводам, выбираем  выпадающую строку EnterUserLabel и присваиваем имена выводам: Led1 … Led4 для светодиодов и Kn2 для кнопки, как показано на рис. 6. При этом выводы меняют цвет с серого на зеленый.

Рис. 6. Конфигурирование выводов микроконтроллера

Далее необходимо определить опции, приводящие к генерированию hex-файла при создании кода программы. Для этого в меню выбираем: Project > Properties и в выпадающем окне (рис. 7) щелкаем по строке C/C++ Build и затем по строке Settings (отмечено овалами).

Рис. 7. Подготовительные операции для генерирования hex-файла (1)

В появившемся окне (рис. 8) щелкаем по строке MCU Post build outputs (отмечена овалом).

Рис. 8. Подготовительные операции для генерирования hex-файла (2)

Появляется новое окно (рис. 9), в котором проставляем галочки около двух верхних строчек:
Convert to binary file (-O binary)
Convert to Intel Hex file (-O ihex)
(выделены овалом на рис. 9). Внизу окна нажать Apply and Close.

Рис. 9. Подготовительные операции для генерирования hex-файла (3)

Далее необходимо сгенерировать код программы. Для этого надо щелкнуть по кнопке Device Configuration Tool Code Generation (имеет вид шестеренки), либо просто выбрать в меню File -> Save.
В дереве проектов (слева) щелкаем по названию файла main.c (рис. 10) и открываем этот файл.

Рис. 10. Расположение файла main.c в дереве проекта

Прокручиваем файл main.c и находим цикл while(1), в котором находим строку:
/* USER CODE BEGIN 3 */
После этой строки вставляем код для мигания светодиодов, как показано на рис. 11:

if (HAL_GPIO_ReadPin(GPIOB, Kn2_Pin) == 0)
{
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, Led1_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, Led2_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, Led3_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, Led4_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, Led1_Pin|Led2_Pin|Led3_Pin|Led4_Pin, GPIO_PIN_RESET);
}

Рис. 11. Расположение кода для мигания светодиодов в файле main.c

Кратко опишем работу программы. В первой строке программы присутствует условный оператор для нажатия кнопки Kn2. Из рис. 1 следует, что при не нажатом состоянии кнопки (Kn2) на вывод PB10 подается “1” (вывод подключен к питанию +3.3 В) и при нажатом состоянии кнопки на вывод PB10 подается “0” (вывод закорочен на землю). Таким образом, следующий за условным оператором фрагмент кода начинает выполняться, когда кнопка примет состояние “0” (светодиоды начинают мигать при нажатой кнопке Kn2). При этом светодиоды переключаются из состояния GPIO_PIN_SET (“Включено”) в состояние GPIO_PIN_RESET (“Выключено”). Состояние “Выключено” для всех четырех светодиодов задает последняя строка программы. Поскольку на светодиоды постоянно подается напряжение +3.3 В (рис. 1), то для включения и отключения светодиодов предусмотрена кнопка Kn1, которая отключает питание от светодиодов.
Чтобы запустить симуляцию, надо загрузить в Proteus hex-файл. Для этого щелкаем в Proteus по изображению микроконтроллера, в появившемся окошке справа от строки Program File щелкаем по желтому значку папки, появляется проводник Windows, в котором последовательно раскрывая папки проекта Button, находим файл Button.hex и щелкаем по нему левой кнопкой мыши. После этого запускаем симуляцию, нажимаем кнопки Kn1 и Kn2 и наблюдаем мигание светодиодов (рис. 12)

Рис. 12. Моделирование работы программы