Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение USer FLASH в EFM32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
JohnKorsh
Добрый день!
Пишу для EFM32G880F128. Мне надо прочитать данные, записанные мной в область User FLASH. Не поделиться ли кто кусочком кода?
Пытался работать через указатели, присваивая указателю значение 0xFE0 0000 - начало User Flash - не прошло на этапе компиляции.
Пока ничего не придумал, а надо побыстрее.
Jenya7
Цитата(JohnKorsh @ Mar 3 2015, 12:52) *
Добрый день!
Пишу для EFM32G880F128. Мне надо прочитать данные, записанные мной в область User FLASH. Не поделиться ли кто кусочком кода?
Пытался работать через указатели, присваивая указателю значение 0xFE0 0000 - начало User Flash - не прошло на этапе компиляции.
Пока ничего не придумал, а надо побыстрее.

это для EFM32TG842. для вашего камня может надо изменить User Data Address.
Код
/*Flash memory pointer*/
#define FLASH_PARAM_ADDR     0x0FE00000

memcpy(&flashParam, (uint32_t*)FLASH_PARAM_ADDR, sizeof (struct sFlashParam));

в принципе чтение из флэша ничем не отличается между контроллерами.
JohnKorsh
Спасибо.
JohnKorsh
Вопрос в дополнение к предыдущему.
Стал тестировать запись - микроконтроллер перезагружается.
Вот мой код:

CODE
WDOG_Enable (false); // Disable of the watchdog.
// For to be on the safe side.
MSC->LOCK = MSC_UNLOCK_CODE; // Unlock of the FLASH writting.
MSC-> WRITECTRL |= MSC_WRITECTRL_WREN; // Set enable of the FLASH writting.
MSC -> ADDRB = USERDATA_BASE; // Set of the FLASH User memory address.
MSC -> WRITECMD = MSC_WRITECMD_LADDRIM; // Write addres to MSC hardware.
MSC -> WRITECMD = MSC_WRITECMD_ERASEPAGE; // Command to erase of the first User FLASH page. !!!

// !!! If I comment of the previous line the microcontroller works, otherwize it rebooted.

// Wait for the FLASH erase process end.

i = 0;
while (((MSC -> STATUS & MSC_STATUS_BUSY) == MSC_STATUS_BUSY) && (i < 100000))
{
i++;
}

...

// Write of the CKS.

MSC -> ADDRB = FLASH_Addr; // Set of the FLASH User memory address.
FLASH_Addr = FLASH_Addr + 4; // Increment of the FLASH Address.
MSC -> WDATA = CKS; // Write of the dara to FLASH write.
MSC -> WRITECMD = MSC_WRITECMD_LADDRIM; // Write addres to hardware.
MSC -> WRITECMD = MSC_WRITECMD_WRITEONCE; // Command to write of the one word.

// !!! If I comment of the previous line the microcontroller works, otherwize it rebooted.


i = 0;
while (((MSC -> STATUS & MSC_STATUS_BUSY) == MSC_STATUS_BUSY) && (i < 100000))
{
i++;
}
MSC-> WRITECTRL &= ~MSC_WRITECTRL_WREN; // Disable of the FLASH writting.
MSC->LOCK = 0x0; // Lock of the FLASH writting.

WDOG_Enable (true); // Enable of the watchdog.
WDOG_Feed(); // Reset of the Watchdog.

Перезагузка происходит при любой попытке изменить FLASH - стереть или записать.
Вчитавшись в User Guide обнаружил маленькую сноску, смысл коиорой - все операции
с FLASH только при коде в RAM.

Собственно сам вопрос - не даст ли кто ссылку или кусочек кода как грамотно
перенести исполняемую функцию в область RAM?
Jenya7
Цитата(JohnKorsh @ Mar 3 2015, 16:14) *
Вопрос в дополнение к предыдущему.
Стал тестировать запись - микроконтроллер перезагружается.

с записью во флэш нужно быть осторожным. вот корректный способ.

Код
#include "em_msc.h"

void WriteToFlash(uint32_t address, uint32_t *data, uint32_t size)
{
    uint32_t *addr = (uint32_t *) address;
    MSC_Init();
    MSC_ErasePage(addr);
    MSC_WriteWord(addr, data, size);
    MSC_Deinit();
}

кстати там уже организован перенос в RAM.
JohnKorsh
Ещё раз спасибо. Но пишу под Keil. Там, для размещения функции в RAM надо секцию организовывать через scstter файл.
Поэтому фирменный код от EnergyMicro не работает, так как Keil не воспринимает атрибуты для Simplicity.
Jenya7
Цитата(JohnKorsh @ Mar 3 2015, 19:36) *
Ещё раз спасибо. Но пишу под Keil. Там, для размещения функции в RAM надо секцию организовывать через scstter файл.
Поэтому фирменный код от EnergyMicro не работает, так как Keil не воспринимает атрибуты для Simplicity.

так может переопределить __attribute__ ((section(".ram"))).
в смысле задать атрибут в коде что функцию надо поместить в рам.
как то не вериться что каждый раз когда надо поместить функцию в рам надо лазить в scatter file.
кстати я пишу не в Simplicity а в Attolic TrueStudio.
Golikov A.
в кейле вы можете функции что вам надо в раме запускать собрать в одном файле. Потом в прожект листе нажать на этот файл правой кнопкой и в свойствах поставить чтобы работало из RAM. Дальше среда все сама сделает... удобно...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.