Страница 1 из 1
Секция User page на SAMR21 от Atmel
Добавлено: Вт апр 26, 2016 08:51:07
eess9
День добрый товарищи!
До этого не доводилось сталкиваться с ARM от Atmel. Но вот жизнь нас свела...
Подскажите, пожалуйста, что за секцию памяти атмеловские инженеры обозначили как User page в окне программирования? Даташит ничего аналогичного не содержит. Подозреваю, что это часть NVM памяти, которая как-то по другому обозначена в даташите. Ткните носом, пожалуйста.
Re: Секция User page на SAMR21 от Atmel
Добавлено: Вт апр 26, 2016 09:27:22
Z_h_e
Я слегка погуглил и нашел вот такое, на первый попавшийся контроллер ATmel
Страница пользователя (User Page) —
специальная область для хранения дан-
ных пользователя размером 256 байт, на-
ходящаяся во Flash-памяти. Эта область
не стирается командой chip erase; запись
и стирание User Page осуществляется спе-
циальным набором команд. Доступ для
чтения страницы осуществляется таким же
образом, как и для всей Flash-памяти. User
Page идеально подходит для хранения
данных калибровки, серийных номеров,
MAC-адресов и т.д., то есть данных, кото-
рые необходимо сохранять в течение всей
жизни устройства
Оно?
Re: Секция User page на SAMR21 от Atmel
Добавлено: Вт апр 26, 2016 09:41:11
eess9
Да, она. Собственно для хранения mac-адреса я и планирую ее использовать.
Только хрен его знает пока как она называется в даташите. Сами понимаете, что для ее чтения мне нужен адрес начала этой страницы. А с этим пока у меня затык.
Re: Секция User page на SAMR21 от Atmel
Добавлено: Вт апр 26, 2016 09:59:07
Z_h_e
Ну наверное так и называется. Что, в даташит карты памяти нет что-ли?
Re: Секция User page на SAMR21 от Atmel
Добавлено: Вт апр 26, 2016 10:17:14
eess9
Полная карта кристалла есть. Логично, что user page будет внутри Internal Flash. А вот карты флеша хоть ты тресни не могу найти.
Есть у меня подозрение, что User page в даташите называется User row и тогда вот эта строка дает на все ответы:
The NVM User Row can be read at address 0x804000.
В любом случае нужно пробовать читать. Секция сначала считывается программатором, а затем и из программы. Данные должны совпасть. Буду пробовать.
Re: Секция User page на SAMR21 от Atmel
Добавлено: Вт апр 26, 2016 14:19:21
Z_h_e
А Вы попробуйте заполнить все 64 байта тестовыми данными , типа 0x55. Ну чтобы не 0 и не FF. А потом очистить камень. Вроде как эта память не должна стираться.
----
Поглядел даташит на некий другой камень, удалил уже и забыл какой

. Там эта область так и называется User Page, но МК то не тот , хоть и атмел.
Спойлер

Re: Секция User page на SAMR21 от Atmel
Добавлено: Вт апр 26, 2016 14:35:47
eess9
Память не стирается. Это я уже проверил давно)
Re: Секция User page на SAMR21 от Atmel
Добавлено: Чт апр 28, 2016 13:55:15
eess9
Да, адрес оказался верным. Проверил очень просто: считываем в файл данные и смотрим адрес с которого начинается файл.
Может быть кому-то пригодится:
Спойлер
Код: Выделить всё
static uint8_t mac_buffer[64];
static void NVM_config(void)
{
// Turn on the digital interface clock
PM->APBBMASK.reg |= PM_APBBMASK_NVMCTRL;
// Clear error flags
NVMCTRL->STATUS.reg |= NVMCTRL_STATUS_MASK;
// Writing configuration to the CTRLB register
NVMCTRL->CTRLB.reg = NVMCTRL_CTRLB_SLEEPPRM(NVM_SLEEP_POWER_MODE_WAKEONACCESS) | \
((true & 0x01) << NVMCTRL_CTRLB_MANW_Pos) | NVMCTRL_CTRLB_RWS(NVMCTRL->CTRLB.bit.RWS) \
| ((false & 0x01) << NVMCTRL_CTRLB_CACHEDIS_Pos) \
| NVMCTRL_CTRLB_READMODE(NVM_CACHE_READMODE_NO_MISS_PENALTY);
}
static void NVM_read_buffer(uint32_t source_address, uint8_t *buffer, uint8_t length)
{
NVMCTRL->STATUS.reg |= NVMCTRL_STATUS_MASK; // Clear error flags
uint32_t page_address = source_address / 2;
// NVM _must_ be accessed as a series of 16-bit words, perform manual copy to ensure alignment
for (uint16_t i = 0; i < length; i += 2)
{
// Fetch next 16-bit chunk from the NVM memory space
uint16_t data = ((volatile uint16_t *)FLASH_ADDR)[page_address++];
// Copy first byte of the 16-bit chunk to the destination buffer
buffer[i] = (data & 0xFF);
// If we are not at the end of a read request with an odd byte count, store the next byte of data as well
if (i < (length - 1))
buffer[i + 1] = (data >> 8);
}
}
int main (void)
{
system_init();
NVM_config();
memset(&mac_buffer, 0, 64);
NVM_read_buffer(NVMCTRL_AUX0_ADDRESS, &mac_buffer[0], 8);
while (1)
{
asm volatile("nop"::);
}
}