AVR109 самопрограмиране AVR, avr, програмиране

Ето превода на апнотата "AVR109: Използване на самопрограмиране на миниатюрни AVR и megaAVR устройства "[1]. Обхванати са следните въпроси:

• Примерен C код на програма, която сама програмира програмната памет
• Четене и писане на области с памет ФЛАШ и EEPROM
• Битове за защита от четене и запис (Lock Bits)
• Четене на битови предпазители (Fuse Bits)
• Как работи с програмиста с отворен код AVR911 [2]
• Съвместим с AVRProg
• Протокол, оптимизиран за ефективно програмиране

[Въведение]

Тази бележка за приложението описва как AVR може да използва инструкцията Store Store Memory (SPM) да се програмира. Обикновено този вид програмиране се използва за bootloaders. Примерната програма (фърмуер на микроконтролера, буутлоудър) се обменя чрез UART с компютър, работещ с AVR програмист с отворен код (АВРОСП) [2] от бележката за приложението AVR911. Това позволява FLASH и EEPROM програмиране без необходимост от външен програмист. Кодът на фърмуера също е съвместим с обвивката AVRProg (само за устройства, поддържани от AVRProg), която се предлага с AVR Studio (или Atmel Studio).

Програма буутлоудър записани в специален раздел за зареждане на паметта FLASH. Това е често срещана програма, която се справя с комуникацията с компютъра-хост и изпълнява както Flash, така и EEPROM програмиране. След програмирането можете да приложите защита на различни (незадължителни) нива, поотделно за зареждащата FLASH памет и приложенията FLASH памет. Това осигурява уникална и удобна възможност за програмиране на AVR, с разрешение за прилагане на защита на фърмуера.

[Инструкция за SPM]

За да разберем по-добре самопрограмирането на AVR, тук ще разгледаме основните принципи на организацията на паметта и как работи инструкцията SPM. FLASH паметта е разделена на 2 секции, едната от тях е секция Application, другата е секцията Boot Loader. Активирането на секцията на буутлоудъра се контролира от инсталирането на специални AVR предпазители.

Приблизително преводач: това разделяне на FLASH на секции не е налично за всички модели AVR, главно само за устройства ATmega.

Разделът за приложения съдържа основния код на приложението, докато разделът за зареждане съдържа действителния код за самопрограмиране. Инструкцията SPM може да се изпълни само от секцията за зареждане. Забележка: паметта на секцията за зареждане може също да се използва за нормален софтуер.

FLASH паметта също е разделена на страници (страница) с 32, 64 или 128 думи. Използването на страници с памет ще бъде обяснено по-късно. Целият пул памет, както раздели, така и приложения и раздели за зареждане, е разделен на страници. Например устройство с 8 килобайта FLASH и размер на страница от 32 думи (64 байта) ще има 128 страници. Организацията на паметта е показана на фиг. един.

Приблизително преводач: една дума съдържа 2 байта. Това се дължи на организацията на набора от основни инструкции на AVR RISC, като една дума обикновено съответства на една инструкция за асемблер на AVR. Пагинацията се дължи на характеристика на технологията FLASH памет.

Фигура: 1. Организация на AVR паметта.

програмиране

Размерът на секцията Boot Loader може да бъде избран чрез програмиране на два бита предпазители BOOTSZx (тук x е 0 или 1). По този начин с тези предпазители можете да изберете една от 4 специфични опции. Предпазителите BOOTSZx могат да се променят чрез серийно програмиране или паралелно програмиране. Това изисква специален ISP или HVSP програмист [3]. За подробности относно такова програмиране вижте листа с данни за устройството.

Възможност за четене и писане

В допълнение към разделянето на FLASH паметта на секции за приложения и bootloader, FLASH е разделен и на две секции с фиксиран размер. Първият раздел е Четене-докато-запис (RWW). Вторият раздел, „Не чети-докато пиши“ (NRWW). Разделът NRWW винаги е равен на размера на възможно най-големия раздел за зареждане (от 4 възможности за избор), така че раздел за зареждане винаги е в раздела NRWW (заема цялата или част от паметта на NRWW). Това е показано на фиг. 2.

Фигура: 2. Раздели RWW и NRWW.

програмиране

Тази функционалност дава възможност за продължаване на изпълнението на критичен код, когато се актуализира секцията RWW. Имайте предвид, че критичният код трябва да е в раздела NRWW (не е задължително в раздела за зареждане). За подробности вижте раздела за прекъсвания.

Устройствата ATmega163 и ATmega323 нямат секция NRWW и RWW, те само изпълняват избираема секция в секциите за приложения и буутлоудъра. Всяко опресняване на Flash памет води до спиране на процесора за цялата операция.

