Содержание

Работа с таймером через прерывания

Для работы со счетчиком времени в неблокирующем режиме предусмотрено для модуля 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

Про то, как прошить полученным файлом микроконтроллер, читайте в статье «Прошивка микроконтроллера через UART».


Автор заметки: И.А. Денисов