Функции записи и чтения eeprom работают, переназвал файл eeprom.h во исбежание конфликто, теперь это eeprom_def.h

This commit is contained in:
EgorShin committed 2024-09-25 17:31:36 +07:00
1 parent 4710f730b3
commit f3b0e0bd88
6 files changed
+86 -386

No files matched your search

+33 -38
View File
@@ -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;
// }
}