09.03.2014, 18:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kvark85
|
Я считываю это значение - смотрю его, инкриментирую. И записываю обратно - 16 допустим.
после выключения и включения питания - там должно остаться 16 (я же эту область памяти ничем не перезаписывал). Но там не 16. Как то так.
|
Скорее всего там не будет 16. Там будет фиг знает сколько. Ваш инкремент стоит в теле бесконечного цикла, в который вы попадаете по включению питания. Сколько там в цикле наинкрементирует вам до останова дебаггером - ХЗ. Продумайте более правильный алгоритм отладки. Для начала упростите функции до байтной обработки. Уйдите из цикла. Пробуйте смотреть eeprom в STVP.
Цитата:
|
ut1wpr, я вам личное сообщение написал, посмотрите пожалуйста.
|
Затеивать переписку по пустяку не вижу необходимости. Парочка-другая личных проб и ошибок заменят в лучшем виде любую переписку.
Только что проверенные, полностью работающие функции:
Код:
|
#include "iostm8s003f3.h"
#include "intrinsics.h"
#include "inttypes.h"
#define Start_EEPROM_Address 0x4000
void EEPROM_Lock( void);
void EEPROM_Unlock( void );
void EEPROM_Program_Byte( uint32_t, uint8_t );
uint8_t EEPROM_Read_Byte( uint32_t );
volatile uint8_t test;
void main( void ){
CLK_CKDIVR = 0; // 16 MHz
test = EEPROM_Read_Byte(Start_EEPROM_Address);
test++;
EEPROM_Unlock();
EEPROM_Program_Byte(Start_EEPROM_Address,test);
EEPROM_Lock();
for(;;);
}
void EEPROM_Unlock( void ){
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
}
void EEPROM_Lock( void){
FLASH_IAPSR_bit.WR_PG_DIS = 0;
}
void EEPROM_Program_Byte(uint32_t Address, uint8_t Data){
*((__far uint8_t*)(uint16_t)Address) = *((uint8_t*)(&Data));
}
uint8_t EEPROM_Read_Byte( uint32_t Address ){
uint8_t retval;
retval = (*(__far uint8_t *) (uint16_t)Address);
return( retval );
} |
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
11.03.2014, 22:19
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
А обязательно закрывать доступ к EEPROM после записи, может это является правилом хорошего тона, или есть какие нибудь рекомендации?
Смущает то что в IAR, в окне register, не меняется бит FLASH_IAPSR_bit.DUL (бит блокировки EEPROM), это сбивало с толку. И при шагании по программе EEPROM как то некорректно работает. Просто когда запущенна программа - записывается все правильно.
Можете обьяснить конструкцию- строку: *((__far uint8_t*)(uint16_t)Address)
Добавил еще удобную функцию не перезаписывающую EEPROM при совпадении значений:
Цитата:
|
void EEPROM_Update_Byte(uint32_t Address, uint8_t Data){
if( Data != (*(__far uint8_t *) (uint16_t)Address) ) {
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
*((__far uint8_t*)(uint16_t)Address) = *((uint8_t*)(&Data));
FLASH_IAPSR_bit.WR_PG_DIS = 0;
};
}
|
__________________
Kvsrk85(Андрей)
Последний раз редактировалось kvark85; 11.03.2014 в 22:55.
|
|
|
|
11.03.2014, 23:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kvark85
|
А обязательно закрывать доступ к EEPROM после записи, может это является правилом хорошего тона, или есть какие нибудь рекомендации?
|
Можете не закрывать. Ваше дело. Я же не могу знать, как долго ваша программа собирается не модифицировать EEPROM...
Цитата:
|
Смущает то что в IAR, в окне register, не меняется бит FLASH_IAPSR_bit.DUL (бит блокировки EEPROM), это сбивало с толку. И при шагании по программе EEPROM как то некорректно работает. Просто когда запущенна программа - записывается все правильно.
|
А в остальных ситуациях у вас претензий к отладчику IAR нет?
Цитата:
|
Можете обьяснить конструкцию- строку: *((__far uint8_t*)(uint16_t)Address)
|
Не смогу. Проще, чем написано, не объяснить. Классика работы с указателями. K&R рулит.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
12.03.2014, 00:18
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от ut1wpr
|
А в остальных ситуациях у вас претензий к отладчику IAR нет?
|
Бывает что при пошаговом прогоне отрабатывает не так как надо. Я это замечал. А вообще претензий нет. А Вы чем пользуетесь?
P.S. Кстати в K&R нет про использованиe "__far"
__________________
Kvsrk85(Андрей)
Последний раз редактировалось kvark85; 12.03.2014 в 00:26.
|
|
|
|
12.03.2014, 03:26
|
|
Прохожий
Регистрация: 13.03.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kvark85
|
уже и STD_Periph_lib подключил, все равно EEPROM не работает.
|
Для доступа к EEPROM (процессоры STM8S105K4 и STM8S003K3) использую две самописные функции. Пока не вставил строку
while( !FLASH_IAPSR_DUL );
запись работала иногда не стабильно.
Писал давно, но тщательно разбирался по даташиту.
Внутри функций жду окончания записи.
Код красотой не отличается, но работает надёжно.
Код:
|
// Записать байт в EEPROM
// - Addr - адрес в памяти EEPROM
// - Data - байт для записи
void WR_EEPROM_u8(u16 Addr, u8 Data)
{
// Начальное запрещение записи во FLASH и EEPROM
FLASH_CR1 = 0x00; // Нет прерывания и стандартное время программирования
FLASH_CR2 = 0x00; // Сбросить все режимы доступа к FLASH и EEPROM
FLASH_NCR2 = 0xFF;
FLASH_IAPSR_PUL = 0; // Запретить запись во FLASH
FLASH_IAPSR_DUL = 0; // Запретить запись в EEPROM
// u8 tmp = FLASH_IAPSR; // Сбросить чтением биты: EOP и WR_PG_DIS
// Разблокировка записи в EEPROM
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
while( !FLASH_IAPSR_DUL ); // Ждать установки бита DUL и сбросить чтением биты: EOP и WR_PG_DIS
// Записать 1 байт
*((__near u8*)Addr) = Data;
while( !FLASH_IAPSR_EOP ); // Ожидание окончания записи
FLASH_IAPSR_DUL = 0; // Запретить запись в EEPROM
}
// Записать 16-битное число в EEPROM
// - Addr - адрес в памяти EEPROM (должен быть выровнен по 2 байта)
// - Data - данные для записи
void WR_EEPROM_u16(u16 Addr, u16 Data)
{
// Начальное запрещение записи во FLASH и EEPROM
FLASH_CR1 = 0x00; // Нет прерывания и стандартное время программирования
FLASH_CR2 = 0x00; // Сбросить все режимы доступа к FLASH и EEPROM
FLASH_NCR2 = 0xFF;
FLASH_IAPSR_PUL = 0; // Запретить запись во FLASH
FLASH_IAPSR_DUL = 0; // Запретить запись в EEPROM
// u8 tmp = FLASH_IAPSR; // Сбросить чтением биты: EOP и WR_PG_DIS
// Предварительное считывание данных для записи в режиме Word
u8 tmp_b0, tmp_b1, tmp_b2, tmp_b3;
if( Addr & 0x02 ) {
// Адрес не на границе 32-х битного слова
Addr &= 0xFFFC; // Выравнить адрес по границе слова
tmp_b0 = *((__near u8*) Addr );
tmp_b1 = *((__near u8*)(Addr + 1));
tmp_b2 = *((u8*)(&Data) );
tmp_b3 = *((u8*)(&Data)+1);
}
else {
// Адрес на границе 32-х битного слова
Addr &= 0xFFFC; // Выравнить адрес по границе слова
tmp_b0 = *((u8*)(&Data) );
tmp_b1 = *((u8*)(&Data)+1);
tmp_b2 = *((__near u8*)(Addr + 2));
tmp_b3 = *((__near u8*)(Addr + 3));
}
// Разблокировка записи в EEPROM
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
while( !FLASH_IAPSR_DUL ); // Ждать установки бита DUL и сбросить чтением биты: EOP и WR_PG_DIS
// Задать режим записи Word
FLASH_CR2_WPRG = 1;
FLASH_NCR2_NWPRG = 0;
// Записать 4 байта
*((__near u8*)Addr++) = tmp_b0;
*((__near u8*)Addr++) = tmp_b1;
*((__near u8*)Addr++) = tmp_b2;
*((__near u8*)Addr ) = tmp_b3;
while( !FLASH_IAPSR_EOP ); // Ожидание окончания записи
FLASH_IAPSR_DUL = 0; // Запретить запись в EEPROM
} |
|
|
|
|
12.03.2014, 15:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от ut1wpr
|
[CODE]
void EEPROM_Program_Int(uint32_t Address, uint16_t Data)
{
*((__far uint8_t*)(uint16_t)Address) = *((uint8_t*)(&Data));
*(((__far uint8_t*)(uint16_t)Address) + 1) = *((uint8_t*)(&Data)+1);
}
|
Таким макаром пишется 2 байта в буфер а потом в ЕЕПРОМ или сразу побайтно в EEPROM?
Работает, но как именно происходит запись...)))
Код:
|
void EEPROM_Write_Long(void){
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
*((__far uint8_t*)set_adres_eprom++) = (eeprom_data››24 & 0x000000ff);
*((__far uint8_t*)set_adres_eprom++) = (eeprom_data››16 & 0x000000ff);
*((__far uint8_t*)set_adres_eprom++) = (eeprom_data››8 & 0x000000ff);
*((__far uint8_t*)set_adres_eprom++) = (eeprom_data & 0x000000ff);
FLASH_IAPSR_bit.WR_PG_DIS = 0;
} |
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 12.03.2014 в 15:26.
|
|
|
|
12.03.2014, 18:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kvark85
|
Бывает что при пошаговом прогоне отрабатывает не так как надо. Я это замечал. А вообще претензий нет. А Вы чем пользуетесь?
|
Чаще всего головой.
Цитата:
|
P.S. Кстати в K&R нет про использованиe "__far"
|
А почему там оно должно быть? K&R язык придумали, спасибо им и на этом...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
13.03.2014, 03:30
|
|
Прохожий
Регистрация: 13.03.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kvark85
|
P.S. Кстати в K&R нет про использованиe "__far"
|
Table 4: Memory types and their corresponding memory attributes
из документа: "...\IAR Systems\...\stm8\doc\EWstm8_DevelopmentGuide.pdf"
Код:
|
Memory Keyword Address Pointer Default in
type range size data model
-------------------------------------------------
Tiny __tiny 0–255 bytes 8 bits Small
Near __near 0–64 Kbytes 16 bits Medium
Far __far 0–16 Mbytes 24 bits Large
Huge __huge 0–16 Mbytes 24 bits -- |
|
|
|
|
13.03.2014, 08:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kvark85
|
P.S. Кстати в K&R нет про использованиe "__far"
|
Это прикол недокомпиляторов.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
13.03.2014, 09:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от eddy
|
Это прикол недокомпиляторов.
|
Вообще-то этот "прикол" называют "аттрибут памяти". К недокомпиляторам IAR отнести можно только воспаленным мозгом.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:41.
|
|