summaryrefslogtreecommitdiffstats
path: root/_log/arduino-due.md
diff options
context:
space:
mode:
Diffstat (limited to '_log/arduino-due.md')
-rw-r--r--_log/arduino-due.md70
1 files changed, 23 insertions, 47 deletions
diff --git a/_log/arduino-due.md b/_log/arduino-due.md
index a0bfe4a..e24666c 100644
--- a/_log/arduino-due.md
+++ b/_log/arduino-due.md
@@ -1,17 +1,24 @@
---
-title: Bare-metal ATSAM3X8E
+title: ATSAM3X8E bare-metal notes
date: 2024-09-16
layout: post
---
-Notes on programming bare-metal ATSAM3X8E chips (Arduino Due) using Serial Wire
-Debug (SwD) protocol.
+Bypassing ATSAM3X8E (Due) bootloader via Serial Wire Debug (SWD).
-## Toolchain
+Toolchain: ST-LINK/V2 programmer, OpenOCD, ARM GNU Compiler Toolchain.
-ST-LINK/V2 programmer, OpenOCD, ARM GNU Compiler Toolchain.
+ARM chips boot into 0x00000. GPNVM bits map one of ROM, flash0, flash1 to
+0x00000:
-## Electrical connections
+ - GPNVM1=0 → ROM (default).
+ - GPNVM1=1 and GPNVM2=0 → flash0.
+ - GPNVM1=1 and GPNVM2=1 → flash1.
+
+By default, control jumps to Atmel's SAM-BA bootloader in ROM. To bypass, set
+GPNVM1=1 and place vector table at 0x80000 (flash0).
+
+Connect ST-LINK/v2 to Arduino Due's DEBUG port:
<table style="border: none; width: 100%;">
<tr style="border: none;">
@@ -26,22 +33,7 @@ ST-LINK/V2 programmer, OpenOCD, ARM GNU Compiler Toolchain.
</tr>
</table>
-Arduino Due exposes the ATSAM3X8E's SWD interface via its DEBUG port. The
-ST-LINK/v2 programmer connects to that to communicate with the chip.
-
-## Upload procedure
-
-Build. Magic is in the script.ld linker script.
-
-```
-$ arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -T script.ld \
- -nostartfiles \
- -nostdlib \
- -o a.elf main.c
-```
-
-
-Upload using OpenOCD:
+Remap memory:
```
$ openocd -f openocd-due.cfg
@@ -50,35 +42,19 @@ $ telnet localhost 4444
> at91sam3 gpnvm show
> at91sam3 gpnvm set 1
> at91sam3 gpnvm show
-$ openocd -f openocd-due.cfg -c "program a.elf verify reset exit"
```
-First command starts OpenOCD. Telnet session halts chip, checks GPNVM bit. If
-unset (returns 0), set to 1 and verify. Final command uploads program. See
-OpenOCD manual AT91SAM3 flash driver section for full command list.
+Full command list is in OpenOCD manual AT91SAM3 (flash driver section).
-## GPNVM bits
+Compile and upload program:
-ARM chips boot into address 0x00000. ATSAM3X8E has ROM and dual-banked flash
-(flash0/flash1) at different addresses. GPNVM bits control which maps to
-0x00000.
-
-GPNVM1 cleared (default): boots from ROM (Atmel SAM-BA bootloader). GPNVM1=1,
-GPNVM2=0: flash0 (0x80000) maps to 0x00000. Both cleared: flash1 maps to
-0x00000.
-
-Program goes in flash0, so set GPNVM1=1 to boot our code instead of bootloader.
-
-## Linker script notes
-
-Vector table must be at first flash address--required for ARM chips unless
-relocated using VTOR register.
-
-First vector table entry: stack pointer. Initialize to highest memory location
-(ATSAM3X8E has descending stack).
-
-Second entry: reset vector. Place initialization code here (zero memory, set
-registers) before jumping to main().
+```
+$ arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -T script.ld \
+ -nostartfiles \
+ -nostdlib \
+ -o a.elf main.c
+$ openocd -f openocd-due.cfg -c "program a.elf verify reset exit"
+```
Commit:
[3184969](https://git.asciimx.com/bare-metal-arduino-due/commit/?id=318496925ca76668dd9d63c3d060376f489276f8)