Як прочитати fuse біти avr з програми

У всіх мікроконтролерах 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 бітів.