summaryrefslogtreecommitdiffstats
path: root/_site/archive
diff options
context:
space:
mode:
Diffstat (limited to '_site/archive')
-rw-r--r--_site/archive/arduino-due/index.html149
-rw-r--r--_site/archive/arduino-uno/index.html49
-rw-r--r--_site/archive/awesome-books/index.html86
-rw-r--r--_site/archive/index.html4
4 files changed, 160 insertions, 128 deletions
diff --git a/_site/archive/arduino-due/index.html b/_site/archive/arduino-due/index.html
index 13e006e..86f4fb0 100644
--- a/_site/archive/arduino-due/index.html
+++ b/_site/archive/arduino-due/index.html
@@ -2,12 +2,12 @@
<html>
<head>
<meta charset="utf-8">
- <title>Bare-metal ARM Cortex M3 chips</title>
+ <title>Bare-metal ATSAM3X8E chips</title>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Bare-metal ARM Cortex M3 chips</title>
+ <title>Bare-metal ATSAM3X8E chips</title>
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="stylesheet" href="/assets/css/skeleton.css">
</head>
@@ -40,34 +40,38 @@
<main>
<div class="container">
- <h2 class="center" id="title">BARE-METAL ARM CORTEX M3 CHIPS</h2>
+ <h2 class="center" id="title">BARE-METAL ATSAM3X8E CHIPS</h2>
<h6 class="center">05 OCTOBER 2024</h5>
<br>
- <div class="twocol justify"><p>This post is about programming bare metal SAM3X8E Arm Cortex M3 chips found on
-Arduino Due boards. I had to learn how to do this because none of the
-high-level tools for programming Arduino Dues are available for OpenBSD, which
-I use for much of my personal computing.</p>
+ <div class="twocol justify"><p>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.</p>
<h2 id="toolchain">Toolchain</h2>
-<p>Since we will not be using pre-packaged development tools, we need to assemble
-our own toolchain. As usual, we need a compiler toolchain to build programs for
-the target chip. As we will be bypassing the embedded bootloader, we will also
-need a hardware programmer and an on-chip debugger to flash programs to the
-chip. I used the following toolchain.</p>
+<p>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 <a href="https://www.st.com/en/development-tools/st-link-v2.html" class="external" target="_blank" rel="noopener noreferrer">ST-LINK/V2</a> programmer fits this
+bill.</p>
-<ul>
- <li><a href="https://developer.arm.com/Tools%20and%20Software/GNU%20Toolchain" class="external" target="_blank" rel="noopener noreferrer">Arm GNU compiler
-toolchain</a>.</li>
- <li><a href="https://openocd.org/" class="external" target="_blank" rel="noopener noreferrer">OpenOCD</a> on-chip debugger.</li>
- <li><a href="https://www.st.com/en/development-tools/st-link-v2.html" class="external" target="_blank" rel="noopener noreferrer">ST-LINK/V2</a>
-programmer.</li>
-</ul>
+<p>The <a href="https://openocd.org/" class="external" target="_blank" rel="noopener noreferrer">OpenOCD</a> 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.</p>
+
+<p>Finally, we need the <a href="https://developer.arm.com/Tools%20and%20Software/GNU%20Toolchain" class="external" target="_blank" rel="noopener noreferrer">ARM GNU Compiler
+Toolchain</a> 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.</p>
<h2 id="electrical-connections">Electrical connections</h2>
-<p>The following diagram outlines the electrical connections between the different
-components necessary to move a compiled program from a PC to the MCU.</p>
+<p>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.</p>
<table style="border: none; width: 100%;">
<tr style="border: none;">
@@ -82,69 +86,70 @@ components necessary to move a compiled program from a PC to the MCU.</p>
</tr>
</table>
-<p>Arduino Due exposes the SAM3X8E’s Serial Wire Debug (SWD) interface via its
-DEBUG port. The ST-LINK/v2 programmer uses the SWD protocol to communicate with
-the chip.</p>
+<p>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.</p>
<h2 id="uploading-the-program">Uploading the program</h2>
-<p>Follow the steps below to upload a program to the SAM3X8E chip. The
-source.tar.gz tarball at the end of the page contains a sample program with a
-OpenOCD config file and a linker script.</p>
-
-<ol>
- <li>Start OpenOCD:
- <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ openocd -f openocd-due.cfg
-</code></pre></div> </div>
- </li>
- <li>Open a telnet session and set the GPNVM1 bit to 1:
- <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ telnet localhost 4444
+<p>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:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -T script.ld \
+ -nostartfiles \
+ -nostdlib \
+ -o a.elf main.c
+</code></pre></div></div>
+
+<p>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:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ openocd -f openocd-due.cfg
+$ telnet localhost 4444
&gt; halt
&gt; at91sam3 gpnvm show
&gt; at91sam3 gpnvm set 1
&gt; at91sam3 gpnvm show
-</code></pre></div> </div>
- </li>
- <li>Build the program using the custom linker script.
- <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -T script.ld \
- -nostartfiles \
- -nostdlib \
- -o a.elf main.c
-</code></pre></div> </div>
- </li>
- <li>Upload the program using OpenOCD:
- <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ openocd -f openocd-due.cfg -c "program a.elf verify reset exit"
-</code></pre></div> </div>
- </li>
-</ol>
+$ openocd -f openocd-due.cfg -c "program a.elf verify reset exit"
+</code></pre></div></div>
-<p>Refer to the OpenOCD manual (AT91SAM3 flash driver section) for a complete list
-of commands supported for the ATSAM3X8E.</p>
+<p>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.</p>
-<h2 id="gpnvm-bits-and-the-linker-script">GPNVM bits and the linker script</h2>
+<p>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.</p>
+
+<h2 id="gpnvm-bits">GPNVM bits</h2>
<p>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.</p>
-
-<p>The GPNVM bits control which of them maps to 0x00000. When GPNVM1 is cleared
-(default), the chip boots from the ROM, which contains Atmel’s SAM-BA
-bootloader. So, the chip runs the embedded bootloader instead of our program.</p>
-
-<p>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 using the linker script, we set the GPNVM1 bit and
-leave the GPNVM2 bit as it is.</p>
-
-<p>The linker script places the vector table at the first address of the flash.
-ARM chips expect this unless we relocate the vector table using the VTOR
-register. The first entry of the vector table must be the stack pointer, and
-the second must be the reset vector.</p>
-
-<p>Finally, the ATSAM3X8E uses a descending stack. So, in the linker script, we
-initialize the stack pointer to the highest memory location available. In the
-reset vector, we zero out memory, initialize registers, and perform other tasks
-before passing control to the main program.</p>
+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.</p>
+
+<p>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.</p>
+
+<h2 id="linker-script">Linker script</h2>
+
+<p>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.</p>
+
+<p>The first entry of the vector table must be the stack pointer. The stack
+pointer must be initializes to the highest memory location available to
+accommodate the ATSAM3X8E’s descending stack.</p>
+
+<p>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.</p>
<p>Files: <a href="source.tar.gz">source.tar.gz</a></p>
</div>
diff --git a/_site/archive/arduino-uno/index.html b/_site/archive/arduino-uno/index.html
index 7509267..3b0234d 100644
--- a/_site/archive/arduino-uno/index.html
+++ b/_site/archive/arduino-uno/index.html
@@ -2,12 +2,12 @@
<html>
<head>
<meta charset="utf-8">
- <title>Programming ATmega328P chips</title>
+ <title>ATmega328P chips</title>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Programming ATmega328P chips</title>
+ <title>ATmega328P chips</title>
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="stylesheet" href="/assets/css/skeleton.css">
</head>
@@ -40,15 +40,15 @@
<main>
<div class="container">
- <h2 class="center" id="title">PROGRAMMING ATMEGA328P CHIPS</h2>
+ <h2 class="center" id="title">ATMEGA328P CHIPS</h2>
<h6 class="center">10 APRIL 2025</h5>
<br>
- <div class="twocol justify"><p>This post is a step-by-step guide for wiring up ATmega328P ICs to run at 5V
-with a 16MHz crystal and 3.3V with an 8MHz crystal. While the 5V
-configuration is common, the 3.3V configuration can be advantageous in
-low-power applications and when interfacing with parts that run at 3.3V.</p>
-
-<h2 id="5v-16mhz-configuration">5V-16MHz configuration</h2>
+ <div class="twocol justify"><p>This is a quick reference for wiring up ATmega328P ICs to run at 5V and 3.3V.
+While the 5V configuration is common, the 3.3V configuration can be useful in
+low-power applications and when interfacing with parts that themselves run at
+3.3V. In this guide, the 5V setup is configured with a 16MHz crystal
+oscillator, while the 3.3V configuration makes use of an 8MHz crystal
+oscillator.</p>
<p>The steps that follow refer to the following pinout.</p>
@@ -65,6 +65,8 @@ low-power applications and when interfacing with parts that run at 3.3V.</p>
</tr>
</table>
+<h2 id="5v-16mhz-configuration">5V-16MHz configuration</h2>
+
<ol>
<li>Connect pin 1 to 5V via a 10kΩ resistor.</li>
<li>Connect a 16MHz crystal oscillator across pins 9 and 10.</li>
@@ -73,23 +75,30 @@ low-power applications and when interfacing with parts that run at 3.3V.</p>
<li>Connect pins 8 and 22 to ground.</li>
</ol>
-<p>In addition to the connections described above, it’s a good idea to add 0.1μF
+<p>In addition to the the connections above, it’s a good idea to add 0.1μF
decoupling capacitors between pins 7, 20, and 21 and ground.
<a href="Makefile">Here’s</a> a sample Makefile for avr-gcc and avrdude.</p>
<h2 id="33v-8mhz-configuration">3.3V-8MHz configuration</h2>
-<p>The following steps use Arduino Uno as an ISP and Arduino utilities to program
-ATmega328P’s bootloader and the fuses (e.g., BOD level) for a 3.3V supply.</p>
+<p>Standard ATmega328P chips are preconfigured to run at 5V. To run one at 3.3V,
+we must first modify its fuses (e.g., BOD level). If the chip contains a
+pre-installed bootloader that expects a 16MHz clock (such as the Arduino Uno
+bootloader), it must be replaced with one that is more amenable to an 8MHz
+clock.</p>
+
+<p>In the following steps, we use an Arduino Uno as an in-system programmer to
+replace the embedded bootloader and modify the appropriate fuses.</p>
<ol>
- <li>Upload the ‘ArduinoISP’ sketch to the Uno.</li>
- <li>Wire up the ATmega328P as described in the previous section. Replace the 5V
-supply with a 3.3V supply and use an 8MHz crystal instead of the 16MHz
+ <li>Upload the ‘ArduinoISP’ sketch to the Arduino Uno.</li>
+ <li>Wire up the ATmega328P IC as described in the previous section, while
+replacing the 5V supply with a 3.3V supply and 16MHz crystal with an 8MHz
crystal.</li>
<li>Connect the SPI ports (SCK, MISO, and MOSI) of the two MCUs.</li>
- <li>Connect Uno’s SS pin to the IC’s pin 1 (RESET).</li>
- <li>The IC can be powered by the Arduino Uno’s 5V pin.</li>
+ <li>Connect the Arduino Uno’s SS pin to the IC’s RESET pin (pin 1).</li>
+ <li>Connect the IC’s V<sub>CC</sub> to a 5V supply (e.g., the Arduino Uno’s 5V
+pin).</li>
<li>Burn the bootloader to the ATmega328P:
<ul>
<li>Select ‘ATmega328P (3.3V, 8MHz)’ from Tools &gt; Processor.</li>
@@ -100,14 +109,14 @@ crystal.</li>
</ol>
<p>The ATmega328P is now ready to run at 8MHz with a 3.3V power supply. You can
-upload programs to the ATmega328P as you usually would using avrdude.
+upload programs to the ATmega328P as you normally would using avrdude.
<a href="3v3.Makefile">Here’s</a> a sample Makefile with adjusted parameters (e.g., baud
rate) for an 8MHz clock.</p>
<p>In both configurations, if you intend to use the ATmega328P’s analog-to-digital
converter with the internal 1.1V or AV<sub>cc</sub> voltage as reference, do
-not connect AREF (pin 21) to V<sub>cc</sub>. Refer to section 23.5.2 ADC
-Voltage Reference in the datasheet for more information.</p>
+not connect AREF (pin 21) to V<sub>cc</sub>. Refer to section 23.5.2 in the
+datasheet for more information.</p>
</div>
<p class="post-author right">by Wickramage Don Sadeep Madurange</p>
diff --git a/_site/archive/awesome-books/index.html b/_site/archive/awesome-books/index.html
index c9f1934..8f2f45e 100644
--- a/_site/archive/awesome-books/index.html
+++ b/_site/archive/awesome-books/index.html
@@ -43,65 +43,74 @@
<h2 class="center" id="title">AWESOME BOOKS</h2>
<h6 class="center">20 APRIL 2025</h5>
<br>
- <div class="twocol justify"><p>This article contains a list of my favourite books.</p>
-
-<h2 id="cloud-atlas">Cloud Atlas</h2>
+ <div class="twocol justify"><h2 id="cloud-atlas">Cloud Atlas</h2>
<p>This highly creative novel rekindled my love of fiction. Cloud Atlas is a
-collection of six tales linked across time. As the novel unfolds, each story
-riffles over the previous ones, like a pack of playing cards.</p>
+collection of six tales linked across time. As the book unfolds, the stories
+riffle over one another like a pack of cards. David Mitchell brings the Cloud
+Atlas world and the characters in it to life with beautiful, vivid
+descriptions. The novel explores themes ranging from social to spiritual,
+including the struggle for freedom against oppression, interconnectedness, and
+rebirth.</p>
<h2 id="enders-game">Ender’s Game</h2>
-<p>In this sci-fi novel, Andrew “Ender” Wiggin, a young boy, is drafted to lead a
-squad of young children in an offensive against an alien race. It’s a complex
-story that touches upon various political and philosophical issues. Those
-perceived as gifted by others (and alienated for it) will likely connect with
-Ender.</p>
+<p>In this sci-fi novel, Andrew “Ender” Wiggin, an 11-year-old boy, is drafted to
+lead a squad of young children in an offensive against an alien race. Ender’s
+Game is a complex story that explores themes of war, leadership, and the
+challenges gifted individuals must face as they navigate a lonely life marked
+by envy, alienation, and, sometimes, much-needed friendship.</p>
<h2 id="flowers-for-algernon">Flowers for Algernon</h2>
-<p>This novel, written as a series of progress reports, tells the story of Charlie
-Gordon, a developmentally disabled man who acquires superhuman cognitive
-abilities through an experimental medical procedure. For some reason, I felt a
-deep connection with Charlie. If I had to pick a favourite book on this list,
-that would be this.</p>
+<p>This novel, written as a series of progress reports, tells the tragic story of
+Charlie Gordon, a developmentally disabled man who acquires superhuman
+cognitive abilities through an experimental medical procedure. Charlie’s birth
+family abandons him because he is not smart enough; his friends abandon him
+because he is too smart. In the end, to spare everyone’s feelings, Charlie must
+end up in the Warren Home.<sup><a href="#footnote-1">1</a></sup> This is my
+favourite book in the list.</p>
<h2 id="dead-souls">Dead Souls</h2>
-<p>Nikolai Gogol is one of the most original authors I’ve read. Dead Souls is the
-story of Ivanovich Chichikov, a traveling merchant who trades dead serfs.
-Instead of simply describing them, Gogol develops realistic characters in
-minute detail by employing theatrical clashes between them.</p>
+<p>Dead Souls is the story of Ivanovich Chichikov, a traveling merchant who trades
+dead serfs. Gogol’s writing style is similar to Dostoyevsky’s. Considering how
+Gogol’s work predates Dostoyevsky’s, Gogol is one of the most original authors
+I’ve read. Instead of simply describing them, Gogol develops realistic
+characters in minute detail by employing theatrical clashes between them.</p>
<h2 id="the-overcoat">The Overcoat</h2>
<p>Gogol’s The Overcoat is one of the finest short stories I’ve read. Akaky
-Akakievich, an impoverished government clerk, must buy a new overcoat. I
-recommend reading Gogol before Dostoyevsky. What Gogol invented, Dostoyevsky
-perfected.</p>
+Akakievich, an impoverished government clerk, buys a new overcoat. I recommend
+reading Gogol before Dostoyevsky. What Gogol invented, Dostoyevsky perfected.</p>
<h2 id="demons">Demons</h2>
<p>After reading Demons, a story about an attempted revolution, I realized that
-Dostoevsky’s reputation is well-deserved. Dostoyevsky was a great observer of
-the human psyche. The depth with which he depicts his characters is
-unparalleled. Demons is a book that anyone aspiring to bring about change
-through revolution must read.</p>
+Dostoyevsky’s reputation is well-deserved. Dostoyevsky was a great observer of
+human nature. He depicts characters in profound detail. Dostoyevsky’s writing
+can feel long and meandering at times. However, as character development goes,
+Dostoyevsky wastes no stroke of the brush. Demons is a book that anyone
+aspiring to bring about change through revolution, especially in the name of
+someone else’s ideals, must read.</p>
<h2 id="the-outsider">The Outsider</h2>
-<p>Camus’s quote, “In our society, any man who doesn’t cry at his mother’s funeral
-is liable to be condemned to death,” summarizes the book quite well. To
-appreciate the philosophical elements of this absurdist novel, you may also
-want to check out The Myth of Sisyphus.</p>
+<p>Camus’s own quote, “In our society, any man who doesn’t cry at his mother’s
+funeral is liable to be condemned to death,” summarizes the book quite well.
+The book is about the philosophy of the absurd: the contention between our
+propensity to seek meaning in a seemingly silent and indifferent universe. To
+appreciate the philosophical elements of this novel, check out The Myth of
+Sisyphus.</p>
<h2 id="frankenstein">Frankenstein</h2>
-<p>I’m not sure why I found this story so charming. Perhaps it’s a deep-felt
-empathy for Victor Frankenstein. Maybe it’s the rustic descriptions of places
-I’d never seen. After reading the book, I traveled Frankenstein’s trail from
-Germany through Lucerne, Geneva, and Scotland.</p>
+<p>I first got to know the Frankenstein story through its popular derivatives. The
+book changed my impression of the story from one about a familiar monster to
+one about a poignant genius deserving empathy. Mary Shelley’s intricate writing
+style is singularly captivating. In this list, Frankenstein is the most
+beautifully written book.</p>
<h2 id="strange-case-of-dr-jekyll-and-mr-hyde">Strange Case of Dr Jekyll and Mr Hyde</h2>
@@ -125,6 +134,15 @@ two books are more relevant today than they’ve ever been.</p>
Aksenty Ivanovich’s diary, the story documents the government clerk’s descent
into madness. His obsession with social status and self-aggrandizement leads
him on a trajectory of envy, wounded pride, and outright insanity.</p>
+
+<div class="footnotes" role="doc-endnotes">
+ <ol>
+ <li>
+ <a href="https://www.cliffsnotes.com/literature/f/flowers-for-algernon/about-flowers-for-algernon" class="external" target="_blank" rel="noopener noreferrer"> Cliff's Notes </a>
+ </li>
+ </ol>
+</div>
+
</div>
<p class="post-author right">by Wickramage Don Sadeep Madurange</p>
</div>
diff --git a/_site/archive/index.html b/_site/archive/index.html
index 228167a..91a7361 100644
--- a/_site/archive/index.html
+++ b/_site/archive/index.html
@@ -85,7 +85,7 @@
<tr>
<td class="posts-td posts-td-link">
- <a href="/archive/arduino-uno/" class="link-decor-none">Programming ATmega328P chips</a>
+ <a href="/archive/arduino-uno/" class="link-decor-none">ATmega328P chips</a>
</td>
<td class="posts-td posts-td-time">
<span class="post-meta">
@@ -98,7 +98,7 @@
<tr>
<td class="posts-td posts-td-link">
- <a href="/archive/arduino-due/" class="link-decor-none">Bare-metal ARM Cortex M3 chips</a>
+ <a href="/archive/arduino-due/" class="link-decor-none">Bare-metal ATSAM3X8E chips</a>
</td>
<td class="posts-td posts-td-time">
<span class="post-meta">