Возникла проблема при работе с EEPROM на STM32L-Discovery
Как можно создать адресацию EEPROM в заголовочном файле. Вот грабли на которые я наткнулся: в заголовочном файле .h сначала объявил указатели и им присвоил адреса вот примерно так
1.Мысля:
uint16_t *ModBusAddr = (uint16_t *)0x08080000;
в каком то .с файле вызов функции чтения EEPROM
uint16_t ReadEEPROM(uint16_t *addr) { // функция чтения EEPROM принимающая адрес указателя, и возвращающая uint16_t
uint16_t *ptr;
uint16_t result;
ptr = (uint16_t *)(addr);
result = *ptr;
return result;
}
Вот грабли №1: Keil выдал ошибку что множественное объявление «ModBusAddr » , оказывается можно только объявить переменные в .h но присвоить значения можно только в .с файлах.
2. Мысля
Решил адресацию EEPROM через #define
#define ModBusAddr 0
в таком случае функция чтения EEPROM приняла вид
uint16_t ReadEEPROM(uint16_t addr) { // функция чтения EEPROM принимающая позицию в памяти , и возвращающая uint16_t
uint16_t *ptr;
uint16_t result;
ptr = (uint16_t *)(eepromADR + addr ); // где #define eepromADDR 0x08080000 - начало EEPROM в STM32L-discovery
result = *ptr;
return result;
}
вот грабли №2: Да все работает, но во первых придется рассчитать каждый short, int, переменную в адресном пространстве EEPROM и задавать последовательность 0,1,2,3,4 и т п
Например для
#define ModBusAddr 0 //так в голове держу 0x08080000 , выделю два байта для этой переменной
#define ModBusFunc 2 // так в голове держу 0x08080002 выделю два байта для этой переменной
и т д.
Вот еще проблема функция uint16_t ReadEEPROM(uint16_t addr) имеет тип uint16 что принимаемый что возвращаемый, как быть если я хочу выделить для одной переменной например только байт, для другой два байта, а с float что делать ?
Тоже подумал и решил так создам Шаблон функции которая будет принимать различные типы данных и в зависимости от этого читать определенное количество байт с EEPROM/
template<typemane eeType>
eeType ReadEEPROM(eeType addr) {
eeType *ptr;
eeType result;
ptr = (eeType *)(addrEEPROM + adrr);
result = *ptr;
return result;
}
Проошу помощи, каким образом Вы распределяете память и как описаны функции чтения и записи c различными типами данных с EEPROM.
Забыл указать, при создании шаблона Keil выдал ошибку "this declaration has no storage class or type specifier"