Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 09.03.2014, 18:52  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию 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
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
kvark85 (11.03.2014)
Непрочитано 11.03.2014, 22:19  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию 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.
kvark85 вне форума  
Непрочитано 11.03.2014, 23:01  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию 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
ut1wpr вне форума  
Непрочитано 12.03.2014, 00:18  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от ut1wpr Посмотреть сообщение
А в остальных ситуациях у вас претензий к отладчику IAR нет?
Бывает что при пошаговом прогоне отрабатывает не так как надо. Я это замечал. А вообще претензий нет. А Вы чем пользуетесь?

P.S. Кстати в K&R нет про использованиe "__far"
__________________
Kvsrk85(Андрей)

Последний раз редактировалось kvark85; 12.03.2014 в 00:26.
kvark85 вне форума  
Непрочитано 12.03.2014, 03:26  
Miic
Прохожий
 
Регистрация: 13.03.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Miic на пути к лучшему
По умолчанию 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
}
Miic вне форума  
Непрочитано 12.03.2014, 15:24  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию 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.
picavr вне форума  
Непрочитано 12.03.2014, 18:13  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от kvark85 Посмотреть сообщение
Бывает что при пошаговом прогоне отрабатывает не так как надо. Я это замечал. А вообще претензий нет. А Вы чем пользуетесь?
Чаще всего головой.
Цитата:
P.S. Кстати в K&R нет про использованиe "__far"
А почему там оно должно быть? K&R язык придумали, спасибо им и на этом...
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 13.03.2014, 03:30  
Miic
Прохожий
 
Регистрация: 13.03.2008
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Miic на пути к лучшему
По умолчанию 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  --
Miic вне форума  
Непрочитано 13.03.2014, 08:41  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от kvark85 Посмотреть сообщение
P.S. Кстати в K&R нет про использованиe "__far"
Это прикол недокомпиляторов.
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 13.03.2014, 09:37  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от eddy Посмотреть сообщение
Это прикол недокомпиляторов.
Вообще-то этот "прикол" называют "аттрибут памяти". К недокомпиляторам IAR отнести можно только воспаленным мозгом.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
KiCAD-объявления и впечатления al_dan KiCAD 32 03.10.2016 17:02
Народ, посмотрите quasm, Как ваши впечатления? suri Proteus, KiCAD и другие ECAD 5 14.10.2009 11:57


Часовой пояс GMT +4, время: 02:41.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot