AVR106 C функции за четене и запис на FLASH, avr, програмиране
Ето превода на бележката за приложениетоAVR106 : C функции за четене и запис във флаш памет [1], посветена на рутинни процедури за четене и запис на паметFLASH на език C за микроконтролериAVR. Разглеждат се функциите за четене и запис на един FLASH байт, четене и запис на една FLASH страница, опционално възстановяване след неочаквано прекъсване на захранването. Разглежданите функции могат да се използват с всяко устройство (микроконтролер AVR), което има способността да записва програмна памет от кода на приложението [2] (това е почти цялата линия микроконтролери Atmel AVR). Също така към бележката за приложението на AVR106 е включена чернова на примерна програма [3], която използва секцията с програмна памет за съхраняване на параметри.
Почти всички микроконтролери Atmel AVR® имат това, което е известно като самопрограмираща се програмна памет. Самопрограмирането е една от характеристиките на AVR технологията. За по-добро разбиране на това, моля, вижте бележката за приложението AVR109 [2]. Самопрограмирането позволява на AVR да препрограмира собствената си FLASH памет, докато програмата работи. Това е подходящо за приложения, които трябва сами да актуализират кода на фърмуера (бутлоудър, буутлоудъри, буутлоудъри) или да запазят някаква информация в областта на FLASH паметта. Тази бележка за приложението предоставя C функции, които ви позволяват достъп до областта на FLASH паметта.
[Asm инструкция SPM ]
На устройства, които имат блок за зареждане, SPM инструкцията може да бъде записана в цялата област на FLASH паметта, но само ако се изпълнява от областта на паметта за зареждане. Пускането на SPM от раздела за приложения няма ефект. На по-малки AVR устройства, които нямат блок за зареждане, SPM инструкцията можеработа от всяко място във FLASH паметта.
Размерът и местоположението на тези две области на FLASH памет зависи от типа на устройството и инсталирането на неговите предпазители. Някои устройства имат способността да изпълняват SPM инструкция от всяко място в областта на FLASH паметта.
[FLASH Процедура за запис]
Технологията FLASH памет е проектирана по такъв начин, че тази памет да се записва страница по страница. Записването се извършва чрез съхраняване на цялата страница във временен буфер за страница, преди страницата да бъде записана във FLASH. Адресът, на който ще бъдат записани данните за страницата, се определя от съдържанието на Z-регистъра и RAMPZ-регистъра. Страницата трябва да бъде изчистена (изтрита), преди данните от временния буфер да могат да бъдат записани на страницата. Функциите, които тази бележка за приложението съдържа, използват следната процедура за писане на FLASH страница:
• Попълване на буфера на страницата • Изчистване на страницата • Писане на страницата
Както можете да видите, загуба на данни е възможна, ако по време на тази процедура възникне неочаквано нулиране или прекъсване на захранването веднага след изчистването на страницата. Загубата на данни може да се избегне, като първо се буферират записаните данни в енергонезависима памет (обикновено EEPROM). Функциите за запис, съдържащи се в тази бележка за приложението, предоставят незадължително буфериране за запис. Тези функции се обсъждат допълнително в раздела Описание на фърмуера. За устройства, които имат функцията за четене по време на запис (четене по време на запис), буутлоудърът може да се изпълни по време на запис и функциите няма да се върнат, докато записът не приключи.
[FLASH адрес ]
• FLASH байт 0x200 (512), който съответства на байт 0 на страница 2 • Страница 2 FLASH
[Внедряване на примерния проект, работещ с FLASH ]
проект за фърмуернаправен заIAR компилатор. Функциите могат да бъдат пренесени към други компилатори, но може да са необходими известни усилия, тъй като се използва специфична мнемоника на IAR компилатора (вътрешни функции). Функциите са достъпни чрез включване на файла Self_programming.h в основния C модул и добавяне на модула Self_programming.c към проекта. Когато се използва самопрограмиране, важно е функциите, които трябва да бъдат записани, да се намират в секцията Boot на FLASH паметта. Поставянето на функциите се контролира чрез използване на дефинициите на сегменти на паметта в конфигурационния файл на линкера (*.xcl). Всички други необходими конфигурации на фърмуера се извършват във файла Self_programming.h.
РАЗМЕР НА СТРАНИЦА. Константата PAGESIZE трябва да бъде дефинирана равна на размера на FLASH страницата (в байтове) на използваното устройство.
[Поставяне на целия код в секцията за изтегляне ]
Необходимо е да се замени диапазонът от сегменти, дефинирани в конфигурационния файл на свързващия файл по подразбиране (*.xcl файл), за да се постави целият код на приложението в раздела за зареждане на FLASH. Разположението и размерът на секцията Boot зависи от устройството и неговите настройки на предпазителя. Програмирането на предпазителя BOOTRST ще премести вектора за нулиране в началото на секцията за зареждане. Също така е възможно да се преместят всички прекъсващи вектори в товарната секция. Обърнете се към раздела за прекъсване на листа с данни на устройството за инструкции как да направите това. Дефиниции на сегменти, които трябва да бъдат променени, за да поемат целия програмен код в секцията за изтегляне:
TINY_F, NEAR_F, SWITCH, DIFUNCT, CODE, FAR_F, HUGE_F, INITTAB, TINY_ID, NEAR_ID и CHECKSUM.
Тази бележка за приложението предоставя файла lnkm128s.xcl като пример, уточнявайки, че целият програмен код е поставен в 8 килобайтова секция за зареждане.Atmega128. Този файл може просто да бъде модифициран за използване с други устройства и съдържа инструкции как да го направите.
[Поставяне само на някои функции в секцията за изтегляне ]
Като алтернатива можете да поставите само някои от функциите в даден сегмент на FLASH памет. В нашия случай в секцията за зареждане трябва да се поставят само функции за запис. Това може да се направи чрез дефиниране на нов FLASH сегмент, еквивалентен на областта на паметта за зареждане, и използване на оператора @ за поставяне на желаните функции в този сегмент. Операторът @ не се прилага за функции, които се извикват във функции, маркирани с @.
Дефиниция на сегмент за зареждане в *.xcl файл за ATmega128 с размер 8 килобайта:
1. Направете нова дефиниция на размера на секцията за зареждане.
2. Дефинирайте нов сегмент за цялата секция за изтегляне въз основа на дефиницията на стъпка 1.
Поставяне на C функции в даден сегмент:
Примерът за C код по-горе ще постави функцията ExampleFunction() в конкретен сегмент на паметта BOOT_SEGMENT.
[Описание на фърмуера ]
Кодът на фърмуера се състои от 5 C функции и един примерен проект за IAR версия 2.28a / 3.10c за ATmega128. Примерният проект е конфигуриран да постави целия код на приложението в секцията Boot на FLASH паметта. Този код може да се използва като отправна точка за вашата програма, която може да пише FLASH. Таблицата показва функциите, които имат достъп до FLASH паметта.
Функция | Аргументи | Връщания |
ReadFlashByte() | MyAddressType flashAddr | неподписан char |
ReadFlashPage() | MyAddressType flashStartAddr,unsigned char *dataPage | неподписан char |
WriteFlashByte() | MyAddressType flashAddr, неподписани char данни | неподписан char |
WriteFlashPage() | MyAddressType flashStartAdr, unsigned char *dataPage | неподписан char |
RecoverFlash() | невалиден | неподписан char |
RecoverFlash() ще прочете променливата на състоянието в EEPROM и ще възстанови FLASH страницата, ако е необходимо. Функцията трябва да бъде извикана в началото на програмата, ако е активирана опцията за възстановяване на FLASH (__FLASH_RECOVER). Функцията ще върне TRUE, ако е извършено възстановяване, в противен случай ще върне FALSE.
[Как работи възстановяването на FLASH ]
Когато опцията за възстановяване на FLASH е активирана, записът на страница включва първо съхраняване на данни на специална страница за възстановяване на FLASH, преди действителното записване на FLASH да се случи. Адресът на записваната страница се съхранява в EEPROM заедно с байт за състояние, който показва, че FLASH страницата за възстановяване съдържа данни. Този статут байт ще бъде изчистен, когато посочената операция за запис на страница завърши успешно. Променливите в EEPROM и буфера за възстановяване на FLASH се използват от функцията RecoverFlash() за възстановяване на данните, ако е необходимо. Записването на един байт в EEPROM отнема приблизително същото време като записването на цяла страница във FLASH. Така че трябва да имате предвид, че активирането на опцията за възстановяване ще доведе до значително увеличаване на времето за запис. EEPROM се използва вместо FLASH, защото разпределянето на няколко байта във FLASH би изключило гъвкавото използване на цялата страница, която би съдържала тези байтове.
[Потокови диаграми на алгоритъма ]

Ориз. 2. Алгоритъм на работаФункция ReadFlashByte().

Ориз. 3. Алгоритъм на функцията ReadFlashPage().

Ориз. 4. Алгоритъм на функцията WriteFlashByte().

Ориз. 5. Алгоритъм на функцията WriteFlashPage().

Ориз. 6. Алгоритъм на функцията RecoverFlash().