Ну вот, теперь умеем программные прерывания. Но даже для простенькой вытесняющей ОС этого недостаточно.
Нужен ещё хотя бы один таймер.
Для начала можно рассмотреть SysTickTimer. Это такой специальный 24-битный таймер, который есть во всех ARMах и который умеет циклически считать с определённого заданного значения до нуля на частоте порядка тактовой. Ну и, конечно, имеет своё прерывание.
Основная его задача обычно — инициировать переключение процессов в ОС, ну и отсчитывать временные интервалы для разных событий внутри неё.
читать дальшеРегистров у него много: аж целых четыре штуки.
STK_CTRL (0xE000E010) - регистр настройки и статуса;
STK_LOAD (0xE000E014) - с какого числа он будет считать вниз;
STK_VAL (0xE000E018) - текущее значение; Любая запись сбрасывает его в ноль.
STK_CALIB (0xE000E01С) - число калибровки (только чтение).
В регистре настройки аж 4 значащих бита. Из которых три бита настройки и один статуса. Не знаю, есть ли проще периферия на AVR?
Бит 0 (ENABLE). Флаг включения таймера.
Бит 1 (TICKINT). Флаг разрешения прерывания (которое SysTick_Handler).
Бит 2 (CLKSOURCE). Флаг выбора частоты тактирования. Если бит равен нулю, то тактовая делится на 8 (CKDIV8 прям =DDD), если единице, то не делится.
Бит 16 (COUNTFLAG). Флаг, говорящий о том, что счётчик досчитал до нуля.
Не стоит удивляться такому расположению бит - так удобнее читать статус (LDRH старшего слова будет давать 1 или 0) и настраивать таймер (STRH).
Как уже понятно, настройка проста:
Число F_SYSTICKRELOAD объявлено как тактовая частота, делённая на 1000. Так как пока камень работает от внутреннего RC-генератора (8 МГц), и ещё предделителем таймера делится частота на 8, то итоговая частота падает до 2000 Гц. Ещё где-то делится частота пополам (но я пока не понял где). Но где-то раз в 1 мс прерывание дёргается (я подсчитывал секунды и сравнивал).
Потом с системой тактированя разберусь, как приспичит.
Обработчик я для примера взял примитивнейший: ведётся подсчёт вызовов в переменную SysTickCount.
Собственно, ОС уже можно реализовать, используя эти два механизма. ARM очень хорошо заточен под работу с ОС.
Файлы:
main.s
stm32f4xx.inc
system.inc
system.s
systick.s
Ну и проект. Уже за номером восемь. Кому не интересны возможности ядра по поддержке ОС и ассемблер, может перейти сразу на работу с периферией:
Базовый таймер. Правда, там идёт уже в основном Си. Но переписать логику на ассемблер уже должно быть несложно и самостоятельно.
<< Предыдущее Следующее >>