From 023ea62a08492d9dda680cee3e706a988b1ae6f0 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sat, 27 Dec 2025 13:05:42 +0800 Subject: Arduino due post. --- _site/feed.xml | 2 +- _site/index.html | 2 +- _site/log/arduino-due/index.html | 98 ++++++++++++++++------------------------ _site/log/index.html | 2 +- _site/posts.xml | 2 +- 5 files changed, 42 insertions(+), 64 deletions(-) (limited to '_site') diff --git a/_site/feed.xml b/_site/feed.xml index 2f1bab9..de57fda 100644 --- a/_site/feed.xml +++ b/_site/feed.xml @@ -1 +1 @@ -Jekyll2025-12-27T12:40:20+08:00/feed.xmlASCIIMX | LogW. D. Sadeep MadurangeMatrix Rain: 2025 refactor2025-12-21T00:00:00+08:002025-12-21T00:00:00+08:00/log/matrix-digital-rainW. D. Sadeep MadurangeFingerprint door lock (LP)2025-08-18T00:00:00+08:002025-08-18T00:00:00+08:00/log/fpm-door-lock-lpW. D. Sadeep MadurangeHigh-side MOSFET switching2025-06-22T00:00:00+08:002025-06-22T00:00:00+08:00/log/mosfet-switchesW. D. Sadeep MadurangeATmega328P at 3.3V and 5V2025-06-10T00:00:00+08:002025-06-10T00:00:00+08:00/log/arduino-unoW. D. Sadeep MadurangeFingerprint door lock (RF)2025-06-05T00:00:00+08:002025-06-05T00:00:00+08:00/log/fpm-door-lock-rfW. D. Sadeep MadurangeBumblebee: browser automation2025-04-02T00:00:00+08:002025-04-02T00:00:00+08:00/log/bumblebeeW. D. Sadeep MadurangeHow to set up ATSAM3X8E microcontrollers for bare-metal programming in C2024-09-16T00:00:00+08:002024-09-16T00:00:00+08:00/log/arduino-dueW. D. Sadeep MadurangeEtlas: e-paper dashboard2024-09-05T00:00:00+08:002024-09-05T00:00:00+08:00/log/etlasW. D. Sadeep MadurangeExperimental e-reader2023-10-24T00:00:00+08:002023-10-24T00:00:00+08:00/log/e-readerW. D. Sadeep MadurangeNeo4J A* search2018-03-06T00:00:00+08:002018-03-06T00:00:00+08:00/log/neo4j-a-star-searchW. D. Sadeep Madurange \ No newline at end of file +Jekyll2025-12-27T13:04:53+08:00/feed.xmlASCIIMX | LogW. D. Sadeep MadurangeMatrix Rain: 2025 refactor2025-12-21T00:00:00+08:002025-12-21T00:00:00+08:00/log/matrix-digital-rainW. D. Sadeep MadurangeFingerprint door lock (LP)2025-08-18T00:00:00+08:002025-08-18T00:00:00+08:00/log/fpm-door-lock-lpW. D. Sadeep MadurangeHigh-side MOSFET switching2025-06-22T00:00:00+08:002025-06-22T00:00:00+08:00/log/mosfet-switchesW. D. Sadeep MadurangeATmega328P at 3.3V and 5V2025-06-10T00:00:00+08:002025-06-10T00:00:00+08:00/log/arduino-unoW. D. Sadeep MadurangeFingerprint door lock (RF)2025-06-05T00:00:00+08:002025-06-05T00:00:00+08:00/log/fpm-door-lock-rfW. D. Sadeep MadurangeBumblebee: browser automation2025-04-02T00:00:00+08:002025-04-02T00:00:00+08:00/log/bumblebeeW. D. Sadeep MadurangeATSAM3X8E bare-metal programming2024-09-16T00:00:00+08:002024-09-16T00:00:00+08:00/log/arduino-dueW. D. Sadeep MadurangeEtlas: e-paper dashboard2024-09-05T00:00:00+08:002024-09-05T00:00:00+08:00/log/etlasW. D. Sadeep MadurangeExperimental e-reader2023-10-24T00:00:00+08:002023-10-24T00:00:00+08:00/log/e-readerW. D. Sadeep MadurangeNeo4J A* search2018-03-06T00:00:00+08:002018-03-06T00:00:00+08:00/log/neo4j-a-star-searchW. D. Sadeep Madurange \ No newline at end of file diff --git a/_site/index.html b/_site/index.html index 0bc5788..b544a60 100644 --- a/_site/index.html +++ b/_site/index.html @@ -134,7 +134,7 @@ - How to set up ATSAM3X8E microcontrollers for bare-metal programming in C + ATSAM3X8E bare-metal programming diff --git a/_site/log/arduino-due/index.html b/_site/log/arduino-due/index.html index d2248bc..0916c6f 100644 --- a/_site/log/arduino-due/index.html +++ b/_site/log/arduino-due/index.html @@ -2,12 +2,12 @@ - How to set up ATSAM3X8E microcontrollers for bare-metal programming in C + ATSAM3X8E bare-metal programming - How to set up ATSAM3X8E microcontrollers for bare-metal programming in C + ATSAM3X8E bare-metal programming @@ -41,38 +41,27 @@
-

HOW TO SET UP ATSAM3X8E MICROCONTROLLERS FOR BARE-METAL PROGRAMMING IN C

+

