Контроллер энергонезависимой памяти NVMC (Non-Volatile Memory Controller) используется для записи и стирания внутренней памяти FLASH [2] и UICR [3].
Примечание: расшифровку незнакомых терминов и аббревиатур см. в Словарике [6].
Перед тем, как может быть выполнена реальная запись в энергонезависимую память, NVMC должен быть разрешен NVMC для записи с помощью CONFIG.WEN. Подобным образом, чтобы можно было выполнить реальное стирание, NVMC также должен быть разрешен для стирания в CONFIG.EEN, см. описание регистра CONFIG. Пользователь должен гарантировать, что запись и стирание не разрешены одновременно. Невыполнение этого условия может привести к непредсказуемому поведению чипа.
Ресурс записи/стирания памяти FLASH ограничен. К примеру, для nRF51822 гарантированное количество циклов записи/стирания 20000, а для nRF52832 всего лишь 10000. Время хранения информации 10 лет при температуре 40°C. Подробнее см. даташит на используемый микроконтроллер, раздел "Absolute maximum ratings".
[Запись в память FLASH]
Когда разрешена запись FLASH, она записывается путем записи полного 32-разрядного слова по байтовому адресу, выровненному на размер слова (4 байта).
Исходное, "стертое" состояние бит памяти FLASH это лог. 1. NVMC может записывать в биты только лог. 0. Таким образом, если в какой-то бит записан лог. 0, в него нельзя записать лог. 1 без полного стирания страницы FLASH, где находится слово с этим нулевым битом.
Как показано в общем описании памяти [2], память FLASH поделена на несколько страниц, каждая из страниц в свою очередь поделена на несколько блоков. Один и тот же блок FLASH может быть записан только лишь nWRITE раз до выполнения операции стирания через стирание страницы или полное стирание (с использованием ERASEPAGE или ERASEALL соответственно). Размер страницы и размер блока зависят от модели чипа. Например, для nRF52832 размер страницы составляет 4096 байт, а размер блока 512 байт.
С помощью регистрового интерфейса NVMC могут записываться только 32-разрядные слова. Чтобы записать во FLASH порцию данных, меньшую по размеру, чем 32 бита, записывайте эти данные как 32-битное слово, установив на нем в лог. 1 все биты, которые не должны быть изменены (не используются). Следует отметить, что в этом случае по-прежнему действует ограничение на количество операций записи в блок (nWRITE).
Время записи слова FLASH определяется tWRITE. Когда NVMC занят операцией записи FLASH, работа CPU приостанавливается.
Разрешается записывать только те данные, адрес которых выровнен на размер слова (адрес нацело делится на 4). Попытка записи по произвольному адресу байта или по адресу, выровненному на половину слова, может привести к отказу hard fault.
[Стирание страницы FLASH]
Когда разрешено стирание, память FLASH может стираться постранично с помощью регистра ERASEPAGE.
После стирания страницы FLASH все её биты данных переходят в состояние лог. 1. Время стирания страницы определяется tERASEPAGE. Когда NVMC занят операцией стирания FLASH, работа CPU приостанавливается.
Регистры UICR записываются точно так же, как и память FLASH. После того, как регистр UICR было записан, новая конфигурация UICR вступит в силу только после сброса.
Точно так же, как и для FLASH, регистры UICR могут записываться только nWRITE раз, после чего для последующей записи должна быть выполнена операция стирания (ERASEUICR или ERASEALL).
Время записи слова в UICR определяется tWRITE. Когда NVMC занят операцией записи UICR, работа CPU приостанавливается.
Когда стирание разрешено, UICR может быть стерт с помощью регистра ERASEUICR.
После стирания UICR все биты в UICR установятся в лог. 1. Время, занимаемое стиранием UICR, определяется tERASEPAGE. Когда NVMC занят операцией стирания UICR, работа CPU приостанавливается.
[Полное стирание]
Когда стирание разрешено, вся память FLASH и UICR могут быть стерты с использованием регистра ERASEALL. ERASEALL стирает заводские конфигурационные регистры FICR [4].
Время, занимаемое выполнением команды ERASEALL, определяется tERASEALL. Когда NVMC занят операцией стирания, работа CPU приостанавливается.
[Кэш]
В NVMC может быть разрешен кэш инструкций (instruction cache, I-Cache) для шины ICODE. Распределение адресов в карте памяти см. в [2].
Попадание в кэш (cache hit) означает, что код инструкции будет выбран из быстрой памяти без задержек на такты ожидания (0 wait-state) вместо долгого обращения к физической ячейке FLASH. При промахах мимо кэша (cache miss), при доступе к инструкциям добавляется некоторое количество тактов ожидания (wait-states). Это происходит из-за необходимости физического доступа к коду программ (выборки инструкции или данных), находящегося в памяти FLASH. Количество тактов ожидания зависит от рабочей частоты процессора (подробнее см. [6]).
Разрешение кэша может повысить производительность CPU и снизить количество циклов ожидания при доступе к FLASH. Повышение производительности зависит от частоты попаданий к кэш. Однако когда кэш разрешена, она потребляет дополнительный ток. Если уменьшение среднего тока из-за уменьшенного доступа к флэш-памяти больше, чем потребляемый ток кэш-памяти, то средний ток для выполнения программного кода уменьшится.
Когда кэш запрещена, она не потребляет дополнительный ток, и не поддерживает состояние своих данных.
Можно разрешить профайлинг кэша (cache profiling), чтобы проанализировать производительность кэша для программы, используя регистр ICACHECNF. Когда профайлинг разрешен, регистры IHIT и IMISS инкрементируются для каждого попадания и промаха кэша соответственно. Регистры профайлинга попаданий и промахов не переходят в 0 при своем переполнении. Если достигнуто их максимальное значение, то для получение корректных значений профайлинга рассматривайте более короткий интервал накопления статистики попаданий и промахов.
[Регистры NVMC]
Таблица 1. Экземпляры NVMC, базовый адрес начала адресного пространства регистров.
Баз. адрес
Периф. устройство
Экз.
Описание
0x4001E000
NVMC
NVMC
Non-Volatile Memory Controller
Таблица 2. Обзор регистров NVMC.
Регистр
Смещ.
Описание
READY
0x400
Флаг готовности.
CONFIG
0x504
Регистр конфигурации.
ERASEPAGE
0x508
Регистр для стирания страницы в области Code.
ERASEPCR1
Устаревшее обозначение ERASEPAGE.
ERASEALL
0x50C
Регистр для стирания всей энергонезависимой памяти пользователя.
ERASEPCR0
0x510
Устарело. Регистр для стирания страницы в области Code, делает то же самое, что и ERASEPAGE.
ERASEUICR
0x514
Регистр для стирания регистров информации конфигурации пользователя (UICR).
Задает режим доступа к памяти программ. Настоятельно рекомендуется активировать доступ на запись или стирание только в те моменты времени, когда это реально необходимо. Разрешение записи или стирания переводит кэш в недостоверное состояние, и кэш остается в недостоверном состоянии. 0: Ren, разрешен доступ только на чтение. 1: Wen, запись разрешена. 2: Een, стирание разрешено.
Смещение адреса: 0x508. Регистр для стирания страницы FLASH в области Code.
Биты регистра ERASEPAGE:
№ бита
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Id
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
Reset 0x00000000
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Назначение бит:
Id
RW
Поле
Описание
A
RW
ERASEPAGE
Регистр для запуска операции стирания страницы в области Code. Записываемое значение это абсолютный адрес, принадлежащей стираемой странице (адрес первого слова на странице FLASH).
Обратите внимание, что должно быть разрешено стирание кода путем записи Een в поле CONFIG.WEN перед тем, как страницу можно будет стереть. Попытка стереть страницу, которая не находится в области кода, может привести к непредсказуемому поведению, например может быть стерта не та страница.
Смещение адреса: 0x50C. Регистр для стирания всей энергонезависимой памяти пользователя (FLASH и UICR).
Биты регистра ERASEALL:
№ бита
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Id
A
Reset 0x00000000
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Назначение бит:
Id
RW
Поле
Описание
A
RW
ERASEALL
Регистр для запуска операции стирания всей памяти пользователя, включая UICR. 0: NoOperation, нет операции. 1: Erase, запуск стирания памяти чипа.
Обратите внимание, что должно быть разрешено стирание кода путем записи Een в поле CONFIG.WEN перед тем, как можно будет записать ERASEALL, чтобы выполнить полное стирание.