eeprom.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /*
  2. * By oleg110592
  3. * https://radiokot.ru/forum/viewtopic.php?p=2691126&sid=342073b18646c21ba245ff0ada5111b3#p2691126
  4. */
  5. /* eeprom в stm8 можно организовать просто */
  6. typedef struct Par_t {
  7. uint16_t temperature;
  8. uint16_t time;
  9. uint8_t gain;
  10. } Par_t;
  11. #pragma location=0x4000
  12. __no_init Par_t Par;
  13. #pragma required=Par
  14. /* чтение очень просто, занимает намного меньше чем в АВР
  15. - просто пересылка из области eeprom в память,
  16. все находится в едином адресном пространстве: */
  17. uint16_t temperature, time;
  18. temperature = Par.temperature;
  19. time = Par.time;
  20. /*
  21. в листинге всего то две команды:
  22. Код:
  23. LDW X, L:0x4000
  24. LDW L:temperature, X
  25. ...
  26. LDW X, L:0x4002
  27. LDW L:time, X
  28. */
  29. /* запись тоже несложно: */
  30. mcu_eeprom_unlock();
  31. Par.temperature = 560;
  32. Par.time = time;
  33. FLASH->IAPSR &= ~FLASH_IAPSR_DUL; //EEPROM lock
  34. void mcu_eeprom_unlock(void) //Разблокировать EEPROM
  35. {
  36. FLASH->DUKR = ((unsigned char)0xAE);
  37. FLASH->DUKR = ((unsigned char)0x56);
  38. while (!(FLASH->IAPSR & FLASH_IAPSR_DUL));
  39. }