Реалити-шоу «КБ13 и АЦП». День 4.

Решили поиграться с записью во флэш, что обеспечит плате сохранение заданной конфигурации. Надо немножко отвлечься от борьбы со временем считывания. Точнее, можно и удовлетвориться достигнутым — все-равно 10 мкс это очень быстро, у АЦП от Fastwell, например, время считывания всех каналов по паспорту 160 мкс, а на деле и того больше.
По задумке, АЦП стартует, смотрит во флэш — есть ли сохраненная ранее конфигурация, и либо начинает работать по уже имеющимся настройкам, либо ждет инициализации.

Работа с флэш-контроллером на нашем процессоре особой сложности не составляет — поставляемый в software-framework flashc драйвер запустился и заработал без каких либо шаманств и плясок.

Как стало известно из даташита, встроенная флэш предоставляет пространство, именуемое user page и предназначенное специально для наших целей — энергонезависимого сохранения настроек, конфигураций, кодов и тому подобной информации.

Инициализируем структуру данных в юзерпэйдж-секции памяти:

#if __GNUC__
__attribute__((__section__(".userpage")))
#endif
static nvram_data_t user_nvram_data
#if __ICCAVR32__
@ "USERDATA32_C"
#endif
;

Сама структура nvram_data_t:

typedef const struct
{
  U8  var8;
  U16 var16;
  U8  var8_3[3];
  U32 var32;
} nvram_data_t;

Берем из примера функцию записи в память:

static void flash_rw_example(nvram_data_t *nvram_data)
{
  static const U8 write_data[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
  volatile void * addr;

  flashc_memset((void *)nvram_data, 0x00, 8, sizeof(*nvram_data), TRUE);

  addr = flashc_memcpy((void *)&nvram_data->var8,   &write_data, sizeof(nvram_data->var8),   TRUE);
  addr = flashc_memcpy((void *)&nvram_data->var16,  &write_data, sizeof(nvram_data->var16),  TRUE);
  addr = flashc_memcpy((void *)&nvram_data->var8_3, &write_data, sizeof(nvram_data->var8_3), TRUE);
  addr = flashc_memcpy((void *)&nvram_data->var32,  &write_data, sizeof(nvram_data->var32),  TRUE);
}

Напишем функцию чтения.
Чтение в данном случае можно делать просто обращением по адресу функцией memcpy (чего в нашем примере более чем достаточно).
Здесь приведена функция, которая читает только с адреса 0x80800008 — это немного некорректно, если ставить эксперименты, потому что на самом деле nvram_data располагается с адреса 0x80800000. Но мне было нужно посмотреть считывание именно 32-битных слов, а в функции записи 32-битное слово располагается начиная с 0x80800008 (это я увидел в процессе отладки).

static void flash_rd_example(void)
{
  static const U8 read_data[8];
  volatile void * addr = (void *)0x80800008;

  memcpy (&read_data,(void *)addr,sizeof(nvram_data->var32));
}

Ну и main() — сначала записать, потом считать и посмотреть, сходится ли результат.
Причем смотреть можно и в дебаггере eclipse (как я и делал).

int main(void)
{
	unsigned int i=0;

	init();

  LED_ON(RED);

  flash_rw_example(&user_nvram_data);

  flash_rd_example();

  LED_OFF(RED);
  LED_ON(YELLOW);

  while (TRUE);
}

Вот и все.
В понедельник планируется окончательно проверить, работает ли sdram-память и rs на разогнанном процессоре и до конца недели заиметь уже работающий прототип прошивки.

Похожий бред:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Protected by WP Anti Spam