MSP430: обновление примеров, библиотеки и документации

This commit is contained in:
AntKrotov committed 2019-08-08 16:27:30 +03:00
1 parent 4d0b30ce95
commit c94a11e496
5 files changed
+207 -26

No files matched your search

+66 -24
View File
@@ -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 очищается, назначается пустой обработчик прерываний,
сбрасывается обработчик ошибок и выключается сторожевой таймер.
Всё прочее состояние ОЗУ и регистров устройств сохраняется.
==============================================================================
+5
View File
@@ -37,4 +37,9 @@ BEGIN
END SetInt;
PROCEDURE [code] Restart*
4302H, (* MOV #0, SR *)
4210H, 0FFFEH; (* MOV 0FFFEH(SR), PC *)
END MSP430.
+1
View File
@@ -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 *)
+1 -2
View File
@@ -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); (* назначить обработчик ошибок *)
+134
View File
@@ -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.