Сообщение от miwutka
|
EEPROM на стм32 ктонибудь использовал??
|
Я постоянно использую.
Ищи stm32f10x_flash.h и соответствующий ему C.
Не совсем удобно там.
Стирать можно только страницами, поэтому если менять одно значение - сначала в таблицу сохранить всё, а потом обратно записать.
Побайтно не пишет, только словами (32) и полу-словами (16).
Ну и... ограничение на количество циклов записал-стёр...
Я его обхожу используя к примеру 256 значений. При записи нового ищу где у меня 0xFFFF, значит в него пишем, если при поиске дошли до края (256) - стираем кусок и пишем с начала.
Не забывай Flash_Unlock для записи и стирания страницы.
пример кода:
чтение одного:
[HTML]
Cifra_Temp_Set = *(__IO uint16_t*) (Flash_addr_Temp);
[/HTML]
запись одного:
[HTML]
FLASH_Unlock();
FLASH_ProgramHalfWord(Address,Tek_Setting);
FLASH_Lock();
[/HTML]
чтение с поиском последнего:
[HTML]
//читает из флэш прошлое состояние (работаем по 16 бит)
void Flash_Read_State(void)
{
__IO u16 count;
__IO u16 tmp;
Address = Flash_addr;
//ищем пустой байт
for(count=0;count‹250;count++)
{
Address+=2;
tmp = *(__IO u16*)Address;
if (tmp == 0xFFFF)
{
Address-=2;
tmp = *(__IO u16*)Address;
Tek_Setting = (u
![Горд собой](images/smilies/icon_dovl.gif)
tmp;
break;
}
}
if(Tek_Setting == 0xFF) { Tek_Setting = 0;}
}
//
[/HTML]
запись:
[HTML]
//пишет во флэш состояние со сдвигом вниз (работаем по 16 бит)
void Flash_Write_State(void)
{
__IO u16 count;
__IO u16 tmp;
Address = Flash_addr;
//ищем пустой байт
for(count=0;count‹250;count++)
{
tmp = *(__IO u16*)Address;
if (tmp == 0xFFFF)
{
break;
}
Address+=2;
}
FLASH_Unlock();
if (count==250) //все занято, сотрем сектор с перезаписью таблиц
{
FLASH_ErasePage(Flash_addr);
Address = Flash_addr;
}
FLASH_ProgramHalfWord(Address,Tek_Setting);
FLASH_Lock();
}
//
[/HTML]