Flash.ob07 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. (*
  2. Пример для LaunchPad MSP-EXP430G2 Rev1.5
  3. Запись флэш-памяти.
  4. При успешном завершении, включается зеленый светодиод,
  5. иначе - красный.
  6. *)
  7. MODULE Flash;
  8. IMPORT SYSTEM, MSP430;
  9. CONST
  10. REDLED = {0};
  11. GREENLED = {6};
  12. (* регистры порта P1 *)
  13. P1OUT = 21H;
  14. P1DIR = 22H;
  15. FERASE = {1}; (* режим "стереть" *)
  16. FWRITE = {6}; (* режим "записать" *)
  17. PROCEDURE set_bits (mem: INTEGER; bits: SET);
  18. VAR
  19. b: BYTE;
  20. BEGIN
  21. SYSTEM.GET(mem, b);
  22. SYSTEM.PUT8(mem, BITS(b) + bits)
  23. END set_bits;
  24. PROCEDURE clr_bits (mem: INTEGER; bits: SET);
  25. VAR
  26. b: BYTE;
  27. BEGIN
  28. SYSTEM.GET(mem, b);
  29. SYSTEM.PUT8(mem, BITS(b) - bits)
  30. END clr_bits;
  31. (*
  32. стирание и запись флэш-памяти
  33. adr - адрес
  34. value - значение для записи
  35. mode - режим (стереть/записать)
  36. *)
  37. PROCEDURE Write (adr, value: INTEGER; mode: SET);
  38. CONST
  39. (* сторожевой таймер *)
  40. WDTCTL = 0120H;
  41. WDTHOLD = {7};
  42. WDTPW = {9, 11, 12, 14};
  43. (* регистры контроллера флэш-памяти *)
  44. FCTL1 = 0128H;
  45. ERASE = {1};
  46. WRT = {6};
  47. FCTL2 = 012AH;
  48. FN0 = {0};
  49. FN1 = {1};
  50. FN2 = {2};
  51. FN3 = {3};
  52. FN4 = {4};
  53. FN5 = {5};
  54. FSSEL0 = {6};
  55. FSSEL1 = {7};
  56. FCTL3 = 012CH;
  57. LOCK = {4};
  58. FWKEY = {8, 10, 13, 15};
  59. VAR
  60. wdt: SET;
  61. BEGIN
  62. IF (mode = ERASE) OR (mode = WRT) THEN (* проверить заданный режим *)
  63. SYSTEM.GET(WDTCTL, wdt); (* сохранить значение регистра сторожевого таймера *)
  64. SYSTEM.PUT(WDTCTL, WDTPW + WDTHOLD); (* остановить сторожевой таймер *)
  65. SYSTEM.PUT(FCTL2, FWKEY + FSSEL1 + FN0); (* тактовый генератор контроллера флэш-памяти = SMCLK, делитель = 2 *)
  66. SYSTEM.PUT(FCTL3, FWKEY); (* сбросить флаг LOCK *)
  67. SYSTEM.PUT(FCTL1, FWKEY + mode); (* установить режим (записать или стереть) *)
  68. SYSTEM.PUT(adr, value); (* запись *)
  69. SYSTEM.PUT(FCTL1, FWKEY); (* сбросить режим *)
  70. SYSTEM.PUT(FCTL3, FWKEY + LOCK); (* установить LOCK *)
  71. SYSTEM.PUT(WDTCTL, WDTPW + wdt * {0..7}) (* восстановить сторожевой таймер *)
  72. END
  73. END Write;
  74. (* обработчик ошибок *)
  75. PROCEDURE trap (modNum, modName, err, line: INTEGER);
  76. BEGIN
  77. set_bits(P1OUT, REDLED) (* включить красный светодиод *)
  78. END trap;
  79. PROCEDURE main;
  80. CONST
  81. seg_adr = 0F800H; (* адрес сегмента для стирания и записи (ДОЛЖЕН БЫТЬ СВОБОДНЫМ!) *)
  82. VAR
  83. adr, x, i, entry: INTEGER;
  84. BEGIN
  85. (* инициализация регистров порта P1 *)
  86. SYSTEM.PUT8(P1DIR, REDLED + GREENLED); (* выход *)
  87. (* выключить светодиоды *)
  88. clr_bits(P1OUT, REDLED + GREENLED);
  89. MSP430.SetTrapProc(trap); (* назначить обработчик ошибок *)
  90. ASSERT(seg_adr MOD 512 = 0); (* адрес сегмента должен быть кратным 512 *)
  91. (* получить адрес используемой части флэш-памяти
  92. (совпадает с точкой входа в программу) *)
  93. SYSTEM.GET(0FFFEH, entry);
  94. (* проверить, свободен ли сегмент *)
  95. ASSERT(seg_adr + 511 < entry);
  96. Write(seg_adr, 0, FERASE); (* стереть сегмент *)
  97. (* записать в сегмент числа 0..255 (256 слов) *)
  98. adr := seg_adr;
  99. FOR i := 0 TO 255 DO
  100. Write(adr, i, FWRITE);
  101. INC(adr, 2)
  102. END;
  103. (* проверить запись *)
  104. adr := seg_adr;
  105. FOR i := 0 TO 255 DO
  106. SYSTEM.GET(adr, x);
  107. ASSERT(x = i); (* если x # i, будет вызван обработчик ошибок *)
  108. INC(adr, 2)
  109. END;
  110. (* если нет ошибок, включить зеленый светодиод *)
  111. set_bits(P1OUT, GREENLED)
  112. END main;
  113. BEGIN
  114. main
  115. END Flash.