Jump to content

MSP430FR

Sign in to follow this  
  • entries
    2
  • comments
    0
  • views
    183

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

parovoZZ

81 views

Как часто у вас бывало так, что необходимо хранить данные в ЭСППЗУ, но в текущем МК места не хватало? Приходится брать следующий по уровню МК, хотя во всем остальном он избыточен. В 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 Comments


Recommended Comments

There are no comments to display.

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...