JohnKorsh 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Добрый день! Пишу для EFM32G880F128. Мне надо прочитать данные, записанные мной в область User FLASH. Не поделиться ли кто кусочком кода? Пытался работать через указатели, присваивая указателю значение 0xFE0 0000 - начало User Flash - не прошло на этапе компиляции. Пока ничего не придумал, а надо побыстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 марта, 2015 Опубликовано 3 марта, 2015 (изменено) · Жалоба Добрый день! Пишу для 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)); в принципе чтение из флэша ничем не отличается между контроллерами. Изменено 3 марта, 2015 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 3 марта, 2015 Опубликовано 3 марта, 2015 (изменено) · Жалоба Вопрос в дополнение к предыдущему. Стал тестировать запись - микроконтроллер перезагружается. Вот мой код: 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? Изменено 3 марта, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 марта, 2015 Опубликовано 3 марта, 2015 (изменено) · Жалоба Вопрос в дополнение к предыдущему. Стал тестировать запись - микроконтроллер перезагружается. с записью во флэш нужно быть осторожным. вот корректный способ. #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. Изменено 3 марта, 2015 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Ещё раз спасибо. Но пишу под Keil. Там, для размещения функции в RAM надо секцию организовывать через scstter файл. Поэтому фирменный код от EnergyMicro не работает, так как Keil не воспринимает атрибуты для Simplicity. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 марта, 2015 Опубликовано 3 марта, 2015 (изменено) · Жалоба Ещё раз спасибо. Но пишу под Keil. Там, для размещения функции в RAM надо секцию организовывать через scstter файл. Поэтому фирменный код от EnergyMicro не работает, так как Keil не воспринимает атрибуты для Simplicity. так может переопределить __attribute__ ((section(".ram"))). в смысле задать атрибут в коде что функцию надо поместить в рам. как то не вериться что каждый раз когда надо поместить функцию в рам надо лазить в scatter file. кстати я пишу не в Simplicity а в Attolic TrueStudio. Изменено 3 марта, 2015 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба в кейле вы можете функции что вам надо в раме запускать собрать в одном файле. Потом в прожект листе нажать на этот файл правой кнопкой и в свойствах поставить чтобы работало из RAM. Дальше среда все сама сделает... удобно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться