пятница, 24 декабря 2021 г.

stm32f103c8t6 cmsis мигалка на таймере

Периферийные устройства микроконтроллера дополняют его функционал а также снижают нагрузку на центральный процессор. Аппаратный таймер микроконтроллера является периферийным устройством отмеряющим заданные промежутки времени и сигнализирующим об их окончании обычно путем установки определённых битов статусных регистров и вызова прерываний. Написать программный код в котором определенные его участки выполняются через определенные временные промежутки проще если для замера этих промежутков будут использоваться аппаратные таймеры чем если для этого будет использоваться только процессор т.к. во втором случае придется считать сколько тактов занимает каждая инструкция которая может повлиять на отмеряемые промежутки времени. В микроконтроллерах STM32 обычно имеется некоторое количество аппаратных таймеров (т.е. больше одного). Они бывают простыми, сложными и "общего назначения" (general purpose). Простые присутствуют не во всех микроконтроллерах а сложные имеют избыточный функционал для простой мигалки, поэтому для изучения работы с таймерами лучше использовать таймер общего назначения, например таймер TIM2 микроконтроллера STM32F103C8. Данный таймер тактируется от шины APB1

Включить его тактирование можно записью 1 в бит 0 регистра APB1ENR



Для разблокирования прерываний, в данном микроконтроллере от данного таймера, в библиотеке CMSIS имеется команда: NVIC_EnableIRQ (TIM2_IRQn);
Чтобы задать отмеряемый промежуток времени, имеются два регистра: PCR и ARR. В регистр PCR записывается число на единицу меньшее того на которое делиться тактовая частота шины APB1 (которая по умолчанию равна 72МГц) чтобы задать минимальный промежуток времени который сможет отсчитать таймер. Т.е. если например в этот регистр записать число 7200-1=7199 то тактовая частота таймера будет равна = 72 000 000 / 7 200 =  10 000 Гц. Следовательно минимальный промежуток времени который сможет отсчитать таймер равен = 1 / 10 000 = 0.0001c. Т.е эта установка делает так что таймер считает один раз в 0.0001с. В регистр ARR записывается число на единицу меньшее числа до которого считает таймер прежде чем вызвать прерывание. Т.е. если например записать в этот регистр число 10 000 - 1 = 9 999 то прерывание будет вызываться 1 раз в секунду т.к. 72 000 000 / (7 200 * 10 000) = 1с. В каждый из этих регистров нельзя помещать число большее чем 65535. Поэтому нельзя например записать в один из них 72 000 000 а в другой 1 и получить задержку в 1 секунду. 
Чтобы разрешить прерывание от таймера есть бит 0 регистра разрешения прерываний DIER:
Чтобы запустить таймер и он начал работать есть бит 0 регистра CR1 таймера:


Теперь можно вне функции "main" написать функцию "void TIM2_IRQHandler();" которая будет вызываться каждый раз когда таймер досчитает до 10 000. В теле этой функции надо прописать код который должен выполниться после того как это произойдет. В нем обязательно надо сбросить бит 0 статаус-регистра SR т.к. этот бит является программно очищаемым флагом обновления прерывания. 


После чего можно инвертировать состояние пина к которому подключен светодиод:
Так период мигания светодиода будет две секунды. Одна секунда - длительность импульса, ещё одна секунда - длительность паузы. Полный код программы можно скопировать из текстового поля:



Светодиод к микроконтроллеру, естественно, подключается также как описано в статье про мигалку на задержках -> https://electe.blogspot.com/2021/12/stm32f103c8t6-cmsis.html т.к. пин к которому он подключается настроен на выход с открытым стоком. В основном цикле программы можно ничего не писать. По данной теме можно посмотреть видео:


Комментариев нет:

Отправить комментарий