Возникла проблема при работе с 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"
Сообщение отредактировал paravozru - Jul 29 2013, 06:46
|