Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
ob:o7:timer [2017/07/29 14:05] иван_денисов |
ob:o7:timer [2018/11/30 01:13] |
||
---|---|---|---|
Строка 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 файлы для модуля. | ||
- | < | ||
- | |||
- | |||
- | |||
- | Про то, как прошить полученным файлом микроконтроллер, | ||
- | |||
- | |||
- | ---- | ||
- | |||
- | Автор заметки: | ||