Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

STM8 использование EEPROM c компилятором COSMIC

Использование EEPROM в микроконтроллерах STM8 очень простое, однако есть ряд нюансов и тонкостей при использовании EEPROM совместно с компилятором COSMIC в среде STVD.

Чтобы ассоциировать переменную в области EEPROM необходимо объявить ее следующим образом например: 

EEPROM uint32_t EEPROM_data=0;

Однако при попытке в коде присвоить ей какое-либо новое значение, во время компиляции будет выдана ошибка:

#error symbol _FLASH_CR2 not defined 
#error symbol _FLASH_NCR2 not defined 
#error symbol _FLASH_IAPSR not defined 

Данные переменные используются во встроенной библиотеке для работы с модулем EEPROM. Причем компилятор подставляет код при присваивании нового значения в переменную находящуюся в области EEPROM из библиотеки libm0.sm8, где используются переменные _FLASH_CR2, _FLASH_NCR2, _FLASH_IAPSR.

Наша задача присвоить этим переменным адреса соответствующих регистров в модуле FLASH [3].

Для семейства STM8S необходимо в файл stm8s.h вставить следующий код:

#ifdef _COSMIC_
volatile char FLASH_IAPSR @0x505f; 
volatile char FLASH_CR2 @0x505b; 
volatile char FLASH_NCR2 @0x505c;	
#endif

 Для семейства STM8L необходимо в файл stm8l15x.h вставить следующий код:

#ifdef _COSMIC_	
volatile char FLASH_IAPSR @0x5054; 
volatile char FLASH_CR2 @0x5051; 
volatile char FLASH_NCR2 @0x505c;	
#endif

После этого ошибки при компиляции пропадут.

Перед записью EEPROM контроллер повышает напряжение [2], поэтому перед записью в целях безопасности необходимо разрешить запись данных в EEPROM и отключить все прерывания. Для работы функций необходимо подключить следующие файлы файлы stm8l15x_flash.h и stm8l15x_flash.c 

После записи EEPROM для безопасности необходимо запретить запись данных в EEPROM и разрешить глобальные прерывания.

disableInterrupts();
EEPROM_data=0x12345678;
enableInterrupts();
FLASH_Lock(FLASH_MemType_Data);

После записи в карте памяти видно, что по адресу 0x1000 были записаны данные

Источники:

  1. 1. Datasheet STM8l152 - стр.40
  2. 2. RM0031 - стр. 37
  3. 3. C Cross Compiler User’s Guide for ST Microelectronics STM8 - стр.52

Теги:

Опубликована: 0 1
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (4) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
AndrejChoo #
Возможно вопрос немного не по теме, но можете мне объяснить, почему с компилятором cosmic я не могу создать два массива по 256 байт на чипе с 1 Кб ОЗУ? Даже при изменении настроек компиляции на модель "Large" всё равно выскакивает ошибка о превышении объёма сегмента памяти. При компиляции на SDCC - всё ок. Проект работает. Камень stm8s102f
Ответить
0

[Автор]
Aleksey1408 #
Ошибка связана с такой штукой как stack roll-over limit почитать можно в RM0016 стр.31 Stack handling. Если нужно создать два массива, то это можно обойти через динамический массив - malloc в помощь. А вы компилируете на SDCC через командную строку или в IDE?
Ответить
0
AndrejChoo #
Я использую SDCC в среде CODE BLOCKS. Для неё есть набор макросов для STM8. Работает неплохо. Мне больше понравилось, чем COSMIC. Только там свои хидеры и синтаксис немного отличается. Есть адаптированная SPL, но я ей не пользовался за ненадобностью. Если интересно, есть пример проекта в моей статье
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
USB-реле (2 канала) Raspberry Pi 2
вверх