I am designing a board with the ATmega328P and have decided to write my own bootloader rather than use Optiboot or Arduino, etc. I understand the logic of writing the boot code. Also that it resides in a specific area of the flash (max of about 1K). I am using the AVR Studio 6.
How do I target my code to precisely reside in that area? When I generate the hex file they always end up at 0x0000. How to locate them in 0x7000 or wherever the boot section is.
-
1\$\begingroup\$ your first 1kb of code IS the boot sector. This code is run first on reset of the microcontroller, and you would put the code in here to detect a new program/handshake over UART/USB. The aim is to then facilitate the incoming data bytes as program code and load up the flash memory from 2KB+ up to the maximum of 32KB in the ATMEGA328P. Then the bootloader would tell the PC that all is done, and then it will be reset. On reset, no new program data is detected coming through, and you "Jump" the program counter to the start of the actual program stored in memory. \$\endgroup\$KyranF– KyranF2014年04月26日 13:03:10 +00:00Commented Apr 26, 2014 at 13:03
-
2\$\begingroup\$ @KyranF, on AVR microcontrollers, the boot loader resides near the top of the address space, not the bottom. \$\endgroup\$microtherion– microtherion2014年04月26日 18:15:09 +00:00Commented Apr 26, 2014 at 18:15
-
\$\begingroup\$ @microtherion thank you. So the top 2KB is taken up, and 0-30kB is available for progmem? Just as the ATMEGA328P for example \$\endgroup\$KyranF– KyranF2014年04月27日 00:55:55 +00:00Commented Apr 27, 2014 at 0:55
-
\$\begingroup\$ The exact numbers are configurable, but yes, that's the basic layout. \$\endgroup\$microtherion– microtherion2014年04月27日 07:57:59 +00:00Commented Apr 27, 2014 at 7:57
1 Answer 1
First of all you will need to set the BOOTSZx fuses according to your bootloader size, the boot reset address is not fixed and changes with that. (page 282 of the datasheet , top). You will then need to tell the linker where to put your bootloader code, and this depends on what you are using to write code. In assembly what you need is the .org statement, with AVR studio you should mess around with the "memory settings" and put ".text=0x1234" under flash. Of course 0x1234 should be the right address as per page 282, i.e. 0x3800, 0x3c00, 0x3e00 or 0x3f00.
-
\$\begingroup\$ thank u sir. i understand ur point. i am using avr studio6 . i am confused where the "memory settings" is. i know where it is in avr 4. cld u kindly point me how to modify in avr 6 pls. \$\endgroup\$Board-Man– Board-Man2014年04月26日 13:50:41 +00:00Commented Apr 26, 2014 at 13:50
-
\$\begingroup\$ I've never used AVR studio so I do not know precisley where this option is located, but I believe it's somewhere in the project's settings. It's written on the manual of AVR studio... atmel.no/webdoc/atmelstudio/… search for "memory settings" \$\endgroup\$Vladimir Cravero– Vladimir Cravero2014年04月26日 14:02:26 +00:00Commented Apr 26, 2014 at 14:02
-
\$\begingroup\$ 0x3F00 in the datasheet is in unit of word (2 bytes) - so the (byte) address is 0x7E00... \$\endgroup\$Peter Mortensen– Peter Mortensen2017年04月17日 04:41:57 +00:00Commented Apr 17, 2017 at 4:41