====== Работа с таймером через прерывания ====== Для работы со счетчиком времени в неблокирующем режиме предусмотрено для модуля **MobxARMv6MSTM32SysTick0** и **MobxARMv7MSTM32SysTick0** в зависимости от архитектуры ядра вашего микроконтроллера, **ARMv6** или **ARMv7** соответственно. =====Пример для STM32F103C8 (ядро ARMv7)===== MODULE MobxSTM32F103C8Blink; IMPORT SYSTEM, MCU := MicroSTM32F10xxD, (* адреса разных регистров для STM32F103C8 *) ARMv7M := MicroARMv7M, (* адреса и команды общие для всех ядер ARMv7M *) PinCfg := MicroSTM32F10xPinCfg, (* настройка ног *) SysTick0 := MobxARMv7MSTM32SysTick0, (* таймер на прерываниях *) Sys := MicroSTM32F103x8System; VAR (* секция глобальных переменных *) msec: INTEGER; (* счетчик миллисекунд *) PROCEDURE Init; (* настройка МК *) BEGIN (* Настраиваем таймер на 1 мс *) SysTick0.Init(Sys.HCLK, 1000); (* Настраиваем вывод C13 *) PinCfg.Configure(PinCfg.C, 13, PinCfg.outputPushPull2MHz); (* Устанавливаем таймер миллисекунд *) msec := 0; END Init; PROCEDURE MainLoop; (* главный цикл *) BEGIN REPEAT IF SysTick0.OnTimer() THEN IF msec = 999 THEN msec := 0 ELSE INC(msec) END; IF msec = 0 THEN SYSTEM.PUT(MCU.GPIOCBSRR, {13}); (* поднять напряжение на PС13 *) ELSIF msec = 500 THEN SYSTEM.PUT(MCU.GPIOCBSRR, {13 + 16}) (* убрать напряжение на PС13 *) END; ARMv7M.WFI (* ждать следующего прерывания, перейти в "спящий режим" *) END UNTIL FALSE END MainLoop; BEGIN Init; MainLoop END MobxSTM32F103C8Blink. Компилируем модуль Mobx/Files/STM32F103C8Blink.odc, а также перед этим таймер. ^Q O7ARMv7MP.Compile MobxARMv7MSTM32SysTick0 MobxSTM32F103C8Blink Собираем HEX и BIN файлы для модуля ^Q O7ARMv7MLinker.Link STM32F103C8 MobxSTM32F103C8Blink =====Пример для STM32F030F4 (ядро ARMv6)===== MODULE MobxSTM32F030F4Blink; IMPORT SYSTEM, MCU := MicroSTM32F030, (* адреса разных регистров для STM32F030 *) ARMv6M := MicroARMv6M, (* адреса и команды общие для всех ядер ARMv6M *) PinCfg := MicroSTM32F0Pins, (* настройка ног *) SysTick0 := MobxARMv6MSTM32SysTick0, (* таймер на прерываниях *) Sys := MicroSTM32F030System; (* секция глобальных переменных *) VAR msec: INTEGER; (* счетчик миллисекунд *) PROCEDURE Init; (* настройка МК *) BEGIN (* Настраиваем таймер на 1 мс *) SysTick0.Init(Sys.HCLK, 1000); (* Настраиваем вывод A9 *) PinCfg.ConfigureOutput(PinCfg.A, 9, PinCfg.noPull, PinCfg.pushPullMedium); (* Устанавливаем таймер миллисекунд *) msec := 0; END Init; PROCEDURE MainLoop; (* главный цикл *) BEGIN REPEAT IF SysTick0.OnTimer() THEN IF msec = 999 THEN msec := 0 ELSE INC(msec) END; IF msec = 0 THEN SYSTEM.PUT(MCU.GPIOABSRR, {9}); (* поднять напряжение на PA9 *) ELSIF msec = 500 THEN SYSTEM.PUT(MCU.GPIOABSRR, {9 + 16}) (* убрать напряжение на PA9 *) END; ARMv6M.WFI (* ждать следующего прерывания, перейти в "спящий режим" *) END UNTIL FALSE END MainLoop; BEGIN Init; MainLoop END MobxSTM32F030F4Blink. Компилируем модуль Mobx/Files/STM32F030F4Blink.odc, а также перед этим таймер. ^Q O7ARMv6MP.Compile MobxARMv6MSTM32SysTick0 MobxSTM32F030F4Blink Собираем HEX и BIN файлы для модуля. ^Q O7ARMv6MLinker.Link STM32F030F4 MobxSTM32F030F4Blink Про то, как прошить полученным файлом микроконтроллер, читайте в статье «[[ob:o7:stm32flash|Прошивка микроконтроллера через UART]]». ---- Автор заметки: [[http://iadenisov.ru|И.А. Денисов]]