Използване на инструкцията SPM

Операциите за самопрограмиране се извършват с помощта на инструкцията SPM. Операцията се избира чрез регистъра SPMCR (при някои устройства този регистър се нарича SPMCSR). Организацията на регистъра е показана на фиг. 3.

Фигура: 3. Регистрирайте SPMCR.

Когато използвате функцията SPM, битът SPMEN винаги трябва да бъде зададен в рамките на 4-тактов цикъл, преди да се изпълни инструкцията SPM. Това е за предотвратяване на неволни актуализации на FLASH. Софтуерът трябва да гарантира, че не се генерира прекъсване между настройката на бита SPMEN и изпълнението на инструкцията SPM, която надвишава ограничението от 4 цикъла. Останалите 4, подчертани на фиг. 3 бита избират между различни SPM функции. Битът SPMEN се изчиства автоматично заедно с бита на функцията в края на операцията. Функциите на SPM са описани по-долу.

Изтриване на страници. Цялата FLASH памет се актуализира страница по страница. Преди да запишете нови данни на страница, тази страница трябва да бъде изчистена.

Приблизително translator: при изчистване на страница, всички нейни байтове се преобразуват в стойността 0xFF. Очевидно е, че ако по някаква причина трябва да промените само няколко байта на страницата и да оставите останалите непроменени, тогава трябва да извадите данните от цялата страница в буфера SRAM, да промените тези байтове в буфера, да изчистите страницата и след това напишете съдържанието на страницата с буферните данни.

За да изчистите страницата, деактивирайте прекъсванията (ако е разрешено), задайте битовете PGERS и SPMEN в регистъра SPMCR, изпълнете инструкцията SPM и активирайте прекъсванията (ако е разрешено преди).

Зареждане на буфер на страница (зареждане на буфера на страницата). За да запишете нови данни на страницата, първо трябва да се попълни буферът на страницата. Page Buffer е специален хардуерен буфер само за запис (не SRAM), който временно съхранява съдържанието на страница. Този буфер трябва да се попълва дума по дума, една дума след друга. Съдържанието на буфера се копира в FLASH памет с една операция.

Z регистърът се използва за избор на думата за записване в буфера. Най-малко значимият бит (LSB) на регистъра Z се игнорира, така че една дума винаги се записва в една операция. Байтовият достъп не е възможен. Z-битовете от висок ред, които избират страницата, също се игнорират при запис в буфера на страницата. Битовата структура на Z-регистъра за страница с 32 думи (64 байта) е показана на Фиг. 4. По-големите страници използват съответно повече битове за Z-регистър за избор на дума.

Фигура: 4. Запис в буфера на страницата (Page Buffer).

буферът страницата

Написване на страница. Когато буферът на страницата се зарежда с нови данни, той трябва да бъде записан във флаш памет. За да направите това, задайте Z-регистъра по същия начин, както при функцията Page Erase. След това задайте битовете PGWRT и SPMEN в регистъра SPMCR и изпълнете инструкцията SPM в рамките на 4 цикъла. Съдържанието на регистрите R1: R0 се игнорира. Използването на Z-регистъра за страница с 32 думи (64 байта) е показано на Фиг. пет.

Фигура: 5. Записване на страница във флаш памет.

програмиране

Процесът на писане на страница отнема известно време, през което буферът на страницата и други инструкции за SPM не могат да бъдат опреснени. Битът SPMEN може да бъде анкетиран, за да се определи завършването на операция за запис на страница. Процедурата за актуализация също може да бъде управлявана от прекъсвания. Вижте раздела за прекъсванията по-долу за повече информация.

Секция RWW Зает флаг. когато операциите за изтриване на страница или запис на страница се извършват в секция RWW, флагът RWWSB се задава в хардуер, което показва, че секцията не е налична. Флагът RWWSB трябва да бъде изчистен програмно, когато операцията SPM завърши. Това се прави чрез задаване на RWWSRE и SPMEN бита в регистъра SPMCR, последвано от инструкцията SPM в рамките на 4 цикъла. Алтернативно, флагът се изчиства автоматично, когато буферът на страницата започне да се зарежда. Флагът RWWSB може да се използва от други части на приложението, за да се провери дали в момента е наличен раздел RWW. За повече информация вижте листа с данни за устройството.

Битове за заключване на зареждане (изтегляне на битове за защита). Разделите за приложения и буутлоудъра могат да бъдат защитени на различни нива. Има 4 нива на защита за всяка секция поотделно. Ето кратко описание на тези режими на защита.

Таблица 1. Режими на заключване на зареждане.