| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- (*
- Пример для LaunchPad MSP-EXP430G2 Rev1.5
- Запись флэш-памяти.
- При успешном завершении, включается зеленый светодиод,
- иначе - красный.
- *)
- MODULE Flash;
- IMPORT SYSTEM, MSP430;
- CONST
- REDLED = {0};
- GREENLED = {6};
- (* регистры порта P1 *)
- P1OUT = 21H;
- P1DIR = 22H;
- FERASE = {1}; (* режим "стереть" *)
- FWRITE = {6}; (* режим "записать" *)
- 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;
- (*
- стирание и запись флэш-памяти
- adr - адрес
- value - значение для записи
- mode - режим (стереть/записать)
- *)
- PROCEDURE Write (adr, value: INTEGER; mode: SET);
- CONST
- (* сторожевой таймер *)
- WDTCTL = 0120H;
- WDTHOLD = {7};
- WDTPW = {9, 11, 12, 14};
- (* регистры контроллера флэш-памяти *)
- FCTL1 = 0128H;
- ERASE = {1};
- WRT = {6};
- FCTL2 = 012AH;
- FN0 = {0};
- FN1 = {1};
- FN2 = {2};
- FN3 = {3};
- FN4 = {4};
- FN5 = {5};
- FSSEL0 = {6};
- FSSEL1 = {7};
- FCTL3 = 012CH;
- LOCK = {4};
- FWKEY = {8, 10, 13, 15};
- VAR
- wdt: SET;
- BEGIN
- IF (mode = ERASE) OR (mode = WRT) THEN (* проверить заданный режим *)
- SYSTEM.GET(WDTCTL, wdt); (* сохранить значение регистра сторожевого таймера *)
- SYSTEM.PUT(WDTCTL, WDTPW + WDTHOLD); (* остановить сторожевой таймер *)
- SYSTEM.PUT(FCTL2, FWKEY + FSSEL1 + FN0); (* тактовый генератор контроллера флэш-памяти = SMCLK, делитель = 2 *)
- SYSTEM.PUT(FCTL3, FWKEY); (* сбросить флаг LOCK *)
- SYSTEM.PUT(FCTL1, FWKEY + mode); (* установить режим (записать или стереть) *)
- SYSTEM.PUT(adr, value); (* запись *)
- SYSTEM.PUT(FCTL1, FWKEY); (* сбросить режим *)
- SYSTEM.PUT(FCTL3, FWKEY + LOCK); (* установить LOCK *)
- SYSTEM.PUT(WDTCTL, WDTPW + wdt * {0..7}) (* восстановить сторожевой таймер *)
- END
- END Write;
- (* обработчик ошибок *)
- PROCEDURE trap (modNum, modName, err, line: INTEGER);
- BEGIN
- set_bits(P1OUT, REDLED) (* включить красный светодиод *)
- END trap;
- PROCEDURE main;
- CONST
- seg_adr = 0F800H; (* адрес сегмента для стирания и записи (ДОЛЖЕН БЫТЬ СВОБОДНЫМ!) *)
- VAR
- adr, x, i, entry: INTEGER;
- BEGIN
- (* инициализация регистров порта P1 *)
- SYSTEM.PUT8(P1DIR, REDLED + GREENLED); (* выход *)
- (* выключить светодиоды *)
- clr_bits(P1OUT, REDLED + GREENLED);
- MSP430.SetTrapProc(trap); (* назначить обработчик ошибок *)
- ASSERT(seg_adr MOD 512 = 0); (* адрес сегмента должен быть кратным 512 *)
- (* получить адрес используемой части флэш-памяти
- (совпадает с точкой входа в программу) *)
- SYSTEM.GET(0FFFEH, entry);
- (* проверить, свободен ли сегмент *)
- ASSERT(seg_adr + 511 < entry);
- Write(seg_adr, 0, FERASE); (* стереть сегмент *)
- (* записать в сегмент числа 0..255 (256 слов) *)
- adr := seg_adr;
- FOR i := 0 TO 255 DO
- Write(adr, i, FWRITE);
- INC(adr, 2)
- END;
- (* проверить запись *)
- adr := seg_adr;
- FOR i := 0 TO 255 DO
- SYSTEM.GET(adr, x);
- ASSERT(x = i); (* если x # i, будет вызван обработчик ошибок *)
- INC(adr, 2)
- END;
- (* если нет ошибок, включить зеленый светодиод *)
- set_bits(P1OUT, GREENLED)
- END main;
- BEGIN
- main
- END Flash.
|