Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия | Последняя версия Следующая версия справа и слева | ||
ob:o7:timer [2018/11/30 01:13] |
ob:o7:timer [2020/10/29 07:08] 127.0.0.1 внешнее изменение |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ~~META: | ||
+ | title = Работа с таймером через прерывания | ||
+ | ~~ | ||
+ | |||
+ | ====== Работа с таймером через прерывания ====== | ||
+ | |||
+ | Для работы со счетчиком времени в неблокирующем режиме предусмотрено для модуля **MobxARMv6MSTM32SysTick0** и **MobxARMv7MSTM32SysTick0** в зависимости от архитектуры ядра вашего микроконтроллера, | ||
+ | |||
+ | =====Пример для STM32F103C8 (ядро ARMv7)===== | ||
+ | |||
+ | < | ||
+ | MODULE MobxSTM32F103C8Blink; | ||
+ | |||
+ | IMPORT SYSTEM, | ||
+ | MCU := MicroSTM32F10xxD, | ||
+ | ARMv7M := MicroARMv7M, | ||
+ | PinCfg := MicroSTM32F10xPinCfg, | ||
+ | SysTick0 := MobxARMv7MSTM32SysTick0, | ||
+ | Sys := MicroSTM32F103x8System; | ||
+ | |||
+ | VAR (* секция глобальных переменных *) | ||
+ | msec: INTEGER; | ||
+ | |||
+ | PROCEDURE Init; (* настройка МК *) | ||
+ | BEGIN | ||
+ | (* Настраиваем таймер на 1 мс *) | ||
+ | SysTick0.Init(Sys.HCLK, | ||
+ | (* Настраиваем вывод C13 *) | ||
+ | PinCfg.Configure(PinCfg.C, | ||
+ | (* Устанавливаем таймер миллисекунд *) | ||
+ | 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, | ||
+ | ELSIF msec = 500 THEN | ||
+ | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
+ | END; | ||
+ | ARMv7M.WFI (* ждать следующего прерывания, | ||
+ | END | ||
+ | UNTIL FALSE | ||
+ | END MainLoop; | ||
+ | |||
+ | |||
+ | BEGIN | ||
+ | Init; | ||
+ | MainLoop | ||
+ | |||
+ | END MobxSTM32F103C8Blink.</ | ||
+ | |||
+ | Компилируем модуль Mobx/ | ||
+ | < | ||
+ | |||
+ | Собираем HEX и BIN файлы для модуля | ||
+ | < | ||
+ | |||
+ | =====Пример для STM32F030F4 (ядро ARMv6)===== | ||
+ | |||
+ | < | ||
+ | MODULE MobxSTM32F030F4Blink; | ||
+ | |||
+ | IMPORT SYSTEM, | ||
+ | MCU := MicroSTM32F030, | ||
+ | ARMv6M := MicroARMv6M, | ||
+ | PinCfg := MicroSTM32F0Pins, | ||
+ | SysTick0 := MobxARMv6MSTM32SysTick0, | ||
+ | Sys := MicroSTM32F030System; | ||
+ | |||
+ | (* секция глобальных переменных *) | ||
+ | VAR | ||
+ | msec: INTEGER; | ||
+ | |||
+ | |||
+ | PROCEDURE Init; (* настройка МК *) | ||
+ | BEGIN | ||
+ | (* Настраиваем таймер на 1 мс *) | ||
+ | SysTick0.Init(Sys.HCLK, | ||
+ | (* Настраиваем вывод A9 *) | ||
+ | PinCfg.ConfigureOutput(PinCfg.A, | ||
+ | (* Устанавливаем таймер миллисекунд *) | ||
+ | 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, | ||
+ | ELSIF msec = 500 THEN | ||
+ | SYSTEM.PUT(MCU.GPIOABSRR, | ||
+ | END; | ||
+ | ARMv6M.WFI (* ждать следующего прерывания, | ||
+ | END | ||
+ | UNTIL FALSE | ||
+ | END MainLoop; | ||
+ | |||
+ | |||
+ | BEGIN | ||
+ | Init; | ||
+ | MainLoop | ||
+ | |||
+ | END MobxSTM32F030F4Blink.</ | ||
+ | |||
+ | Компилируем модуль Mobx/ | ||
+ | < | ||
+ | |||
+ | Собираем HEX и BIN файлы для модуля. | ||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | Про то, как прошить полученным файлом микроконтроллер, | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | Автор заметки: | ||