Генерируем проект заново и открываем файл main.c. В нем нам потребуется в ручную запустить таймер в нужном нам режиме. Делается это командой HAL_TIM_Base_Start_IT(&htim4);. IT подразумевает запуск таймера в режиме прерываний. Указатель &htim14 передает функции структуру данных, в которой описаны настройки таймеров. Она генерируется автоматически CubeMX’ом.
Обратите внимание, что функция HAL_TIM_Base_Start_IT(&htim4); вызывается до вхождения в бесконечный цикл.
Далее снова переходим в файл "stm321xx_it.c" и в обработчике прерывания TIM4_IRQHandler добавляем код HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); , изменяющий состояние вывода.
Результат: При нажатой кнопке диод мигает 1 раз в секунду.
3. Внешние переменные
На практике очень часто в прерывании возникает необходимость изменять переменные, которые используются в основном цикле. То есть обращаться к переменным, описанным в другом файле.
Для примера запустим мигание светодиодом в основном цикле с переменной частотой, а частоту будем изменять в прерывании от кнопки.
Начнем с создания переменной в файле main.c:
uint16_t pause=100;
Далее закомментируем функцию запуска таймера в 106ой строке и добавим код, мигающий светодиодом:
Если мы сейчас скомпилируем и загрузим эту программу, то светодиод начнет мигать с периодичностью 200мс. Но будем изменять эту периодичность при помощи кнопки.
Поэтому переходим в файл stm321xx_it.c и создаем в нем внешнюю переменную:
extern uint16_t pause;
Служебное слово extern расширяет область видимости переменной. Важно то, что переменная инициализируется, но не определяется. То есть ей не присваивается никакое значение.
Осталось только добавить изменение этой переменной в прерывании. В строках 201, 202 мы просто прибавляем 100, если переменная меньше тысячи и присваиваем значение, если она равна тысяче.
Результат: Скомпилированная программа при старте будет мигать светодиодом быстро, а при нажатии кнопки будет изменять частоту мигания светодиодом.
Комментарии