Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия | Предыдущая версия | ||
|
ob:o7:timer [2018/11/30 01:13] |
ob:o7:timer [2022/02/04 11:45] (текущий) iadenisov |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== Работа с таймером через прерывания ====== | ||
| + | |||
| + | Для работы со счетчиком времени в неблокирующем режиме предусмотрено для модуля **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 файлы для модуля. | ||
| + | < | ||
| + | |||
| + | |||
| + | |||
| + | Про то, как прошить полученным файлом микроконтроллер, | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | Автор заметки: | ||