{"id":41484,"date":"2021-04-02T16:01:09","date_gmt":"2021-04-02T08:01:09","guid":{"rendered":"\/blog\/?p=41484"},"modified":"2021-04-02T16:01:12","modified_gmt":"2021-04-02T08:01:12","slug":"arduino-bootloader-programming-getting-started-with-arm-microcontrollers","status":"publish","type":"post","link":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/","title":{"rendered":"Arduino Bootloader Programming &#8211; Getting Started with ARM Microcontrollers"},"content":{"rendered":"\n<p>Bootloaders are an important yet less talked about component of microcontroller programming. You may have come across the term, or even directly interacted with the bootloaders on your microcontrollers, but how much do you really know about what they do? Join us in this article to learn all about bootloader programming and how to get started with ARM microcontrollers!<\/p>\n\n\n\n<div style=\"height:16px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>In this guide, we will be covering the following and more!<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>What are ARM Microcontrollers?<\/li><li>Introduction to Bootloaders &amp; What They Do<\/li><li>What problems do bootloaders solve?<\/li><li>Popular ARM Microcontrollers with Programmable Bootloaders<\/li><li>Tutorial: How to use a Bootloader to Flash Firmware<\/li><li>Programming a Custom Bootloader<\/li><\/ul>\n\n\n\n<div style=\"height:16px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1030\" height=\"601\" src=\"https:\/\/blog.seeedstudio.com\/wp-content\/uploads\/2021\/03\/Week-8-14-1030x601.png\" alt=\"\" class=\"wp-image-41498\" srcset=\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-1030x601.png 1030w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-300x175.png 300w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-768x448.png 768w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-1536x896.png 1536w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-2048x1195.png 2048w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-1024x597.png 1024w\" sizes=\"(max-width: 1030px) 100vw, 1030px\" \/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:1px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What are ARM Microcontrollers?<\/strong><\/h2>\n\n\n\n<div style=\"height:16px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Quite simply, ARM Microcontrollers are microcontrollers that utilise an ARM processor. ARM is short for Advanced RISC Machines, in which RISC stands for Reduced Instruction Set Computing.<\/p>\n\n\n\n<p>In contrast with CISC (Complex Instruction Set Computing) processors, RISC processors use simpler instructions to interface with hardware. This brings a few key benefits, including:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Better performance due to simpler instructions<\/li><li>Less chip-space is required due to a reduced number of instructions<\/li><li>Reduced per-chip cost due to simpler hardware design<\/li><\/ul>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Because of this, ARM processors are very suitable for microcontrollers, where <strong>high performance, low resource consumption, and low cost<\/strong> are critical. For example, the ATSAMD51 used in the <a href=\"https:\/\/www.seeedstudio.com\/Wio-Terminal-p-4509.html\">Wio Terminal<\/a> and the <a href=\"https:\/\/www.seeedstudio.com\/Seeeduino-XIAO-Arduino-Microcontroller-SAMD21-Cortex-M0+-p-4426.html\">Seeeduino XIAO<\/a>\u2019s ATSAMD21 are both ARM based processors. The popular STM32 microchip series is also based on ARM architecture.<\/p>\n\n\n\n<div style=\"height:16px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Introduction to Bootloaders<\/strong><\/h2>\n\n\n\n<div style=\"height:16px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>A bootloader is a small piece of code that runs when the microcontroller is first started. This code is used to copy the actual application from internal or external memory (usually internal flash for microcontrollers) to the device RAM, where it can be executed. Because the bootloader is run at every boot, we can easily change or upgrade the device firmware at any time.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/blog.seeedstudio.com\/wp-content\/uploads\/2021\/03\/3913_Bootloader_Flash2.png\" alt=\"\" class=\"wp-image-41508\" width=\"500\" height=\"NaN\" srcset=\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/3913_Bootloader_Flash2.png 799w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/3913_Bootloader_Flash2-255x300.png 255w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/3913_Bootloader_Flash2-768x903.png 768w\" sizes=\"(max-width: 799px) 100vw, 799px\" \/><figcaption><em>Source: ARM Developer<\/em><\/figcaption><\/figure><\/div>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>What Problems do Bootloaders Solve?<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Bootloaders allow us to update a deployed system easily to fix bugs or simply update its features. Without a bootloader, we would have to interface with the chip on the PCB directly with specialised hardware like the JTAG debugger shown below, even for simple changes.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/oYAtUW6oHWVA0ZnUCa_ob-cxQ4FD9wgnmjQsEIOAd3t7ZhDQdcb6GjosEtrAlCQUT3bFVfX8AXdCsHyNOPKHbizv_pHJXkk-_YLAicfg6RIRyHzw51Rcfc-Y-UoDK6H0iNbaOTgq\" alt=\"\" width=\"450\"\/><figcaption><a href=\"https:\/\/www.seeedstudio.com\/Sipeed-USB-JTAG-TTL-RISC-V-Debugger-p-2910.html\"><em>Sipeed USB-JTAG\/TTL RISC-V Debugger<\/em><\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p>While it isn\u2019t the focus of this article, JTAG is an industry standard that is commonly used for hardware debugging. Naturally, it can also be used to upload new firmware to our microcontrollers. However, in addition to the fact that using JTAG requires some expertise beyond that of the common hobbyist, some modern microcontrollers do not provide direct access to the PCB &#8211; rendering JTAG infeasible.<\/p>\n\n\n\n<p>Thus, the bootloader was born. With a common interface for loading new applications, we can update our firmware without using JTAG!<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Bootloader Benefits<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>While bootloaders were developed out of convenience, they have also evolved to bring the following benefits.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1.&nbsp; Bootloaders are Customisable<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Since bootloaders are code, we can program them to behave differently. For example, we can customise the bootloader to receive the firmware from different interfaces such as an SD card, from the internet, <a href=\"https:\/\/www.seeedstudio.com\/blog\/2019\/09\/25\/uart-vs-i2c-vs-spi-communication-protocols-and-uses\/\">I2C \/ UART<\/a> etc. depending on which is more convenient.<\/p>\n\n\n\n<p>Here are some examples of how bootloaders may differ.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Wired Connection<\/strong> &#8211; Eg. Arduino bootloader, where the binary (compiled sketch) is transmitted via USB<\/li><li><strong>Wireless Connection<\/strong> &#8211; Eg. OTA or Over The Air updates, which behave similarly except that data transfer is made wireless<\/li><li><strong>Secure Bootloaders<\/strong> &#8211; Data is transferred in an encrypted form with mutual authentication<\/li><\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.&nbsp; Bootloaders Make Development Safer<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>If the main code is bugged and causes our microcontroller to freeze, the bootloader acts as a failsafe to allow that result to be easily reversed, since we can easily replace the bugged firmware through it.<\/p>\n\n\n\n<p>If there is no bootloader, or if the bootloader is faulty, there would be no way to easily recover from a bugged program. When this happens, we say that our device has become \u201cbricked\u201d. The procedure to recover from a \u201cbricked\u201d state varies from device to device. In some cases, it may even be impossible.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3.&nbsp; Bootloaders Contribute to User Experience<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>While a comparatively minor benefit compared to the first two, bootloaders allow the user to recognise that the device is ON and loading by providing indications of early initialisation of certain peripherals and boot decisions.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>UF2 Bootloader Format<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The most common format that you\u2019ll come across when working with microcontroller bootloaders is UF2. The UF2, or USB Flashing Format, is a bootloader standard developed by Microsoft that allows us to program microcontrollers with different firmwares over the Mass Storage Class (removable drive).<\/p>\n\n\n\n<p>The bootloader is compatible with many platforms, including the Arduino IDE, MakeCode, ArduPy and CircuitPython. To read more about the history of bootloader formats and UF2, visit the official Microsoft Makecode page on the subject <a href=\"https:\/\/makecode.com\/blog\/one-chip-to-flash-them-all\">here<\/a>.<\/p>\n\n\n\n<p>Later in this article, I will show you how we can use UF2 to easily flash a new firmware onto our microcontroller through a simple drag and drop, so stay tuned!<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:1px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Popular ARM Microcontrollers<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>At this point, you might be wondering about what kinds of microcontrollers can take advantage of the convenient UF2 bootloader. Well, the practical answer to that is\u2026 all of them &#8211; as long as the UF2 bootloader has been ported to the device!<\/p>\n\n\n\n<p>In this section, I\u2019d like to recommend a few ARM microcontrollers for your consideration. The team at Seeed has ported the UF2 bootloader for all of these devices, so you can use it to easily flash new firmware !<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Seeeduino XIAO<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The Seeeduino XIAO is the smallest Arduino compatible board in the Seeeduino Family. Despite its small size, the Seeeduino XIAO is equipped with the powerful SAMD21 microchip and a variety of hardware interfaces. The Seeeduino XIAO uses the UF2 bootloader, which gives us convenient access to both Arduino and MicroPython firmwares.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/6gveL61cG7VewbM8i0vCJwDr40TwBJpShD0D4T6e-gVhifMS0tapb9zWAPmZfPDKvBSOCbwqI1ubJUCLgbHWg-hCnvGUiAn0rgSPSSQ5fX-zO3eyDbV5wpJ3NuCCDjzlkQNhJc0p\" alt=\"\" width=\"300\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Product Features:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>ARM Cortex-M0+ 32bit 48MHz microcontroller (SAMD21G18) with 256KB Flash, 32KB SRAM<\/li><li>Compatible with Arduino IDE &amp; MicroPython<\/li><li>Easy Project Operation: Breadboard-friendly<\/li><li>Small Size: As small as a thumb(20&#215;17.5mm) for wearable devices and small projects.<\/li><li>Multiple development interfaces: 11 digital\/analog pins, 10 PWM Pins, 1 DAC output, 1 SWD Bonding pad interface, 1 I2C interface, 1 UART interface, 1 SPI interface.<\/li><\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Keen to learn more about the Seeeduino XIAO? Visit its <a href=\"https:\/\/www.seeedstudio.com\/Seeeduino-XIAO-Arduino-Microcontroller-SAMD21-Cortex-M0+-p-4426.html\">product page<\/a> on our Seeed Online Store now!<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wio Terminal<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The Wio Terminal is a complete Arduino development platform based on the ATSAMD51, with wireless connectivity powered by Realtek RTL8720DN. As an all-in-one microcontroller, it has an onboard 2.4\u201d LCD Display, IMU, microphone, buzzer, microSD card slot, light sensor &amp; infrared emitter.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/nW4aD6QjLUOohHN8trS3bqWhyLdq3uyfD7HSO87LgSH7KXtrn6dysPRNtB6XVj462DiMN8YLZ83KJI-zzKQML9vpr_QnvMixpwLxeKoJVOZCPWBq1iut6mPjv0_PTdd2LaUc3NXq\" alt=\"\" width=\"450\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The Wio Terminal also uses the UF2 bootloader, which allows us to flash different firmwares to it. As a result, it can be programmed through a variety of platforms, including the resource-rich Arduino IDE and the beginner friendly MicroPython!<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Product Features:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Powerful MCU: Microchip ATSAMD51P19 with ARM Cortex-M4F core running at 120MHz<\/li><li>Reliable Wireless Connectivity: Equipped with Realtek RTL8720DN, dual-band 2.4GHz \/ 5GHz Wi-Fi (supported only by Arduino)<\/li><li>Highly Integrated Design: 2.4\u201d LCD Screen, IMU and more practical add-ons housed in a compact enclosure with built-in magnets &amp; mounting holes<\/li><li>Raspberry Pi 40-pin Compatible GPIO<\/li><li>Compatible with over 300 plug&amp;play Grove modules to explore with IoT<\/li><li>USB OTG Support<\/li><li>Support Arduino, CircuitPython, Micropython, ArduPy, AT Firmware, Visual Studio Code<\/li><li>TELEC Certified<\/li><\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>If you\u2019re interested to pick up a Wio Terminal, please visit its <a href=\"https:\/\/www.seeedstudio.com\/Wio-Terminal-p-4509.html\">product page<\/a> on the Seeed Online Store!<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:1px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Tutorial: Flashing Firmware with the UF2 Bootloader<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Now that we know what bootloaders do, it\u2019s time for a simple tutorial on how we can use it to flash different firmwares onto our ARM microcontrollers! In this example, I will demonstrate how to use the UF2 bootloader to conveniently flash the ArduPy firmware onto a Seeeduino XIAO or Wio Terminal, which have Arduino firmwares by default. Let\u2019s go!<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Required Materials<\/strong><\/h3>\n\n\n\n<p>To follow along with this tutorial, you will need the following materials.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><a href=\"https:\/\/www.seeedstudio.com\/Seeeduino-XIAO-Arduino-Microcontroller-SAMD21-Cortex-M0+-p-4426.html\">Seeeduino XIAO<\/a> or <a href=\"https:\/\/www.seeedstudio.com\/Wio-Terminal-p-4509.html\">Wio Terminal<\/a><\/li><li>Windows, Mac or Linux Computer<\/li><li>Wired USB Connection<\/li><\/ol>\n\n\n\n<p>This tutorial is also applicable to other microcontroller boards with the UF2 bootloader. However, you will need to obtain the firmware in UF2 format for your particular device. Otherwise, your device may not work as intended!<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 1: Enter Bootloader Mode<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>First, connect your device to your PC via USB connection. Then, enter the bootloader mode by resetting the device quickly.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>For more details on how to do this with the <strong>Wio Terminal<\/strong>, please refer <a href=\"https:\/\/wiki.seeedstudio.com\/Wio-Terminal-Getting-Started\/#faq\">here<\/a>.<\/li><li>For the <strong>Seeeduino XIAO<\/strong>, please refer <a href=\"https:\/\/wiki.seeedstudio.com\/Seeeduino-XIAO\/#reset\">here<\/a>.<\/li><\/ul>\n\n\n\n<p>If done successfully, a USB drive named Arduino should appear on your PC. Navigate to this drive location.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/nMtTGOUYC0zXiOktjjSYJxjotpjlJcMhpv3TenFfb8cxffFTXl-CKF_VTlWn867NXlduwKCdw8cbpbWCPTa42GCxqBbr9r3lcOFGnkONX34MsY_q-FdmsgNNpS-ctR1Fbc94p4Vf\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 2: Download ArduPy UF2 Firmware (<\/strong><a href=\"https:\/\/files.seeedstudio.com\/wiki\/Wio-Terminal\/res\/ArduPy_wio_terminal_lastest.uf2\"><strong>Wio Terminal<\/strong><\/a><strong> \/ <\/strong><a href=\"https:\/\/files.seeedstudio.com\/wiki\/Wio-Terminal\/res\/ArduPy_xiao_lastest.uf2\"><strong>Seeeduino XIAO<\/strong><\/a><strong>)<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 3: Flash the ArduPy Firmware<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Drag the downloaded .UF2 file and drop it in the ARDUINO USB drive. The board will automatically be ejected. Now, reset the board to load in the new ArduPy firmware!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 4: Test the New Firmware<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>If the previous steps were performed correctly, a USB drive named ARDUPY should have appeared on your PC. Open the main.py python file in the drive directory with a text editor of your choice, such as <a href=\"https:\/\/code.visualstudio.com\/\">Microsoft Visual Studio Code<\/a>, <a href=\"https:\/\/atom.io\/\">Atom<\/a>, or <a href=\"https:\/\/www.sublimetext.com\/\">Sublime Text<\/a>.<\/p>\n\n\n\n<p>Finally, copy the following code into main.py, save the file and reset your microcontroller.<\/p>\n\n\n\n<p><em>Note: If you are using another microcontroller, you will have to redefine the LED pin to correspond to the one on your device.<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>from machine import Pin, Map\nimport time\n\nLED = Pin(Map.LED_BUILTIN, Pin.OUT)\n\nWhile True:\n\tLED.on()\n\ttime.sleep(1)\n\tLED.off()\n\ttime.sleep(1)<\/code><\/pre>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>That concludes this tutorial! The LED on your microcontroller should now be flashing on and off every second. The steps we\u2019ve followed here can also be used to flash any other kind of firmware, such as for MicroPython, MakeCode or CircuitPython. As you can see, the process is made very simple thanks to the UF2 bootloader!<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:1px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to Program a Custom Bootloader<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>With all that we\u2019ve discussed about how bootloaders are customisable and useful in a variety of ways, you might be wondering how to program your very own custom bootloader.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Option 1: Simply Use an Existing Bootloader<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Writing a bootloader from scratch is no simple task, even for an experienced low-level programmer. Fortunately, most manufacturers provide a bootloader with the essential functions so that you can focus on building your applications instead of the bare metal workings. For a list of processors supported by the UF2 bootloader used in today\u2019s tutorial, please visit the <a href=\"https:\/\/github.com\/microsoft\/uf2\">UF2 GitHub Repository<\/a>.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Option 2: Port an Existing Bootloader<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>If you absolutely must use a custom bootloader, your best bet would be to port an existing one. There are many open source bootloaders available, from compact ones built for 8 bit platforms to those for complex linux systems. If you can find a bootloader that matches your desired purpose, you can tweak the code to work for your microcontroller instead. However, note that this process will still not be easy!<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Option 3: Write A Bootloader from Scratch<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>For the brave ones who still want to take on the challenge of writing a custom bootloader from zero, the first step will be to understand the ins and outs of how a bootloader really works. Here are some resources to help you get started:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.apriorit.com\/dev-blog\/66-develop-boot-loader\">How to Develop Your Own Bootloader: A Comprehensive Tutorial<\/a> on Apriorit<\/li><li><a href=\"https:\/\/developer.arm.com\/documentation\/ka002218\/latest\">ARM: How to Write a Bootloader<\/a> on ARM Developer<\/li><\/ul>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:1px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wrapping Up<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>That concludes today\u2019s article on Arduino Bootloader Programming! I hope that you\u2019ve developed a better understanding of what bootloaders are, why they\u2019re important and how we can use the UF2 bootloader format to easily flash different firmwares to our microcontrollers.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>To end off, here are some related resources that you might be interested in:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/github.com\/Seeed-Studio\/uf2-samdx1\">Seeed Fork of UF2 Bootloader for SAMD21 and SAMD51<\/a><\/li><li><a href=\"https:\/\/wiki.seeedstudio.com\/Building-Ardupy\/\">Seeed Wiki: How to Build ArduPy Firmware from Source Code<\/a><\/li><li><a href=\"https:\/\/www.embeddedrelated.com\/thread\/4393\/what-is-a-bootloader-and-when-do-you-need-one\">Forum: What is a Bootloader and when do you need one?<\/a><\/li><li><a href=\"https:\/\/www.sciencedirect.com\/topics\/engineering\/bootloader\">Bootloader &#8211; ScienceDirect<\/a><\/li><\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bootloaders are an important yet less talked about component of microcontroller programming. You may have<\/p>\n","protected":false},"author":3537,"featured_media":41498,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_tribe_ticket_capacity":"0","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"iawp_total_views":0,"footnotes":""},"categories":[1],"tags":[6,3726,1756,2982,3003],"class_list":["post-41484","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-arduino","tag-arm-microcontroller","tag-microcontroller","tag-seeeduino-xiao","tag-wio-terminal"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Arduino Bootloader Programming - Getting Started with ARM Microcontrollers - Latest News from Seeed Studio<\/title>\n<meta name=\"description\" content=\"Bootloaders are an important piece of software, but how much do you really know? Join us to learn all about arduino bootloader programming and more!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Arduino Bootloader Programming - Getting Started with ARM Microcontrollers - Latest News from Seeed Studio\" \/>\n<meta property=\"og:description\" content=\"Bootloaders are an important piece of software, but how much do you really know? Join us to learn all about arduino bootloader programming and more!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/\" \/>\n<meta property=\"og:site_name\" content=\"Latest News from Seeed Studio\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-02T08:01:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-04-02T08:01:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png\" \/>\n\t<meta property=\"og:image:width\" content=\"3000\" \/>\n\t<meta property=\"og:image:height\" content=\"1750\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jonathan Tan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jonathan Tan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/\",\"url\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/\",\"name\":\"Arduino Bootloader Programming - Getting Started with ARM Microcontrollers - Latest News from Seeed Studio\",\"isPartOf\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png\",\"datePublished\":\"2021-04-02T08:01:09+00:00\",\"dateModified\":\"2021-04-02T08:01:12+00:00\",\"author\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/61e29862da8741ee517eacd92f4cd094\"},\"description\":\"Bootloaders are an important piece of software, but how much do you really know? Join us to learn all about arduino bootloader programming and more!\",\"breadcrumb\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#primaryimage\",\"url\":\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png\",\"contentUrl\":\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png\",\"width\":3000,\"height\":1750},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.seeedstudio.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Arduino Bootloader Programming &#8211; Getting Started with ARM Microcontrollers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#website\",\"url\":\"https:\/\/www.seeedstudio.com\/blog\/\",\"name\":\"Latest News from Seeed Studio\",\"description\":\"Emerging IoT, AI and Autonomous Applications on the Edge\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.seeedstudio.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/61e29862da8741ee517eacd92f4cd094\",\"name\":\"Jonathan Tan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d8dd1a4a7882386e8818e110c9322897?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d8dd1a4a7882386e8818e110c9322897?s=96&r=g\",\"caption\":\"Jonathan Tan\"},\"url\":\"https:\/\/www.seeedstudio.com\/blog\/author\/jonathan-tan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Arduino Bootloader Programming - Getting Started with ARM Microcontrollers - Latest News from Seeed Studio","description":"Bootloaders are an important piece of software, but how much do you really know? Join us to learn all about arduino bootloader programming and more!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/","og_locale":"en_US","og_type":"article","og_title":"Arduino Bootloader Programming - Getting Started with ARM Microcontrollers - Latest News from Seeed Studio","og_description":"Bootloaders are an important piece of software, but how much do you really know? Join us to learn all about arduino bootloader programming and more!","og_url":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/","og_site_name":"Latest News from Seeed Studio","article_published_time":"2021-04-02T08:01:09+00:00","article_modified_time":"2021-04-02T08:01:12+00:00","og_image":[{"width":3000,"height":1750,"url":"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png","type":"image\/png"}],"author":"Jonathan Tan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jonathan Tan","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/","url":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/","name":"Arduino Bootloader Programming - Getting Started with ARM Microcontrollers - Latest News from Seeed Studio","isPartOf":{"@id":"https:\/\/www.seeedstudio.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#primaryimage"},"image":{"@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png","datePublished":"2021-04-02T08:01:09+00:00","dateModified":"2021-04-02T08:01:12+00:00","author":{"@id":"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/61e29862da8741ee517eacd92f4cd094"},"description":"Bootloaders are an important piece of software, but how much do you really know? Join us to learn all about arduino bootloader programming and more!","breadcrumb":{"@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#primaryimage","url":"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png","contentUrl":"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png","width":3000,"height":1750},{"@type":"BreadcrumbList","@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/04\/02\/arduino-bootloader-programming-getting-started-with-arm-microcontrollers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.seeedstudio.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Arduino Bootloader Programming &#8211; Getting Started with ARM Microcontrollers"}]},{"@type":"WebSite","@id":"https:\/\/www.seeedstudio.com\/blog\/#website","url":"https:\/\/www.seeedstudio.com\/blog\/","name":"Latest News from Seeed Studio","description":"Emerging IoT, AI and Autonomous Applications on the Edge","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.seeedstudio.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/61e29862da8741ee517eacd92f4cd094","name":"Jonathan Tan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d8dd1a4a7882386e8818e110c9322897?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d8dd1a4a7882386e8818e110c9322897?s=96&r=g","caption":"Jonathan Tan"},"url":"https:\/\/www.seeedstudio.com\/blog\/author\/jonathan-tan\/"}]}},"modified_by":"Jonathan Tan","views":13891,"featured_image_urls":{"full":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png",3000,1750,false],"thumbnail":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-80x80.png",80,80,true],"medium":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-300x175.png",300,175,true],"medium_large":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-768x448.png",640,373,true],"large":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-1030x601.png",640,373,true],"1536x1536":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-1536x896.png",1536,896,true],"2048x2048":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-2048x1195.png",2048,1195,true],"visody_icon":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14.png",32,19,false],"magazine-7-slider-full":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-1536x1020.png",1536,1020,true],"magazine-7-slider-center":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-936x897.png",936,897,true],"magazine-7-featured":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-1024x597.png",1024,597,true],"magazine-7-medium":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-720x380.png",720,380,true],"magazine-7-medium-square":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Week-8-14-675x450.png",675,450,true]},"author_info":{"display_name":"Jonathan Tan","author_link":"https:\/\/www.seeedstudio.com\/blog\/author\/jonathan-tan\/"},"category_info":"<a href=\"https:\/\/www.seeedstudio.com\/blog\/category\/news\/\" rel=\"category tag\">News<\/a>","tag_info":"News","comment_count":"0","_links":{"self":[{"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/posts\/41484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/users\/3537"}],"replies":[{"embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/comments?post=41484"}],"version-history":[{"count":16,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/posts\/41484\/revisions"}],"predecessor-version":[{"id":41957,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/posts\/41484\/revisions\/41957"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/media\/41498"}],"wp:attachment":[{"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/media?parent=41484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/categories?post=41484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/tags?post=41484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}