ATSAM3X8E BARE-METAL PROGRAMMING

16 SEPTEMBER 2024

-

This article is a step-by-step guide for programming bare-metal ATSAM3X8E chips -found on Arduino Due boards. It also includes notes on the chip’s memory layout -relevant for writing linker scripts. The steps described in this article were -tested on an OpenBSD workstation.

+

Notes on programming ATSAM3X8E chips (Arduino Due) without bootloader. Tested +on OpenBSD.

Toolchain

-

To interact directly with a bare-metal ATSAM3X8E chips, we must bypass the -embedded bootloader. To do that, we need a hardware programmer capable of -communicating with the chip over the Serial Wire Debug (SWD) protocol. Since -the workstation we upload the program from presumably doesn’t speak SWD, the -hardware programmer acts as a SWD-USB adapter. The ST-LINK/V2 programmer fits this -bill.

+

Need to bypass embedded bootloader—requires hardware programmer that speaks +Serial Wire Debug (SWD). ST-LINK/V2 works as SWD-USB adapter.

-

The OpenOCD on-chip debugger software supports -ATSAM3X8E chips. OpenOCD, on startup, runs a telnet server that we can connect to -to issue commands to the ATSAM3X8E chip. OpenOCD translates plain-text commands -into the binary sequences the chip understands, and sends them over the wire.

+

OpenOCD translates commands to binary sequences the chip understands. Runs +telnet server on startup for issuing commands.

-

Finally, we need the ARM GNU Compiler -Toolchain to compile C programs for the chip. The ARM GNU compiler -toolchain and OpenOCD, as a consequence of being free software, are available -on every conceivable platform, including OpenBSD.

+

ARM GNU Compiler Toolchain for compiling C programs. Both OpenOCD and ARM +toolchain available on OpenBSD.

Electrical connections

-

The following photos illustrate the electrical connections between the Arduino -Due, PC, and the ST-LINK/V2 programmer required to transfer a compiled program -from a PC to the MCU.

+

Arduino Due exposes ATSAM3X8E’s SWD interface via DEBUG port. ST-LINK/V2 +connects there.

@@ -90,11 +79,10 @@ from a PC to the MCU.

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.

-

Uploading the program

+

Upload procedure

-

The source.tar.gz tarball at the end of this page contains a sample C program -(the classic LED blink program) with OpenOCD configuration and linker scripts. -First, use the following command to build it:

+

Sample LED blink program with OpenOCD config and linker scripts in tarball +below.

$ arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -T script.ld \
     -nostartfiles \
@@ -102,8 +90,7 @@ First, use the following command to build it:

-o a.elf main.c
-

Then, open a telnet session with OpenOCD and issue the following sequence of -commands to configure the chip and upload the compiled program to it:

+

Upload:

$ openocd -f openocd-due.cfg
 $ telnet localhost 4444
@@ -114,45 +101,36 @@ $ telnet localhost 4444
 $ openocd -f openocd-due.cfg -c "program a.elf verify reset exit"
 
-

The first of the above commands starts OpenOCD. In the telnet session, the -first command halts the chip in preparation for receiving commands. Next, we -inspect the current GPNVM bit setting (more on this later). If the bit is unset -(the gpnvm show command returns 0), we set it to 1 and verify the update.

- -

The final command, issued from outside the telnet session, uploads the program -to the chip. Those are the bare minimum set of commands required to program the -chip. The AT91SAM3 flash driver section of the OpenOCD manual lists all -available commands for the ATSAM3X8E chip.

+

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.

GPNVM bits

-

By design, ARM chips boot into address 0x00000. ATSAM3X8E’s memory consists of -a ROM and a dual-banked flash (flash0 and flash1), residing in different -locations of the chip’s address space. The GPNVM bits control which of them -maps to 0x00000. When GPNVM1 is cleared (the default), the chip boots from the ROM, -which contains Atmel’s SAM-BA bootloader.

+

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.

-

Conversely, when the GPNVM1 bit is 1 (and the GPNVM2 bit is 0), flash0 at -address 0x80000 maps to 0x00000. When both GPNVM bits are 0, flash1 maps to -0x00000. Since we place our program in flash0 in the linker script, we set the -GPNVM1 bit and leave the GPNVM2 bit unchanged to ensure the chip -executes our program instead of the embedded bootloader at startup.

+

Linker script notes

-

Linker script

+

Vector table must be at first flash address–mandatory for ARM chips unless +using VTOR register for relocation.

-

At a minimum, the linker script must place the vector table at the first -address of the flash. This is mandatory for ARM chips unless we relocate the -vector table using the VTOR register.

+

First vector table entry: stack pointer. Initialize to highest memory location +(ATSAM3X8E has descending stack).

-

The first entry of the vector table must be the stack pointer. The stack -pointer must be initialized to the highest memory location available to -accommodate the ATSAM3X8E’s descending stack.

+

Second entry: reset vector. Place initialization code here (zero memory, set +registers) before jumping to main().

-

The second entry of the vector table must be the reset vector. In the reset -vector, we can perform tasks such as zeroing out memory and initializing -registers before passing control to the main program.

+

Commit: +3184969

-

Files: source.tar.gz

diff --git a/_site/log/index.html b/_site/log/index.html index 0fcfc51..645a982 100644 --- a/_site/log/index.html +++ b/_site/log/index.html @@ -124,7 +124,7 @@