Перейти к содержанию
  • записи
    2
  • комментариев
    0
  • просмотра
    1 323

Записываем данные во FRAM


parovoZZ

1 310 просмотров

Как часто у вас бывало так, что необходимо хранить данные в ЭСППЗУ, но в текущем МК места не хватало? Приходится брать следующий по уровню МК, хотя во всем остальном он избыточен. В MSP430 на основе FRAM памяти это уже может быть вовсе и не проблемой. Изначально FRAM память поделена на сегменты. В старших моделях таких сегментов 3 с произвольной защитой каждого из них, а в кристалле 2433 всего два сегмента: под код программы и под информационный сегмент. Но вся прелесть в том, что мы можем сохранять свои данные не только в информационном сегменте (у нас он всего 512 байт), но и в сегменте программ.
От слов к делу. Сколько будем хранить? У меня IAR с лицензионным ограничением линковщика на 8кБ. Вот давайте столько и запишем =)
Подключаем обязательные файлы

#include "io430.h"
#include "stdint.h"

Определяем константу с сохраняемым объемом:

#define Write_Size       4000

Создадим массив с вышеприведенным количеством элементов. У нас же архитектура 16 бит? Вот столько и запишем в элемент массива:

__persistent uint16_t   EEPROM[Write_Size];

директива __persistent - это аналог __no_init с той разницей, что __no_init указывает компилятору не инициализировать переменную в области SRAM, а __persistent - во FRAM области.
Инициализируем счетчик, отключаем вачдог и переводим пин со светодиодом (для визуального наблюдения) на выход и обнуляем регистр вывода:

uint16_t      count = 0;

  WDTCTL = WDTPW + WDTHOLD;

  P1DIR |= BIT0;
  P1OUT = 0;

Далее идет очень хитрая штука. Называется она регистр PM5CTL0. В этом регистре есть бит LOCKLPM5, назначение которого блокировать регистры порта ввода-вывода. А такое необходимо, т.к. выход из режимов x.5 возможен только через ресет. По умолчанию этот бит установлен и вся работа с пинами заблокирована. Чтобы разблокировать, необходимо в него записать 0:

PM5CTL0 &= ~LOCKLPM5;

Дальше пишем цикл:

while (1)
  {
  if (EEPROM[Write_Size - 1] == Write_Size - 1)
  {
       P1OUT |= BIT0;
  }
  else
      {
          SYSCFG0 = FRWPPW;
          for (uint16_t i = 0; i < Write_Size; i++)
          {
               EEPROM[i] = count++;
          }
          SYSCFG0 = FRWPPW | PFWP;
      }

  }

Если в последнем элементе массива ожидаемое значение, то загорается светодиод, если нет, то уходим в подпрограмму записи элементов массива. Но прежде, чем его писать, необходимо разрешить запись в область FRAM памяти. Это делается с помощью записи разрешающей сигнатуры, которая определена в константе FRWPPW, в регистр SYSCFG0. По окончании записи и для защиты FRAM памяти от перезаписи необходимо поднять бит PFWP. В заголовочном файле вся эта кухня записана так:

/* SYSCFG0 Control Bits */
#define PFWP_L              (0x0001u)  /* Program FRAM Write Protection */
#define DFWP_L              (0x0002u)  /* Data FRAM Write Protection */

#define FRWPPW              (0xA500u)  /* FRAM protection password */

Запускаем IAR, прошиваемся. Передергиваем питание и снова заходим в дебаггер с помощью кнопочки

MSP430_0.png.28abac9fc50a6fa041224b50dabbc366.png

Запускаем окно Symbolic Memory, где переходим по адресу 0хС400 (можно подсмотреть в окне Watch по начальному адресу массива) или с помощью меню выбираем FRAM. Листаем область памяти до конца и видим такую картину

MSP430FRAM.thumb.png.c116c08a19bc0a01fbd6b26debc33ecf.png

Все наши 8000 байт записаны и лежат в недрах МК.
Enjoy!

0 Комментариев


Рекомендуемые комментарии

Комментариев нет

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Добавить комментарий...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...