Данная заметка касается в первую очередь не работы с микроконтроллерами, а специфики языка программирования.
Я не занимаюсь профессионально разработкой. Микроконтроллеры, да и радиоэлектроника – хобби, редко приносящее доход. Раньше работал в основном с PIC контроллерами и программы для них писал в MikroC Pro for PIC. Было одно окно с программным кодом в котором и была вся программа. Для удобства отдельные блоки кода выносились в функции, для простоты написания, использовались дефайны (#define). Но все это было в одном окне. Текст программ был зачастую достаточно большой и в процессе отладки программы тратилось достаточно много времени на поиск нужных блоков кода работая скролом, выручал CTRL+F. Прозрение пришло внезапно.
Осваивая Keil uVision, разбирая очередные примеры, обратил внимание на «составные» программы. Каждый блок программы выносился в отдельный файл. Все файлы были связаны между собой, тем самым не было одной длинной страницы, а для работы с нужным кодом, можно было сразу открыть нужный файл. Мое открытие не является чем-то выдающимся, такой метод написания программ – стандарт.
Что ж – будем жить проще!
Еще одно отступление: в ближайшее время проектов у меня никаких не предвидится, и для наработки опыта ухожу в протеус, пока без реальных проектов.
Задачи:
Составляем нужную нам схему на микроконтроллере STM32F103C6
C помощью STM32cubeMX создаем проект как описано в заметке 1, настроив PA0 на выход, а PB0 на вход.
2. Повторим задачи из заметки 1 по светодиоду и кнопке.
Обратите внимание на включение светодиода! Что бы его зажечь, нужно на PA0 сформировать низкий уровень, а потушить – высокий.
Формировать нужное состояние вывода PA0 будем командой
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
Где: GPIO_PIN_SET – высокий уровень, GPIO_PIN_RESET – низкий.
Опрашивать ножку микроконтроллера, на которой находится кнопка, будем командой
HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
Итоговый кусок кода:
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(500);
}
else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
Обратите внимание, что команды в библиотеке HAL достаточно длинные и написание каждой из них требует времени. Заменим некоторые фразы на более короткие:
GPIO_PIN_0 на PIN0
SET на OFF
RESET на ON и т.д.
Замену будем производить в отдельном файле. Создадим его.
Application/User ->Add New item to Group 'Aplication/User'…
В открывшемся окне указываем тип файла .h, его имя, жмем на «…».
Указываем для сохранения папку «Inc», жмем «ok» -> «Add»
Получаем файл:
В каждом подобном файле прописываем
#ifndef GPIO_H_
#define GPIO_H_
#endif /* GPIO_H_ */
Данная конструкция позволяет проверить, не было ли где ранее переопределение этого файла
Теперь пишем наши дефайны:
Созданный файл нужно включить в состав нашей программы командой «#include "GPIO.h"»
В файле main.c есть специально место для включения подобных файлов. Пропишем туда команду:
В коде программы теперь можно использовать наши предопределения:
Как видим, код наш немного похудел =) Жмем «F7».