Close

Odpověď na: aktualizování firmwaru přes uart

Úvodní stránka Fórum Vaše projekty Arduino aktualizování firmwaru přes uart Odpověď na: aktualizování firmwaru přes uart

#11152
Vojtěch Vosáhlo
Účastník

jak zjistím velikost stránky?
Předpokládám, že tahle velikost strany je velikost celého programu který se z nějakého důvodu nenahrává po stranách (kterých má být 256) ale celý najendou.
Kde přesně jí vezmu když mám hex soubor vytvořený arduinem? Mohlo by to být třeba tak, že vyzmu hex subor, odstraním z něj dvojtečky (na začátku každého řádku mám dvojtečku), odstraním zalomení řádků a spočítám počet znaků?

Není. Velikost stránky kterou používá arduino je u všech základních modelů (tedy UNO, nano atd.) 128B

Vše můžete vzít z vygenerovaného .hex souboru.
Je ve formátu Intel HEX takže data jsou strukturována takto:
[:][Počet bytů][Adresa][Typ zápisu][Data][Nějaký checksum]

Vezmu li tedy 1. linku mého hex souboru blink, vypadá takto:
:100000000C9434000C943E000C943E000C943E0082

Po úpravě tak aby se to dobře četlo může vypadat takto:
:#10 #00#00 #00 #0C,#94,#34,#00,#0C,#94,#3E,#00,#0C,#94,#3E,#00,#0C,#94,#3E,#00 #82

Z toho vyčteme že:
[#10] – Počet bytů v tomto řádku je 16. (0x10 -> DEC = 16)
[#00#00] – Hex soubor začíná na adrese #0000 takže i počáteční adresa bude #00
[#00] – Typ záznamu, #00 znamená datový záznam. Jediné co arduino používá je #00 – datový záznam a #01 – konec souboru. Je pro nás taky nevýznamný.
[#0C…#00] – Samotná data, tedy 16B
[#82] – checksum dat, pro nás nevýznamný

Počáteční adresa bývá vždy #0000.

Do arduina se ale nezapisuje jen 16B, programátor musí zapsat celou stránku, tzn. 128B.
Proto si vezme počáteční adresu z hex souboru (#0000) a načte si 128B dat. Pak na programovaný procesor vyflusne data ve formátu:
#55 #0000 #20 – tedy STK_LOAD_ADDRESS, 0x0000, SYNC_CRC_EOP – Tohle připraví programování.

Poté už přijde samotný zápis dat.
#64 #00#80 #46 [128B dat] #20 – tedy STK_PROGRAM_PAGE, 0x0080 (velikost stránky), ‘F'(flash paměť), 128B dat,SYNC_CRC_EOP

I když váš program nemá přesný počet bytů na stránku, musí se zapsat stránka celá, zbylé místo se tedy doplňuje #FF.

Tady je opět odkaz na pastebin s porovnáním HEX souboru který vygeneruje arduino IDE a toho co posílá procesoru.

Ano poslat data v hex tvaru by vyřešilo tenhle problém ale byl by zbytečně velký tok dat při aplikaci, takže bych se zkusil vydat první cestou programator.write(“P”);
mohu tedy data uložit do proměné (nejspíš pole charů) a potom je posílat s tím že funkce write pošle bajt po bajtu (tedy for cyklem)?

Úplně nevím co tím myslíte. Datový tok by měl být vždy stejný vzhledem k tomu že vždy posíláte X bytů reprezentovaných HEX číslem nebo charakterem.

Rozhodně neukládat do pole vše ale jen jednu stránku. Vždy byste si řekl modulu o data z internetu, nahrál je do pole a pak je posílal. Na posílání bych asi použil smyčku for jak říkáte, bude to nejlepší.