|
@@ -0,0 +1,49 @@
|
|
|
+/*
|
|
|
+ * By oleg110592
|
|
|
+ * https://radiokot.ru/forum/viewtopic.php?p=2691126&sid=342073b18646c21ba245ff0ada5111b3#p2691126
|
|
|
+ */
|
|
|
+
|
|
|
+/* eeprom в stm8 можно организовать просто */
|
|
|
+
|
|
|
+typedef struct Par_t {
|
|
|
+ uint16_t temperature;
|
|
|
+ uint16_t time;
|
|
|
+ uint8_t gain;
|
|
|
+} Par_t;
|
|
|
+
|
|
|
+#pragma location=0x4000
|
|
|
+__no_init Par_t Par;
|
|
|
+#pragma required=Par
|
|
|
+
|
|
|
+ /* чтение очень просто, занимает намного меньше чем в АВР
|
|
|
+ - просто пересылка из области eeprom в память,
|
|
|
+ все находится в едином адресном пространстве: */
|
|
|
+
|
|
|
+uint16_t temperature, time;
|
|
|
+
|
|
|
+temperature = Par.temperature;
|
|
|
+time = Par.time;
|
|
|
+
|
|
|
+/*
|
|
|
+в листинге всего то две команды:
|
|
|
+Код:
|
|
|
+LDW X, L:0x4000
|
|
|
+LDW L:temperature, X
|
|
|
+...
|
|
|
+LDW X, L:0x4002
|
|
|
+LDW L:time, X
|
|
|
+*/
|
|
|
+
|
|
|
+/* запись тоже несложно: */
|
|
|
+
|
|
|
+mcu_eeprom_unlock();
|
|
|
+Par.temperature = 560;
|
|
|
+Par.time = time;
|
|
|
+FLASH->IAPSR &= ~FLASH_IAPSR_DUL; //EEPROM lock
|
|
|
+
|
|
|
+void mcu_eeprom_unlock(void) //Разблокировать EEPROM
|
|
|
+{
|
|
|
+ FLASH->DUKR = ((unsigned char)0xAE);
|
|
|
+ FLASH->DUKR = ((unsigned char)0x56);
|
|
|
+ while (!(FLASH->IAPSR & FLASH_IAPSR_DUL));
|
|
|
+}
|