Функции записи и чтения eeprom работают, переназвал файл eeprom.h во исбежание конфликто, теперь это eeprom_def.h
This commit is contained in:
1 parent
4710f730b3
commit
f3b0e0bd88
6 files changed
+86
-386
No files matched your search
@@ -1,19 +1,20 @@
|
||||
#include "EEPROM.h"
|
||||
#include "mik32_hal_eeprom.h"
|
||||
#include "mik32_hal.h"
|
||||
|
||||
#define EEPROM_OP_TIMEOUT 100000
|
||||
#define EEPROM_PAGE_WORDS 32
|
||||
#define EEPROM_PAGE_WORDS 32 // Количество слов на странице
|
||||
#define EEPROM_PAGE_COUNT 8 // КОличество страниц пользовательской EEPROM
|
||||
#define EEPROM_START_ADDR 0x1C00 // Адрес начала пользовательской EEPROM
|
||||
#define EEPROM_WORD_SIZE 4 // Слово занимает 4 байта
|
||||
#define EEPROM_PAGE_SIZE ( EEPROM_PAGE_WORDS * EEPROM_PAGE_WORDS ) // Страница занимает 32*4 = 128 байт
|
||||
#define EEPROM_PAGE_SIZE ( EEPROM_PAGE_WORDS * EEPROM_WORD_SIZE ) // Страница занимает 32*4 = 128 байт
|
||||
#define EEPROM_END 0x1FFF
|
||||
#define EEPROM_LENGHT (EEPROM_PAGE_SIZE * EEPROM_PAGE_COUNT)
|
||||
|
||||
HAL_EEPROM_HandleTypeDef heeprom;
|
||||
|
||||
|
||||
EEPtr EEPROMClass:: begin()
|
||||
void EEPROMClass:: begin()
|
||||
{
|
||||
heeprom.Instance = EEPROM_REGS;
|
||||
heeprom.Mode = HAL_EEPROM_MODE_TWO_STAGE;
|
||||
@@ -22,20 +23,19 @@ EEPtr EEPROMClass:: begin()
|
||||
|
||||
HAL_EEPROM_Init(&heeprom);
|
||||
HAL_EEPROM_CalculateTimings(&heeprom, OSC_SYSTEM_VALUE);
|
||||
return 0x00;
|
||||
}
|
||||
|
||||
uint8_t EEPROMClass:: read( int idx )
|
||||
{
|
||||
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGHT)
|
||||
return 0x00;
|
||||
if (((uint32_t)idx >= (uint32_t)EEPROM_LENGHT) || (idx < 0))
|
||||
return 0x0;
|
||||
|
||||
uint32_t read_data_buf[EEPROM_PAGE_WORDS] = {};
|
||||
|
||||
// Вычисление адресы начала нужной страницы
|
||||
uint32_t addr = EEPROM_START_ADDR + (((uint32_t)idx) / EEPROM_PAGE_SIZE) * EEPROM_PAGE_SIZE;
|
||||
// Чтение нужной страницы
|
||||
HAL_EEPROM_Read(&heeprom, addr, read_data_buf, EEPROM_PAGE_WORDS, EEPROM_OP_TIMEOUT);
|
||||
HAL_EEPROM_Read(&heeprom, (uint16_t)addr, read_data_buf, EEPROM_PAGE_WORDS, EEPROM_OP_TIMEOUT);
|
||||
// Адрес искомого слова в eeprom: EEPROM_START_ADDR + (uint32_t)idx
|
||||
uint32_t word_addr = EEPROM_START_ADDR + (((uint32_t)idx) / EEPROM_WORD_SIZE) * EEPROM_WORD_SIZE;
|
||||
// Индекс искомого слова в массиве read_data_buf: адрес слова в eeprom за вычетом адреса начала страницы
|
||||
@@ -43,12 +43,12 @@ uint8_t EEPROMClass:: read( int idx )
|
||||
// Номер байта в составе слова
|
||||
uint32_t byte_idx = ((uint32_t)idx) % EEPROM_WORD_SIZE;
|
||||
// Вычленение нужного байта из страницы
|
||||
return (uint8_t)(( read_data_buf[word_idx] & ((uint32_t)(0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1)) * 8) ) >> ((EEPROM_WORD_SIZE - byte_idx - 1) * 8));
|
||||
return (uint8_t)(( read_data_buf[word_idx] & (((uint32_t)0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8)) ) >> ((EEPROM_WORD_SIZE - byte_idx - 1) * 8));
|
||||
}
|
||||
|
||||
void EEPROMClass:: write( int idx, uint8_t val )
|
||||
{
|
||||
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGHT)
|
||||
if (((uint32_t)idx >= (uint32_t)EEPROM_LENGHT) || (idx < 0))
|
||||
return;
|
||||
|
||||
uint32_t write_data_buf[EEPROM_PAGE_WORDS] = {};
|
||||
@@ -56,7 +56,7 @@ void EEPROMClass:: write( int idx, uint8_t val )
|
||||
// Вычисление адресы начала нужной страницы
|
||||
uint32_t addr = EEPROM_START_ADDR + (((uint32_t)idx) / EEPROM_PAGE_SIZE) * EEPROM_PAGE_SIZE;
|
||||
// Читаем нужную страницу
|
||||
HAL_EEPROM_Read(&heeprom, addr, write_data_buf, EEPROM_PAGE_WORDS, EEPROM_OP_TIMEOUT);
|
||||
HAL_EEPROM_Read(&heeprom, (uint16_t)addr, write_data_buf, EEPROM_PAGE_WORDS, EEPROM_OP_TIMEOUT);
|
||||
// Адрес искомого слова в eeprom: EEPROM_START_ADDR + (uint32_t)idx
|
||||
uint32_t word_addr = EEPROM_START_ADDR + (((uint32_t)idx) / EEPROM_WORD_SIZE) * EEPROM_WORD_SIZE;
|
||||
// Индекс искомого слова в массиве write_data_buf: адрес слова в eeprom за вычетом адреса начала страницы
|
||||
@@ -64,17 +64,20 @@ void EEPROMClass:: write( int idx, uint8_t val )
|
||||
// Номер байта в составе слова
|
||||
uint32_t byte_idx = ((uint32_t)idx) % EEPROM_WORD_SIZE;
|
||||
// Извлечение нужного байта
|
||||
uint32_t byte = ((uint32_t)val) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8);
|
||||
uint32_t byte = (((uint32_t)val) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8));
|
||||
// Вычленение и замена нужного байта из страницы
|
||||
write_data_buf[word_idx] = (write_data_buf[word_idx] & (~((uint32_t)(0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1)) * 8))) | byte;
|
||||
write_data_buf[word_idx] = (write_data_buf[word_idx] & (~(((uint32_t)0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8)))) | byte;
|
||||
|
||||
// Очистка нужной страницы
|
||||
HAL_EEPROM_Erase(&heeprom, (uint16_t)addr, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_SINGLE, EEPROM_OP_TIMEOUT);
|
||||
|
||||
HAL_EEPROM_Write(&heeprom, EEPROM_START_ADDR, write_data_buf, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_SINGLE, EEPROM_OP_TIMEOUT);
|
||||
HAL_EEPROM_Write(&heeprom, (uint16_t)addr, write_data_buf, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_SINGLE, EEPROM_OP_TIMEOUT);
|
||||
}
|
||||
|
||||
// Делает то же, что и write, но записывает только если новый байт отличается от уже записанного
|
||||
void EEPROMClass:: update( int idx, uint8_t val )
|
||||
{
|
||||
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGHT)
|
||||
if (((uint32_t)idx >= (uint32_t)EEPROM_LENGHT) || (idx < 0))
|
||||
return;
|
||||
|
||||
uint32_t write_data_buf[EEPROM_PAGE_WORDS] = {};
|
||||
@@ -92,23 +95,24 @@ void EEPROMClass:: update( int idx, uint8_t val )
|
||||
// Извлечение нужного байта
|
||||
uint32_t byte = ((uint32_t)val) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8);
|
||||
// Проверка того, что записанный байт отличается от нового
|
||||
if((write_data_buf[word_idx] & ((uint32_t)(0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1)) * 8)) != byte)
|
||||
if((uint8_t)(( write_data_buf[word_idx] & (((uint32_t)0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8)) ) >> ((EEPROM_WORD_SIZE - byte_idx - 1) * 8)) != val)
|
||||
{
|
||||
// Очистка нужной страницы
|
||||
HAL_EEPROM_Erase(&heeprom, (uint16_t)addr, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_SINGLE, EEPROM_OP_TIMEOUT);
|
||||
// Вычленение и замена нужного байта из страницы
|
||||
write_data_buf[word_idx] = (write_data_buf[word_idx] & (~((uint32_t)(0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1)) * 8))) | byte;
|
||||
HAL_EEPROM_Write(&heeprom, EEPROM_START_ADDR, write_data_buf, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_SINGLE, EEPROM_OP_TIMEOUT);
|
||||
write_data_buf[word_idx] = (write_data_buf[word_idx] & (~((uint32_t)(0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8)))) | byte;
|
||||
HAL_EEPROM_Write(&heeprom, (uint16_t)addr, write_data_buf, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_SINGLE, EEPROM_OP_TIMEOUT);
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t EEPROMClass:: length( void )
|
||||
{
|
||||
return EEPROM_LENGHT;
|
||||
return (uint16_t)EEPROM_LENGHT;
|
||||
}
|
||||
|
||||
template< typename T >
|
||||
const T& EEPROMClass:: put(int idx, const T &t) {
|
||||
// Создание объекта EEPtr, который указывает на начальный адрес в EEPROM.
|
||||
EEPtr e = idx;
|
||||
uint16_t ee_idx = (uint16_t)idx;
|
||||
|
||||
// Указатель на данные, которые нужно записать в EEPROM.
|
||||
const uint8_t *ptr = (const uint8_t*) &t;
|
||||
@@ -117,29 +121,20 @@ const T& EEPROMClass:: put(int idx, const T &t) {
|
||||
int count = sizeof(T);
|
||||
|
||||
// Цикл для записи данных побайтно в EEPROM.
|
||||
for(; count ; --count, ++e) {
|
||||
for(uint16_t i = 0; i < sizeof(T); i++) {
|
||||
// Запись текущего байта данных в EEPROM.
|
||||
(*e).update( *ptr++ );
|
||||
EEPROM.update(ee_idx + i, *ptr++ );
|
||||
}
|
||||
|
||||
// Возврат ссылки на записанный объект.
|
||||
return t;
|
||||
}
|
||||
|
||||
template< typename T >
|
||||
T& EEPROMClass:: get(int idx, T &t) {
|
||||
EEPtr e = idx; // Указатель на адрес в EEPROM
|
||||
uint8_t *ptr = (uint8_t*) &t; // Преобразуем ссылку на объект данных в указатель на байт
|
||||
for (int count = sizeof(T); count; --count, ++e) {
|
||||
*ptr++ = *e; // Читаем данные из EEPROM и записываем в объект
|
||||
}
|
||||
// EEPtr e = idx; // Указатель на адрес в EEPROM
|
||||
// uint8_t *ptr = (uint8_t*) &t; // Преобразуем ссылку на объект данных в указатель на байт
|
||||
// for (int count = sizeof(T); count; --count, ++e) {
|
||||
// *ptr++ = *e; // Читаем данные из EEPROM и записываем в объект
|
||||
// }
|
||||
return t; // Возвращаем ссылку на переданный объект с прочитанными данными
|
||||
}
|
||||
|
||||
|
||||
|
||||
// uint32_t* EEPROM_Read(uint16_t index)
|
||||
// {
|
||||
// uint32_t read_data_buf[];
|
||||
// HAL_EEPROM_Read(&heeprom, 0x1C00 + index, read_data_buf, EEPROM_PAGE_WORDS, EEPROM_OP_TIMEOUT);
|
||||
// return read_data_buf;
|
||||
// }
|
||||
}
|
||||
Reference in new issue
Block a user