Всем привет!) Продолжаем «мучать» ARM, сегодня речь пойдет про Flash.
Адресное пространство Flash
Имеем расширенный встроенный флэш-контроллер (EEFC), далее просто flash, имеет 32-разрядную внутреннею шину. Flash имеет 128-битный или 64-битный интерфейс памяти. Flash может программироваться, ее можно стирать, можно flash блокировать и разблокировать, flash используя полный набор команд.
Одна из команд возвращает определение внедренного флэш дескриптора, который информирует систему об организации флэш, в результате чего программное обеспечение становиться универсальным.
Встроенные характеристики:
1. Интерфейс блока Flash-памяти, с 32-битной внутренней шиной увеличивает производительность в thumb2 режиме (128-бит или 64 бит) до 24 МГц.
2. 32 блокировочных бита, для блокирования каждый своей области
3. GPNVM Биты
4. Один за одним блокировка памяти
5. Команды защищены ключевыми словами
6. Возможно стереть сразу всю память
7. Можно стирать секциями
8. Возможно стереть память до его использования
9. Блокирование и разблокирование операций
10. Последовательное программирование и блокировка операций
Организация flash памяти
На Flash так же возможно организовать прерывание NVIC, для этого необходимо установить FRDY бит.
Перечень команд для работы с Flash:
Получить Flash дескриптор 0x00 GETD
Записать страницу 0x01 WP
Записать страницу и заблокировать 0x02 WPL
Стереть страницу и записать страницу 0x03 EWP
Стереть, записать и заблокировать страницу 0x04 EWPL
Стереть 0x05 EA
Установить Lock Bit 0x08 SLB
Стереть Lock Bit 0x09 CLB
Получить Lock Bit 0x0A GLB
Установить GPNVM Bit 0x0B SGPB
Стереть GPNVM Bit 0x0C CGPB
Получить GPNVM Bit 0x0D GGPB
Начать чтение уникального идентификатора 0x0E STUI
Закончить чтение уникального идентификатора 0x0F SPUI
Регистры Flash
Перед тем как приступим пару слов про IAP функцию, очень интересная штука. Функция располагается в ПЗУ, которая может вызвать приложение и его обрабатывать. Точка входа функции IAP извлекается путем чтения вектор NMI из ПЗУ по адресу 0x00180008.
Как всегда небольшой пример в стиле mcu.by.
#include <sam3u4c.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <flash.h> int main(){ flash_init(); flash_unlock(0x00100000u, 0x00100000u + 0x20000u); flash_write(0x00100000u, "MCU.BY Hello world!", sizeof("MCU.BY Hello world!")); flash_lock(0x00100000u, 0x00100000u + 0x20000u); flash_write(0x00100000u, "MCU.BY1 Hello world!", sizeof("MCU.BY1 Hello world!")); while(1){} }
Мои исходники(сорцы), чтобы потестить работу с flash памятью, делал в Keil-е. Надеюсь, чем – то и помог, продолжим в следующий раз. Всем пока!)