MSP430FR - ежики или хомячки

Тема в разделе "Флудилка", создана пользователем parovoZZ, 2 июл 2019.

  1. parovoZZ

    parovoZZ Гуру

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

    #include "io430.h"
    #include "stdint.h"
    Определяем константу с сохраняемым объемом
    Код (C++):
    #define Write_Size       4000
    Создадим массив с вышеприведенным количеством элементов. У нас же архитектура 16 бит? Вот столько и запишем в элемент массива
    Код (C++):
    __persistent uint16_t   EEPROM[Write_Size];
    директива __persistent - это аналог __no_init с той разницей, что __no_init указывает компилятору не инициализировать переменную в области SRAM, а __persistent - во FRAM области.
    Инициализируем счетчик, отключаем вачдог и переводим пин со светодиодом на выход и обнуляем регистр вывода
    Код (C++):
      uint16_t      count = 0;

      WDTCTL = WDTPW + WDTHOLD;

      P1DIR |= BIT0;
      P1OUT = 0;
    Далее идет очень хитрая штука. Называется она регистр PM5CTL0. В этом регистре есть бит LOCKLPM5, назначение которого блокировать регистры порта ввода-вывода. А такое необходимо, т.к. выход из режимов x.5 возможен только через ресет. По умолчанию этот бит установлен и вся работа с пинами заблокирована. Чтобы разблокировать, необходимо в него записать 0:
    Код (C++):
    PM5CTL0 &= ~LOCKLPM5;
    Дальше пишем цикл:
    Код (C++):
    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. В заголовочном файле вся эта кухня записана так:
    Код (C++):
    /* 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 .
    Запускаем окно Symbolic Memory, где переходим по адресу 0хС400 (можно подсмотреть в окне Watch по начальному адресу массива) или с помощью меню выбираем FRAM. Листаем область памяти до конца и видим такую картину
    MSP430FRAM.png
    Все наши 8000 байт записаны и лежат в недрах МК.
    Enjoy!

    восемь тысяч байт, Карл!
     
    Последнее редактирование: 2 июл 2019
    Un_ka, Daniil и ИгорьК нравится это.