реклама на сайте
подробности

 
 
> Чтение USer FLASH в EFM32, Чтение FLASH в микроконтроллерах EnergyMicro
JohnKorsh
сообщение Mar 3 2015, 06:52
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Добрый день!
Пишу для EFM32G880F128. Мне надо прочитать данные, записанные мной в область User FLASH. Не поделиться ли кто кусочком кода?
Пытался работать через указатели, присваивая указателю значение 0xFE0 0000 - начало User Flash - не прошло на этапе компиляции.
Пока ничего не придумал, а надо побыстрее.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
Jenya7
сообщение Mar 3 2015, 07:27
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(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));

в принципе чтение из флэша ничем не отличается между контроллерами.

Сообщение отредактировал Jenya7 - Mar 3 2015, 07:29
Go to the top of the page
 
+Quote Post
JohnKorsh
сообщение Mar 3 2015, 09:14
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Спасибо.
Go to the top of the page
 
+Quote Post
JohnKorsh
сообщение Mar 3 2015, 11:14
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



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

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?

Сообщение отредактировал IgorKossak - Mar 3 2015, 15:44
Причина редактирования: [codebox] для длинного кода, [code] - для короткого
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 3 2015, 11:51
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(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.

Сообщение отредактировал Jenya7 - Mar 3 2015, 12:01
Go to the top of the page
 
+Quote Post
JohnKorsh
сообщение Mar 3 2015, 14:36
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Ещё раз спасибо. Но пишу под Keil. Там, для размещения функции в RAM надо секцию организовывать через scstter файл.
Поэтому фирменный код от EnergyMicro не работает, так как Keil не воспринимает атрибуты для Simplicity.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 3 2015, 14:52
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

так может переопределить __attribute__ ((section(".ram"))).
в смысле задать атрибут в коде что функцию надо поместить в рам.
как то не вериться что каждый раз когда надо поместить функцию в рам надо лазить в scatter file.
кстати я пишу не в Simplicity а в Attolic TrueStudio.

Сообщение отредактировал Jenya7 - Mar 3 2015, 14:58
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 3 2015, 17:36
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



в кейле вы можете функции что вам надо в раме запускать собрать в одном файле. Потом в прожект листе нажать на этот файл правой кнопкой и в свойствах поставить чтобы работало из RAM. Дальше среда все сама сделает... удобно...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2025 - 22:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01416 секунд с 7
ELECTRONIX ©2004-2016