У всіх мікроконтролерах AVR є конфігураційні fuse біти. Це такі біти, які задають ряд загальних параметрів мікроконтролера, наприклад, джерело тактового сигналу, порогове напруга схеми скидання, розмір завантажувальної області, дозвіл сторожового таймера і т.д.
Fuse біти зберігаються у флеш пам'яті, тому зберігають своє значення при відсутності харчування. Зазвичай вони встановлюється одноразово на етапі первинного програмування прошивки.
Неправильно встановлені fuse біти можуть порушити роботу системи. У кращому випадку мікроконтролер буде працювати, наприклад, на неправильній частоті, а в гіршому ми втратимо можливість програмування мікроконтролера по SPI інтерфейсу. Це може статися або по не знанню, або в результаті випадкової помилки.
Існує спосіб, який може запобігти частина таких ситуацій. Він полягає в тому, щоб закласти в програму мікроконтролера порівняння fuse бітів з необхідними значеннями. Щось на зразок самоконтролю. Але для того щоб їх можна було перевіряти, їх потрібно спочатку прочитати. І зараз ми розберемося, як це зробити.
Відразу обмовлюся, приклад буде для IAR`a. Просто у мене зараз немає доступу до Atmel Studio, тому що я не вдома.
Fuse і lock біти розташовані в спеціальних регістрах в незалежній пам'яті. Для доступу до цих регістрів потрібно виконати ряд дій:
Оскільки ми програмуємо на Сі, в нашому випадку завдання буде вирішуватися більш простим способом, за допомогою вбудованої функції IAR`a. Вона виконає за нас практично всі ці дії. Прототип функції описаний у файлі intrinsics.h і виглядає наступним чином.
fuse low bits 0x0000
fuse high bits 0x0003
fuse extended bits 0x0002
lock bits 0x0001
Використовуючи ці дані, можна написати макроси для читання fuse бітів.
А для читання lock бітів в файлі intrinsic.h вже є макрос.
Ну і невеличкий приклад як могла б виглядати програма з початкової перевіркою fuse бітів.