diff options
Diffstat (limited to '_archive')
| -rw-r--r-- | _archive/arduino-due.md | 165 | ||||
| -rw-r--r-- | _archive/arduino-uno.md | 45 | ||||
| -rw-r--r-- | _archive/awesome-books.md | 85 |
3 files changed, 168 insertions, 127 deletions
diff --git a/_archive/arduino-due.md b/_archive/arduino-due.md index 648bb4b..1b1f5ef 100644 --- a/_archive/arduino-due.md +++ b/_archive/arduino-due.md @@ -1,36 +1,44 @@ --- -title: Bare-metal ARM Cortex M3 chips +title: Bare-metal ATSAM3X8E chips date: 2024-10-05 author: Wickramage Don Sadeep Madurange layout: post --- -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. +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. ## Toolchain -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. - -- <a href="https://developer.arm.com/Tools%20and%20Software/GNU%20Toolchain" - class="external" target="_blank" rel="noopener noreferrer">Arm GNU compiler - toolchain</a>. -- <a href="https://openocd.org/" class="external" target="_blank" - rel="noopener noreferrer">OpenOCD</a> on-chip debugger. -- <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. +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. + +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. + +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. ## Electrical connections -The following diagram outlines the electrical connections between the different -components necessary to move a compiled program from a PC to the MCU. +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. <table style="border: none; width: 100%;"> <tr style="border: none;"> @@ -45,66 +53,71 @@ components necessary to move a compiled program from a PC to the MCU. </tr> </table> -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. +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 -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. - - 1. Start OpenOCD: - ``` - $ openocd -f openocd-due.cfg - ``` - 2. Open a telnet session and set the GPNVM1 bit to 1: - ``` - $ telnet localhost 4444 - > halt - > at91sam3 gpnvm show - > at91sam3 gpnvm set 1 - > at91sam3 gpnvm show - ``` - 3. Build the program using the custom linker script. - ``` - $ arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -T script.ld \ - -nostartfiles \ - -nostdlib \ - -o a.elf main.c - ``` - 4. Upload the program using OpenOCD: - ``` - $ openocd -f openocd-due.cfg -c "program a.elf verify reset exit" - ``` - -Refer to the OpenOCD manual (AT91SAM3 flash driver section) for a complete list -of commands supported for the ATSAM3X8E. - -## GPNVM bits and the linker script +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: + +``` +$ arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -T script.ld \ + -nostartfiles \ + -nostdlib \ + -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: + +``` +$ openocd -f openocd-due.cfg +$ telnet localhost 4444 + > halt + > at91sam3 gpnvm show + > at91sam3 gpnvm set 1 + > at91sam3 gpnvm show +$ 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. + +## 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 -(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. - -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. - -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. - -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. +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. + +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 + +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. + +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. + +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. Files: [source.tar.gz](source.tar.gz) diff --git a/_archive/arduino-uno.md b/_archive/arduino-uno.md index 99e3985..41407c3 100644 --- a/_archive/arduino-uno.md +++ b/_archive/arduino-uno.md @@ -1,16 +1,16 @@ --- -title: Programming ATmega328P chips +title: ATmega328P chips date: 2025-04-10 author: Wickramage Don Sadeep Madurange layout: post --- -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. - -## 5V-16MHz configuration +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. The steps that follow refer to the following pinout. @@ -27,40 +27,49 @@ The steps that follow refer to the following pinout. </tr> </table> +## 5V-16MHz configuration + 1. Connect pin 1 to 5V via a 10kΩ resistor. 2. Connect a 16MHz crystal oscillator across pins 9 and 10. 3. Connect each pin of the crystal to ground via 22pF capacitors. 4. Connect pins 7, 20, and 21 to 5V. 5. Connect pins 8 and 22 to ground. -In addition to the connections described above, it's a good idea to add 0.1μF +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. [Here's](Makefile) a sample Makefile for avr-gcc and avrdude. ## 3.3V-8MHz configuration -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. +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. + +In the following steps, we use an Arduino Uno as an in-system programmer to +replace the embedded bootloader and modify the appropriate fuses. - 1. Upload the 'ArduinoISP' sketch to the Uno. - 2. 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 + 1. Upload the 'ArduinoISP' sketch to the Arduino Uno. + 2. 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. 3. Connect the SPI ports (SCK, MISO, and MOSI) of the two MCUs. - 4. Connect Uno's SS pin to the IC's pin 1 (RESET). - 5. The IC can be powered by the Arduino Uno's 5V pin. + 4. Connect the Arduino Uno's SS pin to the IC's RESET pin (pin 1). + 5. Connect the IC's V<sub>CC</sub> to a 5V supply (e.g., the Arduino Uno's 5V + pin). 6. Burn the bootloader to the ATmega328P: - Select 'ATmega328P (3.3V, 8MHz)' from Tools > Processor. - Select 'Arduino as ISP' from Tools > Programmer. - Select Tools > Burn Bootloader. 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. [Here's](3v3.Makefile) a sample Makefile with adjusted parameters (e.g., baud rate) for an 8MHz clock. 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. +not connect AREF (pin 21) to V<sub>cc</sub>. Refer to section 23.5.2 in the +datasheet for more information. diff --git a/_archive/awesome-books.md b/_archive/awesome-books.md index 5a190f6..1aac932 100644 --- a/_archive/awesome-books.md +++ b/_archive/awesome-books.md @@ -5,65 +5,74 @@ author: Wickramage Don Sadeep Madurange layout: post --- -This article contains a list of my favourite books. - ## Cloud Atlas 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. +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. ## Ender's Game -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. +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. ## Flowers for Algernon -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. +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. ## Dead Souls -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. +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. ## The Overcoat 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. +Akakievich, an impoverished government clerk, buys a new overcoat. I recommend +reading Gogol before Dostoyevsky. What Gogol invented, Dostoyevsky perfected. ## Demons 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. +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. ## The Outsider -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. +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. ## Frankenstein -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. +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. ## Strange Case of Dr Jekyll and Mr Hyde @@ -87,3 +96,13 @@ Another one of Gogol's brilliant short stories. Presented in the form of 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. + +<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> + |
