{"id":21750,"date":"2019-04-19T12:33:02","date_gmt":"2019-04-19T12:33:02","guid":{"rendered":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers-4\/"},"modified":"2025-12-23T10:21:10","modified_gmt":"2025-12-23T15:21:10","slug":"oxidizing-bare-metal-rust-programming-for-arm-microcontrollers","status":"publish","type":"post","link":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/","title":{"rendered":"Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers"},"content":{"rendered":"\n<p>Being an <a href=\"\/services\/embedded-development-and-embedded-programming\">embedded systems developer<\/a> is always an exciting challenge. One of the downsides though is that in general, programming and development tools are somewhat limited. Developers are almost always restricted to C\/C++ and often can&#8217;t rely on more extensive open source libraries. However, recently there have been many efforts to expand high-level language support to ARM-based bare metal targets.<\/p>\n\n\n\n<p>Projects using MicroPython and JerryScript attempt to provide a means to write Python and JavaScript code and provide frameworks for \u201ccompiling\u201d and running scripts on a variety of bare-metal targets. However, these types of frameworks have some inherent drawbacks. JavaScript and Python are both interpreted languages with garbage collection and weak typing. Running these languages requires relying on&nbsp;a run time or more complex cross compiler.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-a-new-language-for-embedded-systems\">A New Language for Embedded Systems<\/h2>\n\n\n\n<p>More recently, Rust has emerged as an appealing language for applications that require <strong>memory safety and efficiency<\/strong>. Both of these features are often critical for embedded devices. Manual memory management often creates bugs which are hard to isolate and are not always easily remedied due to the resource constraints of embedded devices.<\/p>\n\n\n\n<p>Additionally, C\/C++, even given all of its faults, remains a highly efficient language due to the control it provides developers and because it can use many target-specific optimizations at compile time. C\/C++ sets a high benchmark for speed that is difficult for interpreted languages to match.<\/p>\n\n\n\n<p>Rust, fortunately, solves both problems in ways that are particularly well suited to <a href=\"\/services\/embedded-development-and-embedded-programming\/embedded-systems-platforms\">microcontrollers<\/a>. Rust does not require any run-time engine for garbage collection or memory management. Rust instead chooses to enforce memory safety at compile time. Furthermore, because Rust compiles to LLVM, target optimizations rivaling those achievable with C\/C++ are possible. Recently, the Rust core team has made support for new target architectures a priority, and there are already many open source projects aimed at expanding support for embedded devices in Rust.<\/p>\n\n\n\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161053\/Rust-Board-3.jpg\"><span style=\"font-size:12px;\"><em>Nucleo PCB Running on Rust<\/em><\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-getting-started-with-rust\">Getting Started with Rust<\/h2>\n\n\n\n<p>The <a href=\"https:\/\/docs.rust-embedded.org\/book\/index.html\" target=\"_blank\">Embedded Rust Book<\/a> provides many details regarding getting started with Rust on embedded devices. For this blog, I\u2019ll highlight a few key components that make up the Rust embedded landscape. Specifically, I\u2019ll be discussing support for <strong>ARM Cortex M based microcontrollers<\/strong>.<\/p>\n\n\n\n<p>The Rust ecosystem is built on an extensive library of packages called \u201cCrates.\u201d A few specific crates, \u201ccortex-m\u201d and \u201ccortex-m-rt\u201d, make up the core support for ARM targets. These packages provide the bare minimum of code to get a basic program up and running. It allows access and control of the core ARM registers.<\/p>\n\n\n\n<p>Below is an example of setting up the systick peripheral taken from the Rust Embedded Book.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e\"><span style=\"background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e\">Rust<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>use cortex_m::peripheral::{syst, Peripherals};\nuse cortex_m_rt::entry;\n\n#&#91;entry&#93;\nfn main() -> ! {\n    let mut peripherals = Peripherals::take().unwrap();\n    let mut systick = peripherals.SYST;\n    systick.set_clock_source(syst::SystClkSource::Core);\n    systick.set_reload(1_000);\n    systick.clear_current();\n    systick.enable_counter();\n    while !systick.has_wrapped() {\n        \/\/ Loop\n    }\n\n    loop {}\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">use<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">cortex_m<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">peripheral<\/span><span style=\"color: #D4D4D4\">::{syst, <\/span><span style=\"color: #4EC9B0\">Peripherals<\/span><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">use<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">cortex_m_rt<\/span><span style=\"color: #D4D4D4\">::entry;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">#&#91;entry&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">fn<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">() -&gt; ! {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">mut<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">peripherals<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4EC9B0\">Peripherals<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">take<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">unwrap<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">mut<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systick<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">peripherals<\/span><span style=\"color: #D4D4D4\">.SYST;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systick<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">set_clock_source<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">syst<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">SystClkSource<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">Core<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systick<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">set_reload<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1_000<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systick<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">clear_current<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systick<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">enable_counter<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> !<\/span><span style=\"color: #9CDCFE\">systick<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has_wrapped<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">        \/\/ Loop<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">loop<\/span><span style=\"color: #D4D4D4\"> {}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>To implement something more interesting than a simple timer, we\u2019ll need a <strong>Peripheral Access<\/strong> crate. These crates are typically specific to a <a href=\"\/services\/embedded-development-and-embedded-programming\/embedded-systems-platforms\">vendor and family<\/a> of microcontrollers. For example, the <strong>STM32F4 crate<\/strong> provides an API for accessing various peripherals such as GPIO, UART, and I2C for the STM32F4 family of devices.<\/p>\n\n\n\n<p>Pulling in a Peripheral Access crate, we can build a program for toggling an LED:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e\"><span style=\"background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e\">Rust<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fn main() -> ! {\n    let mut peripherals = stm32f429::Peripherals::take().unwrap();\n\n    \/\/Enable gpio b clock\n    let rcc = &amp;peripherals.RCC;\n    rcc.ahb1enr.write(|w| w.gpioben().bit(true));\n\n    \/\/set pin 14 to output\n    let gpio = &amp;peripherals.GPIOB;\n    gpio.moder.write(|w| w.moder14().bits(1));\n\n    \/\/Turn on led\n    gpio.odr.write(|w| w.odr14().set_bit());\n\n    loop {\n\n        delay(10000);\n        if  gpio.odr.read().odr14().bit()\n        {\n            gpio.odr.write(|w| w.odr14().clear_bit());\n        }\n        else {\n            gpio.odr.write(|w| w.odr14().set_bit());\n        }\n        \n    }\n}\n\nfn delay(count: u32) {\n     for _ in 0..count { cortex_m::asm::nop() }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">fn<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">() -&gt; ! {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">mut<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">peripherals<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4EC9B0\">stm32f429<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">Peripherals<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">take<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">unwrap<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/Enable gpio b clock<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">rcc<\/span><span style=\"color: #D4D4D4\"> = &amp;<\/span><span style=\"color: #9CDCFE\">peripherals<\/span><span style=\"color: #D4D4D4\">.RCC;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">rcc<\/span><span style=\"color: #D4D4D4\">.ahb1enr.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(|<\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">| <\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">gpioben<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">bit<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/set pin 14 to output<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">gpio<\/span><span style=\"color: #D4D4D4\"> = &amp;<\/span><span style=\"color: #9CDCFE\">peripherals<\/span><span style=\"color: #D4D4D4\">.GPIOB;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">gpio<\/span><span style=\"color: #D4D4D4\">.moder.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(|<\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">| <\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">moder14<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">bits<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/Turn on led<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">gpio<\/span><span style=\"color: #D4D4D4\">.odr.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(|<\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">| <\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">odr14<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">set_bit<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">loop<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">10000<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gpio<\/span><span style=\"color: #D4D4D4\">.odr.<\/span><span style=\"color: #DCDCAA\">read<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">odr14<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">bit<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">gpio<\/span><span style=\"color: #D4D4D4\">.odr.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(|<\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">| <\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">odr14<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">clear_bit<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">gpio<\/span><span style=\"color: #D4D4D4\">.odr.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(|<\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">| <\/span><span style=\"color: #9CDCFE\">w<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">odr14<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">set_bit<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">fn<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">count<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">u32<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">..<\/span><span style=\"color: #9CDCFE\">count<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4EC9B0\">cortex_m<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">asm<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">nop<\/span><span style=\"color: #D4D4D4\">() }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Although Rust is an exciting new option for embedded development, it will take some time for it to supplant C\/C++ as the standard. A lack of official support from major silicon vendors like <a href=\"\/services\/embedded-development-and-embedded-programming\/embedded-systems-platforms\">ST, NXP, and Silicon Labs<\/a> means that adding support for new microcontrollers can be a tedious process. Additionally, C\/C++ frameworks like ARM&#8217;s mbed offer large, general purpose libraries and drivers that can be used across a variety of ARM targets with little to no modification.<\/p>\n\n\n\n<p>Learn more about DMC&#8217;s <a href=\"\/services\/embedded-development-and-embedded-programming\/product-development\">Embedded Product Development<\/a> Services and <a href=\"\/services\/embedded-development-and-embedded-programming\/embedded-systems-platforms\">Embedded Systems Platforms<\/a> expertise.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Being an embedded systems developer is always an exciting challenge. One of the downsides though is that in general, programming and development tools are somewhat limited. Developers are almost always restricted to C\/C++ and often can&#8217;t rely on more extensive open source libraries. However, recently there have been many efforts to expand high-level language support [&hellip;]<\/p>\n","protected":false},"author":322,"featured_media":21751,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[754,897,973],"tags":[1180,1117,1112],"class_list":["post-21750","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-embedded-development-programming","category-low-power-embedded-design","category-product-development","tag-arm-microcontrollers","tag-embedded-systems","tag-microcontroller-programming"],"yoast_head":"<title>Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers | DMC, Inc.<\/title>\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.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers\" \/>\n<meta property=\"og:description\" content=\"Being an embedded systems developer is always an exciting challenge. One of the downsides though is that in general, programming and development tools are somewhat limited. Developers are almost always restricted to C\/C++ and often can&#8217;t rely on more extensive open source libraries. However, recently there have been many efforts to expand high-level language support [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/\" \/>\n<meta property=\"og:site_name\" content=\"DMC, Inc.\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/pages\/DMC-Inc\/107982009242929\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-19T12:33:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-23T15:21:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png\" \/>\n\t<meta property=\"og:image:width\" content=\"925\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"DMC\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"DMC\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/\"},\"author\":{\"name\":\"DMC\",\"@id\":\"https:\/\/www.dmcinfo.com\/#\/schema\/person\/eab178041edfa6657dc10afa8e001e13\"},\"headline\":\"Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers\",\"datePublished\":\"2019-04-19T12:33:02+00:00\",\"dateModified\":\"2025-12-23T15:21:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/\"},\"wordCount\":617,\"publisher\":{\"@id\":\"https:\/\/www.dmcinfo.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png\",\"keywords\":[\"ARM Microcontrollers\",\"Embedded Systems\",\"Microcontroller Programming\"],\"articleSection\":[\"Embedded Development &amp; Programming\",\"Low-Power Embedded Design\",\"Product Development\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/\",\"url\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/\",\"name\":\"Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers | DMC, Inc.\",\"isPartOf\":{\"@id\":\"https:\/\/www.dmcinfo.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png\",\"datePublished\":\"2019-04-19T12:33:02+00:00\",\"dateModified\":\"2025-12-23T15:21:10+00:00\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#primaryimage\",\"url\":\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png\",\"contentUrl\":\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png\",\"width\":925,\"height\":400,\"caption\":\"Oxidizing Bare Metal Rust Programming for ARM Microcontrollers final\"},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dmcinfo.com\/#website\",\"url\":\"https:\/\/www.dmcinfo.com\/\",\"name\":\"DMC, Inc.\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.dmcinfo.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dmcinfo.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.dmcinfo.com\/#organization\",\"name\":\"DMC, Inc.\",\"url\":\"https:\/\/www.dmcinfo.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dmcinfo.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27171146\/dmc-logo-1.png\",\"contentUrl\":\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27171146\/dmc-logo-1.png\",\"width\":418,\"height\":167,\"caption\":\"DMC, Inc.\"},\"image\":{\"@id\":\"https:\/\/www.dmcinfo.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/pages\/DMC-Inc\/107982009242929\",\"https:\/\/www.instagram.com\/dmcengineering\",\"https:\/\/www.youtube.com\/DMCEngineering\",\"https:\/\/www.linkedin.com\/company\/dmc-engineering\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dmcinfo.com\/#\/schema\/person\/eab178041edfa6657dc10afa8e001e13\",\"name\":\"DMC\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dmcinfo.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/06\/27185251\/dmc-avatar.png\",\"contentUrl\":\"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/06\/27185251\/dmc-avatar.png\",\"caption\":\"DMC\"},\"url\":\"https:\/\/www.dmcinfo.com\/blog\/author\/dmc\/\"}]}<\/script>","yoast_head_json":{"title":"Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers | DMC, Inc.","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.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/","og_locale":"en_US","og_type":"article","og_title":"Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers","og_description":"Being an embedded systems developer is always an exciting challenge. One of the downsides though is that in general, programming and development tools are somewhat limited. Developers are almost always restricted to C\/C++ and often can&#8217;t rely on more extensive open source libraries. However, recently there have been many efforts to expand high-level language support [&hellip;]","og_url":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/","og_site_name":"DMC, Inc.","article_publisher":"https:\/\/www.facebook.com\/pages\/DMC-Inc\/107982009242929","article_published_time":"2019-04-19T12:33:02+00:00","article_modified_time":"2025-12-23T15:21:10+00:00","og_image":[{"width":925,"height":400,"url":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png","type":"image\/png"}],"author":"DMC","twitter_card":"summary_large_image","twitter_misc":{"Written by":"DMC","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#article","isPartOf":{"@id":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/"},"author":{"name":"DMC","@id":"https:\/\/www.dmcinfo.com\/#\/schema\/person\/eab178041edfa6657dc10afa8e001e13"},"headline":"Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers","datePublished":"2019-04-19T12:33:02+00:00","dateModified":"2025-12-23T15:21:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/"},"wordCount":617,"publisher":{"@id":"https:\/\/www.dmcinfo.com\/#organization"},"image":{"@id":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png","keywords":["ARM Microcontrollers","Embedded Systems","Microcontroller Programming"],"articleSection":["Embedded Development &amp; Programming","Low-Power Embedded Design","Product Development"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/","url":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/","name":"Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers | DMC, Inc.","isPartOf":{"@id":"https:\/\/www.dmcinfo.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#primaryimage"},"image":{"@id":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png","datePublished":"2019-04-19T12:33:02+00:00","dateModified":"2025-12-23T15:21:10+00:00","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dmcinfo.com\/blog\/21750\/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers\/#primaryimage","url":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png","contentUrl":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27161052\/Oxidizing-Bare-Metal-Rust-Programming-for-ARM-Microcontrollers-final.png","width":925,"height":400,"caption":"Oxidizing Bare Metal Rust Programming for ARM Microcontrollers final"},{"@type":"WebSite","@id":"https:\/\/www.dmcinfo.com\/#website","url":"https:\/\/www.dmcinfo.com\/","name":"DMC, Inc.","description":"","publisher":{"@id":"https:\/\/www.dmcinfo.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dmcinfo.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.dmcinfo.com\/#organization","name":"DMC, Inc.","url":"https:\/\/www.dmcinfo.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dmcinfo.com\/#\/schema\/logo\/image\/","url":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27171146\/dmc-logo-1.png","contentUrl":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/05\/27171146\/dmc-logo-1.png","width":418,"height":167,"caption":"DMC, Inc."},"image":{"@id":"https:\/\/www.dmcinfo.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/pages\/DMC-Inc\/107982009242929","https:\/\/www.instagram.com\/dmcengineering","https:\/\/www.youtube.com\/DMCEngineering","https:\/\/www.linkedin.com\/company\/dmc-engineering"]},{"@type":"Person","@id":"https:\/\/www.dmcinfo.com\/#\/schema\/person\/eab178041edfa6657dc10afa8e001e13","name":"DMC","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dmcinfo.com\/#\/schema\/person\/image\/","url":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/06\/27185251\/dmc-avatar.png","contentUrl":"https:\/\/cdn.dmcinfo.com\/wp-content\/uploads\/2025\/06\/27185251\/dmc-avatar.png","caption":"DMC"},"url":"https:\/\/www.dmcinfo.com\/blog\/author\/dmc\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/posts\/21750","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/users\/322"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/comments?post=21750"}],"version-history":[{"count":2,"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/posts\/21750\/revisions"}],"predecessor-version":[{"id":38999,"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/posts\/21750\/revisions\/38999"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/media\/21751"}],"wp:attachment":[{"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/media?parent=21750"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/categories?post=21750"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dmcinfo.com\/wp-json\/wp\/v2\/tags?post=21750"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}