Создадим для микроконтроллера STM32 программу для подключения четырех светодиодов и кнопки, управляющей миганием светодиодов. Смоделируем работу программы в Proteus. Для разработки кода программы будем использовать среду программирования STM32CubeIDE.
Начнем с создания в Proteus проекта Button_Proteus и создания в рамках этого проекта электрической схемы с микроконтроллером. Для этого вытаскиваем на рабочее поле программы Proteus микроконтроллер STM32F103C6, четыре желтых светодиода, блок POWER, две кнопки и землю. Кнопка 1 (обозначим Kn1) подключает питание к светодиодам. Кнопка 2 (обозначим Kn2) управляет миганием светодиодов. В программе будет задействована именно эта кнопка.
Собираем схему, как показано на рис. 1. В учебном пособии “Программирование микроконтроллеров” приводится подробное описание работы с программой Proteus. После того, как схема собрана, выбираем в меню опции: Design > Configure Power Rails (конфигурация силовых цепей). Появляется окно, показанное на рис. 2.
В поле Name щелкаем по стрелочке справа и устанавливаем значение VCC/VDD. В поле Voltage устанавливаем значение +3.3. Обозначения VDDA и VSSA переносим из левой части окна в правую, щелкая по кнопке Add. Окончательно окно принимает вид, показанный на рис. 3. Щелкаем по кнопке OK. На этом подготовка программы Proteus к моделированию заканчивается. Переходим к работе с программой STM32CubeIDE.
Запускаем программу STM32CubeIDE. Создаем новый проект: File > New > STM32 Project. В появившемся окне выбираем микроконтроллер STM32F103C6 (рис. 4).
Нажимаем Next. В появившемся окне указываем имя проекта (в нашем случае Button) и папку расположения проекта (рис. 5).
Нажимаем Finish. Появляется окно со схемой микроконтроллера (рис. 6). В окне на рис. 1 мы подсоединили светодиоды к выводам PA1, PA2, PA3, PA4 и кнопку_2 к выводу PB10. Потому на схеме микроконтроллера надо задать работу выводов PA1 … PA4 на выход, а вывод PB10 – на вход. Для этого щелкаем левой кнопкой мыши по выводам и для PA1 … PA4 выбираем GPIOOutput, а для вывода PB10 выбираем GPIOInput. После этого щелкаем правой кнопкой мыши по указанным выводам, выбираем выпадающую строку EnterUserLabel и присваиваем имена выводам: Led1 … Led4 для светодиодов и Kn2 для кнопки, как показано на рис. 6. При этом выводы меняют цвет с серого на зеленый.
Далее необходимо определить опции, приводящие к генерированию hex-файла при создании кода программы. Для этого в меню выбираем: Project > Properties и в выпадающем окне (рис. 7) щелкаем по строке C/C++ Build и затем по строке Settings (отмечено овалами).
В появившемся окне (рис. 8) щелкаем по строке MCU Post build outputs (отмечена овалом).
Появляется новое окно (рис. 9), в котором проставляем галочки около двух верхних строчек:
Convert to binary file (-O binary)
Convert to Intel Hex file (-O ihex)
(выделены овалом на рис. 9). Внизу окна нажать Apply and Close.
Далее необходимо сгенерировать код программы. Для этого надо щелкнуть по кнопке Device Configuration Tool Code Generation (имеет вид шестеренки), либо просто выбрать в меню File -> Save.
В дереве проектов (слева) щелкаем по названию файла main.c (рис. 10) и открываем этот файл.
Прокручиваем файл 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);
}
Кратко опишем работу программы. В первой строке программы присутствует условный оператор для нажатия кнопки 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)