Перейти к содержанию
    

Чтение USer FLASH в EFM32

Добрый день!

Пишу для EFM32G880F128. Мне надо прочитать данные, записанные мной в область User FLASH. Не поделиться ли кто кусочком кода?

Пытался работать через указатели, присваивая указателю значение 0xFE0 0000 - начало User Flash - не прошло на этапе компиляции.

Пока ничего не придумал, а надо побыстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

Пишу для 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос в дополнение к предыдущему.

Стал тестировать запись - микроконтроллер перезагружается.

Вот мой код:

 

 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
[codebox] для длинного кода, [code] - для короткого

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос в дополнение к предыдущему.

Стал тестировать запись - микроконтроллер перезагружается.

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

 

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё раз спасибо. Но пишу под Keil. Там, для размещения функции в RAM надо секцию организовывать через scstter файл.

Поэтому фирменный код от EnergyMicro не работает, так как Keil не воспринимает атрибуты для Simplicity.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё раз спасибо. Но пишу под Keil. Там, для размещения функции в RAM надо секцию организовывать через scstter файл.

Поэтому фирменный код от EnergyMicro не работает, так как Keil не воспринимает атрибуты для Simplicity.

так может переопределить __attribute__ ((section(".ram"))).

в смысле задать атрибут в коде что функцию надо поместить в рам.

как то не вериться что каждый раз когда надо поместить функцию в рам надо лазить в scatter file.

кстати я пишу не в Simplicity а в Attolic TrueStudio.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в кейле вы можете функции что вам надо в раме запускать собрать в одном файле. Потом в прожект листе нажать на этот файл правой кнопкой и в свойствах поставить чтобы работало из RAM. Дальше среда все сама сделает... удобно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...