Инструменты пользователя

Инструменты сайта


ob:o7:timer

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
ob:o7:timer [2017/07/29 14:07]
иван_денисов
ob:o7:timer [2018/11/30 01:13]
Строка 1: Строка 1:
-~~META: 
-title    = Работа с таймером через прерывания 
-creator  = Иван Денисов 
-~~ 
- 
-====== Работа с таймером через прерывания ====== 
- 
-Для работы со счетчиком времени в неблокирующем режиме предусмотрено для модуля **MobxARMv6MSTM32SysTick0** и **MobxARMv7MSTM32SysTick0** в зависимости от архитектуры ядра вашего микроконтроллера, **ARMv6** или **ARMv7** соответственно. 
- 
-=====Пример для STM32F103C8 (ядро ARMv7)===== 
- 
-<code> 
-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.</code> 
- 
-Компилируем модуль Mobx/Files/STM32F103C8Blink.odc, а также перед этим таймер. 
-<code>^Q O7ARMv7MP.Compile MobxARMv7MSTM32SysTick0 MobxSTM32F103C8Blink</code> 
- 
-Собираем HEX и BIN файлы для модуля 
-<code>^Q O7ARMv7MLinker.Link STM32F103C8 MobxSTM32F103C8Blink</code> 
- 
-=====Пример для STM32F030F4 (ядро ARMv6)===== 
- 
-<code> 
-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.</code> 
- 
-Компилируем модуль Mobx/Files/STM32F030F4Blink.odc, а также перед этим таймер. 
-<code>^Q O7ARMv6MP.Compile MobxARMv6MSTM32SysTick0 MobxSTM32F030F4Blink</code> 
- 
-Собираем HEX и BIN файлы для модуля. 
-<code>^Q O7ARMv6MLinker.Link STM32F030F4 MobxSTM32F030F4Blink</code> 
- 
- 
- 
-Про то, как прошить полученным файлом микроконтроллер, читайте в статье «[[ob:o7:stm32flash|Прошивка микроконтроллера через UART]]». 
- 
- 
----- 
- 
-Автор заметки: [[http://iadenisov.ru|И.А. Денисов]] 
  
ob/o7/timer.txt · Последнее изменение: 2022/02/04 11:45 — iadenisov