mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
MSP430: обновление примеров, библиотеки и документации
This commit is contained in:
1 parent
4d0b30ce95
commit
c94a11e496
5 files changed
+207
-26
No files matched your search
+66
-24
@@ -367,12 +367,28 @@ SYSTEM.
|
||||
ADD #2, SP ; удалить из стэка значение priority
|
||||
RETI ; возврат из прерывания (восстановить SR и PC)
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Обработка ошибок
|
||||
|
||||
В случае возникновения ошибки при выполнении программы, будет вызван общий
|
||||
обработчик ошибок, который:
|
||||
|
||||
- запрещает прерывания
|
||||
- сбрасывает стэк (во избежание переполнения в процессе обработки ошибки)
|
||||
- передает параметры в пользовательский обработчик (см. далее)
|
||||
- вызывает пользовательский обработчик (если он назначен)
|
||||
- повторно запрещает прерывания
|
||||
- выключает CPU
|
||||
|
||||
Если выключать CPU не требуется, то пользовательский обработчик может,
|
||||
например, выполнить перезапуск программы.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Инициализация и финализация программы
|
||||
|
||||
В начало программы компилятор вставляет команды для инициализации регистров
|
||||
SP и R14, для остановки сторожевого таймера, а также назначает пустой
|
||||
обработчик прерываний.
|
||||
SP и R14, для остановки сторожевого таймера, назначает пустой обработчик
|
||||
прерываний и сбрасывает обработчик ошибок.
|
||||
|
||||
В конец программы добавляет команду
|
||||
BIS #16, SR; выключить CPU
|
||||
@@ -405,42 +421,68 @@ R14 увеличивается (если есть свободная памят
|
||||
то перед кодом будет свободная область. Таким способом можно зарезервировать
|
||||
нижние сегменты флэш-памяти для записи во время выполнения программы.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Модуль MSP430
|
||||
==============================================================================
|
||||
MODULE MSP430
|
||||
|
||||
TYPE
|
||||
|
||||
TRAPPROC = PROCEDURE (ModName, Line_Err: INTEGER);
|
||||
|
||||
Процедура-обработчик ошибок
|
||||
|
||||
ModName - адрес имени модуля
|
||||
Line_Err - младшие четыре бита - номер ошибки, остальное - номер
|
||||
строки
|
||||
|
||||
|
||||
|
||||
INTPROC = PROCEDURE (priority, ptr: INTEGER);
|
||||
|
||||
Процедура-обработчик прерываний
|
||||
|
||||
PROCEDURE SetTrap (trap: TRAPPROC)
|
||||
назначить обработчик ошибок:
|
||||
priority - приоритет прерывания:
|
||||
|
||||
ModName - адрес имени модуля
|
||||
Line_Err - младшие четыре бита - номер ошибки, остальное - номер строки
|
||||
адрес приоритет
|
||||
0FFFEH 31
|
||||
0FFFCH 30
|
||||
0FFFAH 29
|
||||
...
|
||||
0FFC0H 0
|
||||
|
||||
|
||||
PROCEDURE SetInt (int: INTPROC)
|
||||
назначить обработчик прерываний:
|
||||
ptr - указатель на структуру:
|
||||
|
||||
priority - приоритет прерывания:
|
||||
смещение значение
|
||||
0: priority
|
||||
+2: сохраненное значение регистра SR
|
||||
+4: сохраненное значение регистра PC
|
||||
|
||||
адрес приоритет
|
||||
0FFFEH 31
|
||||
0FFFCH 30
|
||||
0FFFAH 29
|
||||
...
|
||||
0FFC0H 0
|
||||
Если изменить значения &(ptr+2) и &(ptr+4), то изменения вступят
|
||||
в силу после возврата из прерывания.
|
||||
|
||||
Например:
|
||||
|
||||
SYSTEM.PUT(ptr + 2, 0);
|
||||
SYSTEM.MOVE(0FFFEH, ptr + 4, 2);
|
||||
|
||||
После возврата из прерывания, произойдет перезапуск программы,
|
||||
т. к. PC получит значение вектора сброса, а SR очистится.
|
||||
|
||||
|
||||
ptr - указатель на структуру:
|
||||
PROCEDURE SetTrap (trap: TRAPPROC)
|
||||
Назначить обработчик ошибок.
|
||||
|
||||
смещение значение
|
||||
0: priority
|
||||
+2: сохраненное значение регистра SR
|
||||
+4: сохраненное значение регистра PC
|
||||
PROCEDURE SetInt (int: INTPROC)
|
||||
Назначить обработчик прерываний.
|
||||
|
||||
Нельзя вызывать эту процедуру с параметром NIL, т. к. для экономии тактов,
|
||||
значение адреса обработчика прерываний не проверяется на NIL.
|
||||
Нельзя вызывать эту процедуру с параметром NIL, т. к. для экономии
|
||||
тактов, значение адреса обработчика прерываний не проверяется на NIL.
|
||||
|
||||
PROCEDURE Restart
|
||||
Перезапустить программу.
|
||||
При этом: повторно выполняется инициализация регистров SP и R14,
|
||||
регистр SR очищается, назначается пустой обработчик прерываний,
|
||||
сбрасывается обработчик ошибок и выключается сторожевой таймер.
|
||||
Всё прочее состояние ОЗУ и регистров устройств сохраняется.
|
||||
|
||||
==============================================================================
|
||||
@@ -37,4 +37,9 @@ BEGIN
|
||||
END SetInt;
|
||||
|
||||
|
||||
PROCEDURE [code] Restart*
|
||||
4302H, (* MOV #0, SR *)
|
||||
4210H, 0FFFEH; (* MOV 0FFFEH(SR), PC *)
|
||||
|
||||
|
||||
END MSP430.
|
||||
@@ -321,6 +321,7 @@ PROCEDURE [code] _error* (module, err: INTEGER)
|
||||
2400H + 1, (* JZ L *)
|
||||
1284H, (* CALL R4 *)
|
||||
(* L: *)
|
||||
0C232H, (* BIC #8, SR; DINT *)
|
||||
0D032H, 10H; (* BIS #10H, SR; CPUOFF *)
|
||||
|
||||
|
||||
|
||||
@@ -120,8 +120,7 @@ BEGIN
|
||||
SYSTEM.PUT8(P1DIR, REDLED + GREENLED); (* выход *)
|
||||
|
||||
(* выключить светодиоды *)
|
||||
clr_bits(P1OUT, REDLED);
|
||||
clr_bits(P1OUT, GREENLED);
|
||||
clr_bits(P1OUT, REDLED + GREENLED);
|
||||
|
||||
MSP430.SetTrap(trap); (* назначить обработчик ошибок *)
|
||||
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
(*
|
||||
|
||||
Пример для LaunchPad MSP-EXP430G2 Rev1.5
|
||||
|
||||
При нажатии на кнопку P1.3, инкрементируется
|
||||
переменная-счетчик перезапусков и программа
|
||||
перезапускается.
|
||||
В зависимости от четности счетчика перезапусков,
|
||||
включается зеленый или красный светодиод.
|
||||
|
||||
*)
|
||||
|
||||
MODULE Restart;
|
||||
|
||||
IMPORT SYSTEM, MSP430;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
REDLED = {0};
|
||||
GREENLED = {6};
|
||||
BUTTON = {3};
|
||||
|
||||
(* регистры порта P1 *)
|
||||
P1OUT = 21H;
|
||||
P1DIR = 22H;
|
||||
P1IFG = 23H;
|
||||
P1IE = 25H;
|
||||
P1REN = 27H;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
count: INTEGER; (* счетчик перезапусков *)
|
||||
|
||||
N: INTEGER; (* для задержки *)
|
||||
|
||||
|
||||
PROCEDURE delay (n: INTEGER);
|
||||
BEGIN
|
||||
N := n;
|
||||
WHILE N > 0 DO DEC(N) END
|
||||
END delay;
|
||||
|
||||
|
||||
PROCEDURE set_bits (mem: INTEGER; bits: SET);
|
||||
VAR
|
||||
b: BYTE;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(mem, b);
|
||||
SYSTEM.PUT8(mem, BITS(b) + bits)
|
||||
END set_bits;
|
||||
|
||||
|
||||
PROCEDURE clr_bits (mem: INTEGER; bits: SET);
|
||||
VAR
|
||||
b: BYTE;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(mem, b);
|
||||
SYSTEM.PUT8(mem, BITS(b) - bits)
|
||||
END clr_bits;
|
||||
|
||||
|
||||
PROCEDURE test_bits (mem: INTEGER; bits: SET): SET;
|
||||
VAR
|
||||
b: BYTE;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(mem, b)
|
||||
RETURN bits * BITS(b)
|
||||
END test_bits;
|
||||
|
||||
|
||||
(*
|
||||
обработчик прерываний
|
||||
|
||||
priority - приоритет прерывания:
|
||||
|
||||
адрес приоритет
|
||||
0FFFEH 31
|
||||
0FFFCH 30
|
||||
0FFFAH 29
|
||||
...
|
||||
0FFC0H 0
|
||||
|
||||
|
||||
ptr - указатель на структуру:
|
||||
|
||||
смещение значение
|
||||
0: priority
|
||||
+2: сохраненное значение регистра SR
|
||||
+4: сохраненное значение регистра PC
|
||||
*)
|
||||
PROCEDURE int (priority, ptr: INTEGER);
|
||||
BEGIN
|
||||
IF priority = 18 THEN (* прерывание от порта P1 *)
|
||||
IF test_bits(P1IFG, BUTTON) = BUTTON THEN (* нажата кнопка *)
|
||||
INC(count); (* увеличить счетчик *)
|
||||
delay(20000); (* задержка для отпускания кнопки *)
|
||||
clr_bits(P1IFG, BUTTON); (* сбросить флаг прерывания *)
|
||||
MSP430.Restart (* перезапустить программу *)
|
||||
END
|
||||
END
|
||||
END int;
|
||||
|
||||
|
||||
PROCEDURE main;
|
||||
BEGIN
|
||||
(* инициализация регистров порта P1 *)
|
||||
SYSTEM.PUT8(P1DIR, REDLED + GREENLED); (* выход *)
|
||||
set_bits(P1REN, BUTTON); (* включить подтягивающий резистор *)
|
||||
set_bits(P1OUT, BUTTON); (* подтяжка к питанию *)
|
||||
set_bits(P1IE, BUTTON); (* разрешить прерывания от кнопки *)
|
||||
|
||||
(* выключить светодиоды *)
|
||||
clr_bits(P1OUT, REDLED + GREENLED);
|
||||
|
||||
MSP430.SetInt(int); (* назначить обработчик прерываний *)
|
||||
SYSTEM.EINT; (* разрешить прерывания *)
|
||||
|
||||
IF ODD(count) THEN
|
||||
set_bits(P1OUT, GREENLED) (* нечетное - вкл. зеленый *)
|
||||
ELSE
|
||||
set_bits(P1OUT, REDLED) (* четное - вкл. красный *)
|
||||
END
|
||||
|
||||
END main;
|
||||
|
||||
|
||||
BEGIN
|
||||
main
|
||||
END Restart.
|
||||
Reference in new issue
Block a user