<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Iddar Olivares</title>
    <description>The latest articles on DEV Community by Iddar Olivares (@iddar).</description>
    <link>https://dev.to/iddar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F148329%2Fa8629482-7594-48bc-a78e-2dc202383fc1.png</url>
      <title>DEV Community: Iddar Olivares</title>
      <link>https://dev.to/iddar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iddar"/>
    <language>en</language>
    <item>
      <title>Rust para Embebidos?</title>
      <dc:creator>Iddar Olivares</dc:creator>
      <pubDate>Mon, 20 Jul 2020 04:00:38 +0000</pubDate>
      <link>https://dev.to/iddar/rust-para-embebidos-4agn</link>
      <guid>https://dev.to/iddar/rust-para-embebidos-4agn</guid>
      <description>&lt;p&gt;Durante los días pasados estuve leyendo sobre el tema para preparar este post, es mucha información y que lo mas seguro termine siendo toda una serie.&lt;/p&gt;

&lt;p&gt;Quiero agradecer tanto al equipo de &lt;a href="https://electroniccats.com"&gt;Electronic cats&lt;/a&gt; como al equipo de de &lt;a href="https://github.com/nrf-rs"&gt;nrf-rs&lt;/a&gt; que estuvieron ayudándome a resolver dudas sobre el hardware y el funcionamiento de las bibliotecas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Material
&lt;/h2&gt;

&lt;p&gt;Para la practica de hoy requerimos una placa con &lt;code&gt;nrf52840&lt;/code&gt; como lo es la &lt;code&gt;Bast BLE&lt;/code&gt; y un debuger, yo usare el &lt;a href="https://dev.to/iddar/crea-un-black-magic-probe-con-un-stm32f103-5gnj"&gt;Black magic Probe&lt;/a&gt; que vimos como programar en post anteriores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Software
&lt;/h3&gt;

&lt;p&gt;En tu sistema debes contar con el &lt;a href="https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads"&gt;toolchain de ARM&lt;/a&gt; instalado y agregado al path, &lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt; para este post se usa la versión &lt;code&gt;1.45.0&lt;/code&gt; para el proyecto final usare GNU Make para cargar el firmware.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estructura de un proyecto.
&lt;/h3&gt;

&lt;p&gt;En este ejemplo quiero platicar como iniciar un proyecto de Rust para embebidos desde cero. Por lo cual debo comentar varias partes previas a código de nuestro uC.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;nfr-blik
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;nrf-blink
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creamos la carpeta para nuestro proyecto y dentro ejecutamos &lt;code&gt;cargo init&lt;/code&gt;, &lt;strong&gt;cargo&lt;/strong&gt; es un el manejador de paquetes de Rust y con el comando &lt;code&gt;init&lt;/code&gt; le indicamos que cree un proyecto nuevo. El resultado de este comando se debe ver algo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── Cargo.toml
└── src
    └── main.rs

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta es la estructura base de cualquier proyecto en Rust: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src&lt;/code&gt;: este directorio almacena todos el codigo de nuestro proyecto, si vemos incluye por defecto un &lt;code&gt;Hello world&lt;/code&gt; en el archivo &lt;code&gt;main.rs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cargo.toml&lt;/code&gt;: este archivo incluye la descripción de nuestro proyecto y las dependencias del mismo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dependencias
&lt;/h3&gt;

&lt;p&gt;Para nuestro proyecto requerimos tres dependencias, las cuales nos facilitan el trabajo. Abre el archivo &lt;code&gt;Cargo.toml&lt;/code&gt; en tu editor favorito y agrega las dependencias justo debajo de&lt;code&gt;[dependancies]&lt;/code&gt; ver el ejemplo a continuación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="py"&gt;nrf52840-hal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.11.0"&lt;/span&gt;
&lt;span class="py"&gt;cortex-m-rt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.6.12"&lt;/span&gt;
&lt;span class="py"&gt;panic-halt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.2.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cortex-m-rt&lt;/code&gt;: esta el la biblioteca base para trabajar con ARM Cortex-M incluye las configuraciones base del sistema manejo de memoria, registro etc, que son comunes en toda la familia microcontroladores.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;panic-halt&lt;/code&gt;: Siempre debemos indicar un handler en caso de que algo salga mal, este paquete nos ahorra este paso dotándonos de una función genérica para esto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;nrf52840-hal&lt;/code&gt;: esta es una capa de abstracción creada por el equipo de &lt;code&gt;nrf-rs&lt;/code&gt; la cual tiene mapeados todos los registro del uC al igual de dotarnos de algunas funciones y utilerias que veremos mas adelante.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Target
&lt;/h3&gt;

&lt;p&gt;Debemos indicar al compilador de Rust cual es el target para nuestro binario, en este caso la plataforma es ARM; para esto crearemos un carpeta &lt;code&gt;.cargo&lt;/code&gt; en la raiz de nuestro proyecto y dentro un archivo de nombre &lt;code&gt;config&lt;/code&gt; en el colocaremos las derectiva, aprovecharemos para agregar el soporte para arm con el comando &lt;code&gt;rustup&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; .cargo &lt;span class="c"&gt;# el nombre de la carpeta inicia con un punto&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; .cargo/confg &lt;span class="c"&gt;# con este comando creamos el archivo&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;rustup target add thumbv7em-none-eabihf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al archivo &lt;code&gt;.cargo/confg&lt;/code&gt; agregamos las siguientes lineas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[build]
target = "thumbv7em-none-eabihf"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hora del código
&lt;/h3&gt;

&lt;p&gt;El momento esperado llego veamos como podemos controlar nuestro uC. Colocare el código y luego explicare cada parte&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#![no_std]&lt;/span&gt;
&lt;span class="nd"&gt;#![no_main]&lt;/span&gt;

&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt; &lt;span class="n"&gt;panic_halt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt; &lt;span class="n"&gt;nrf52840_hal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;cortex_m_rt&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;nrf52840_hal&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;prelude&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;nrf52840_hal&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;pac&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Peripherals&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;nrf52840_hal&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;gpio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;nrf52840_hal&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Timer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[entry]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Peripherals&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;p0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;p0&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Parts&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="py"&gt;.P0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;led1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="py"&gt;.p0_24&lt;/span&gt;
        &lt;span class="nf"&gt;.into_push_pull_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;High&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Timer&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="py"&gt;.TIMER0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;led1&lt;/span&gt;&lt;span class="nf"&gt;.set_low&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="nf"&gt;.delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;led1&lt;/span&gt;&lt;span class="nf"&gt;.set_high&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="nf"&gt;.delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como puedes ver son muy pocas lineas las que se requieren para esta tarea. Veamos cada una a detalle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;#![no_std]&lt;/code&gt; y &lt;code&gt;#![no_main]&lt;/code&gt; la primera de ellas le dice al compilador que el programa debe compilarse sin la biblioteca entandar ya que no corre sobre un sistema operativo (no tenemos files ni sockets), la segunda que no tiene un punto de entrada definido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Luego tenemos la sección de dependencias que ya hablamos antes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;#[entry]&lt;/code&gt; justo antes de la definición de nuestra función &lt;code&gt;main&lt;/code&gt; vemos esta instrucción que lo que le indica al compilador es que esta sera principal de nuestro programa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;fn main() -&amp;gt; ! {}&lt;/code&gt;: si ya habías programado en rust antes seguro esto te llama la atención; el tipo de retorno &lt;code&gt;!&lt;/code&gt; indica que esta función nunca terminara, esto porque dentro tenemos un bucle infinito.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Peripherals::take()&lt;/code&gt; aquí creamos una instancia de nuestro uC esta es la forma en la que funcionan todos los Cortex-M en rust y desde aquí podemos interactuar e inicializar los periféricos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;p0::Parts::new(board.P0)&lt;/code&gt; aquí inicializamos el reloj de puerto 0, veremos mas sobre como funciona los relojes y los periféricos en ARM en aproximas entregas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;p0.p0_24.into_push_pull_output(Level::High)&lt;/code&gt;con figuramos el pin como &lt;code&gt;push_pull&lt;/code&gt; (te recomiendo ver el esquema de los pines si tienes dudas sobre como funciona esto.) este nos regresa una instancia &lt;code&gt;Pin&lt;/code&gt; que usaremos para configurar el estado del mismo. En este ejemplo el pin que utilizamos es el &lt;code&gt;24&lt;/code&gt; del puerto &lt;code&gt;0&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Timer::new(board.TIMER0)&lt;/code&gt; para poder generar un retraso para poder parpadear el led usaremos un instancia del Timer &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;loop {}&lt;/code&gt; este es un bucle infinito equivalente a cuando usamos el metodo loop en un sketch de arduino.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;led1.set_low()&lt;/code&gt; y &lt;code&gt;led1.set_high()&lt;/code&gt; son métodos utilitarios para cambiar el estado de los pines. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;timer.delay(1_000_000);&lt;/code&gt; utilizando la instancia del Timer &lt;code&gt;0&lt;/code&gt; podemos ejecutar su método &lt;code&gt;delay&lt;/code&gt; el cual genera un retardo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cargar el programa
&lt;/h3&gt;

&lt;p&gt;Antes de grabar el programa debemos generar el binario para esto nos ayudamos de &lt;code&gt;cargo&lt;/code&gt; como vemos a continuación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cargo build --release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto nos genera un archivo en binario en la ruta&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;target/thumbv7em-none-eabihf/release/nrf-blink
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este archivo lo usaremos para grabar nuestro micro. Tal como vimos en articulos anteriores conectamos nuestra placa al depurador y ejecutamos &lt;code&gt;arm-none-eabi-gdb&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;arm-none-eabi-gdb
&lt;span class="c"&gt;# Con esto entramos a la consola para debug&lt;/span&gt;
GNU gdb &lt;span class="o"&gt;(&lt;/span&gt;GNU Arm Embedded Toolchain&lt;span class="o"&gt;)&lt;/span&gt;
For &lt;span class="nb"&gt;help&lt;/span&gt;, &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s2"&gt;"help"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; target extended-remote /dev/ttyACM0
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; monitor swdp_scan
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Target voltage: 2.9V
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Available Targets:
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; No. Att Driver
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   1      Nordic nRF52 M4
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   2      Nordic nRF52 Access Port
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; attach 1
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; load target/thumbv7em-none-eabihf/release/nrf-blink
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; compare-sections
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; detach
&lt;span class="c"&gt;# ctrl + d para salir&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Listo tenemos nuestro Blink compilado y cargado en nuestro ARM felicidades. &lt;br&gt;
En los próximos artículos hablaremos sobre los puertos seriales y otros periféricos. &lt;/p&gt;

</description>
      <category>rust</category>
      <category>arm</category>
      <category>electronic</category>
      <category>programing</category>
    </item>
    <item>
      <title>Leer y escribir memorias SD desde arduino</title>
      <dc:creator>Iddar Olivares</dc:creator>
      <pubDate>Fri, 17 Jul 2020 05:49:17 +0000</pubDate>
      <link>https://dev.to/iddar/leer-y-escribir-memorias-sd-desde-arduino-13kj</link>
      <guid>https://dev.to/iddar/leer-y-escribir-memorias-sd-desde-arduino-13kj</guid>
      <description>&lt;p&gt;Uno de los motivos por lo que inicie este blog es documentar mi aprendizaje en el campo del machine learning para embebidos; el recurso mas vital para este campo son los datos, de los cuales nuestro modelos se nutren para aprender. &lt;/p&gt;

&lt;p&gt;Es por eso que en esta entrega aprenderemos a trabajar con memorias SD y a la par aprender como podemos almacenar nuestro datos para que sea mas fácil trabajar con ellos.&lt;/p&gt;

&lt;p&gt;Las memorias SD soportan varios protocolos de comunicación entre los cuales encontramos SPI el cual es un viejo amigo de los que trabajamos con microcontroladores. La parte divertida viene en como conectamos las memorias a nuestro integrado. &lt;/p&gt;

&lt;p&gt;En el mercado puedes encontrar un sin fin de breakboard, adaptadores, conectores para este propósito. Si no puedes esperar a que el correo llegue puedes armar un adaptador como este que me encontré en mi caja de herramientas de mis tiempos de estudiante. &lt;/p&gt;

&lt;h2&gt;
  
  
  material
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adaptador microSD a SD&lt;/li&gt;
&lt;li&gt;Tira de headers&lt;/li&gt;
&lt;li&gt;Cautín y soldadura&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solo requieres un adaptador de microSD a SD y una tira de headers. Los headers se ajustan casi a la perfección con los pads del adaptador solo hace falta ajustarlos un poco, puedes ayudarte con unas pinzas para esto. Después de soldar los pines agregue un poco de resina epoxica solo para reforzar la unión.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4U25UPHR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ybdwtc90qv7ag0b0z2yh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4U25UPHR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ybdwtc90qv7ag0b0z2yh.jpg" alt="Alt Text" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring
&lt;/h2&gt;

&lt;p&gt;Para conectar nuestro improvisado adaptador debemos de revisar al pinout de la memoria para asi identificar cuales conexiones usar. Aqui debajo les dejo el diagrama de los pines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i-1d_QUi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/jnbphefw507feuyl2ldr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i-1d_QUi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/jnbphefw507feuyl2ldr.jpg" alt="Alt Text" width="766" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dependiendo del microcontrolador que estas usando deberas conectar los pines correspondientes, en caso de usar un Arduino UNO segun la documentacion son los siguentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ** MOSI - pin 11 on Arduino Uno
 ** MISO - pin 12 on Arduino Uno
 ** CLK - pin 13 on Arduino Uno
 ** CS - depends on your SD card module.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En mi caso estoy trabajando con la Bast Ble de Electronic Cast la cual tiene etiquetados los puertos correspondientes y para el &lt;code&gt;SS&lt;/code&gt; utilizo el Pin &lt;code&gt;A3&lt;/code&gt; por cercania.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u0_-5WJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/obdhdgo7s1ny4pbox7f0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u0_-5WJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/obdhdgo7s1ny4pbox7f0.jpg" alt="Alt Text" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;para probar basta cargar el sketch de ejemplo de SD incluido en nuestro arduino IDE por default.&lt;/p&gt;

&lt;p&gt;Si todo salio bien podemos ver en la consola serial lo siguiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Initializing SD card...
Wiring is correct and a card is present.

Card type:         SD2
....
....
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>arduino</category>
      <category>memory</category>
      <category>arm</category>
      <category>electronic</category>
    </item>
    <item>
      <title>Flash nrf52840 con OpenOCD y Black magic probe</title>
      <dc:creator>Iddar Olivares</dc:creator>
      <pubDate>Wed, 15 Jul 2020 20:10:51 +0000</pubDate>
      <link>https://dev.to/iddar/flash-nrf52840-con-openocd-y-black-magic-probe-465n</link>
      <guid>https://dev.to/iddar/flash-nrf52840-con-openocd-y-black-magic-probe-465n</guid>
      <description>&lt;p&gt;Hace unos días recibí una gran sorpresa por correo, la nueva placa de &lt;a href="https://electroniccats.com"&gt;Electronic Cats&lt;/a&gt; que están por lanzar en un par de semanas, la &lt;code&gt;Bast BLE&lt;/code&gt; la cual incluye con un chip &lt;code&gt;nrf52840&lt;/code&gt; de Nordic el cual es una verdadera bestia.&lt;/p&gt;

&lt;p&gt;El &lt;code&gt;nrf52840&lt;/code&gt; esta basado en un ARM Cortex-M4 con FPU corre a un máximo de &lt;code&gt;64MHz&lt;/code&gt;, cuanta con un Radio de 2.4Ghz compatible con Bluetooth 5 y una larga muy larga lista de características te recomiendo darte una vuelta por el &lt;a href="https://www.nordicsemi.com/Products/Low-power-short-range-wireless/nRF52840"&gt;sitio oficial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;La placa que me enviaron aun esta en proceso de desarrollo por lo que es necesario actualizar y probar nuevas versiones del firmware.&lt;/p&gt;

&lt;h1&gt;
  
  
  Material
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;nrf52840 dev board (yo usare la Bast Ble)&lt;/li&gt;
&lt;li&gt;Black magic probe (&lt;a href="https://dev.to/iddar/crea-un-black-magic-probe-con-un-stm32f103-5gnj"&gt;ver mi post anterior&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wiring
&lt;/h2&gt;

&lt;p&gt;Dependiendo de tu debbuger el pinout puede cambiar en mi caso usare el Black magic basado en ST de mi post pasado y la &lt;code&gt;Bast Ble&lt;/code&gt; de la cual encontaras los pines SWD debajo de placa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--olj10dp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/o7ha5665w8rwk9b2re8b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--olj10dp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/o7ha5665w8rwk9b2re8b.jpg" alt="Bast Ble de Electronic cats" width="800" height="388"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bast Ble       Black magic
GND             GND
SWDIO           PB14
SWCLK           PA5
POWER           3.3V
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Flash
&lt;/h2&gt;

&lt;p&gt;Una vez que tenemos conectado todo podemos ir a la accion para esto es importante tener instalado y en &lt;code&gt;PATH&lt;/code&gt; el toolchain de ARM en especial &lt;code&gt;arm-none-eabi-gdb&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Identifica el puerto de tu debugger en mi caso &lt;code&gt;ttyACM0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;arm-none-eabi-gdb
&lt;span class="c"&gt;# Con esto entramos a la consola para debug&lt;/span&gt;
GNU gdb &lt;span class="o"&gt;(&lt;/span&gt;GNU Arm Embedded Toolchain&lt;span class="o"&gt;)&lt;/span&gt;
For &lt;span class="nb"&gt;help&lt;/span&gt;, &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s2"&gt;"help"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; target extended-remote /dev/ttyACM0
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; monitor swdp_scan
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Target voltage: 2.9V
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Available Targets:
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; No. Att Driver
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   1      Nordic nRF52 M4
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   2      Nordic nRF52 Access Port 
&lt;span class="c"&gt;# ctrl + d para salir&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto verificamos que estemos conectados correctamente, explico un poco los comando de arriba&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;target extended-remote /my-current-port&lt;/code&gt;: con este commando nos conectamos al servidor para debug.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;monitor swdp_scan&lt;/code&gt;: Con este listamos los dispositivos conectados por SWD, en este caso vemos el &lt;code&gt;nRF52&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si todo va bien podemos conectarnos al dispositivo con el siguiente comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# donde '1' corresponde al primer dispositivo de la lista&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; attach 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos encontrar la ultima versión del firmwarwe para Bast Ble en el &lt;a href="https://github.com/ElectronicCats/ArduinoCore-nRF528x-mbedos/tree/bast_ble"&gt;repositorio oficial&lt;/a&gt; de Electronic Cats, descarga el archivo &lt;code&gt;HEX&lt;/code&gt; en tu directorio de trabajo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://raw.githubusercontent.com/ElectronicCats/ArduinoCore-nRF528x-mbedos/bast_ble/bootloaders/bastble/bast_ble_bootloader-0.3.2.hex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;grabar el nuevo firmware usaremos la siguiente secuencia de comandos, ejecutando &lt;code&gt;arm-none-eabi-gdb&lt;/code&gt; desde tu directorio de trabajo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; target extended-remote /dev/debug-port
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; monitor swdp_scan
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; attach 1
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; load bast_ble_bootloader-0.3.2.hex
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; compare-sections
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; mon hard_srst
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; detach
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;kill&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Listo si todo salio bien solo resta desconectar el cableado y conectar tu Bast Ble por su puerto USB, al arrancar veras que se monta un dispositivo de almacenamiento y se lista un nuevo puerto serial, esto nos indica que todo salio bien ahora.&lt;/p&gt;

&lt;p&gt;Ahora puedes usar &lt;a href="https://github.com/adafruit/Adafruit_nRF52_nrfutil"&gt;adafruit-nrfutil&lt;/a&gt; o configurar tu arduino IDE siguiendo los pasos mostrados en la documentación de &lt;a href="https://github.com/ElectronicCats/ArduinoCore-nRF528x-mbedos/tree/bast_ble"&gt;Electronic Cats&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NOTA: Para programar tu Bast Ble debes presionar dos veces reset para entrar al modo boot.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Disclaimer: Todas los pruebas mostradas en este articulo fueron realizadas sobre la distribución Ubuntu (GNU/Linux).&lt;/code&gt;&lt;/p&gt;

</description>
      <category>electronic</category>
      <category>openocd</category>
      <category>arm</category>
      <category>arduino</category>
    </item>
    <item>
      <title>Crea un Black Magic Probe con un STM32F103</title>
      <dc:creator>Iddar Olivares</dc:creator>
      <pubDate>Wed, 15 Jul 2020 01:33:57 +0000</pubDate>
      <link>https://dev.to/iddar/crea-un-black-magic-probe-con-un-stm32f103-5gnj</link>
      <guid>https://dev.to/iddar/crea-un-black-magic-probe-con-un-stm32f103-5gnj</guid>
      <description>&lt;p&gt;En este post veremos como transformar una placa de desarrollo de ST en un Black Magic Probe, para lo cual requerimos el siguiente material:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- STM32F103 Dev board
- FTDI FT232 (USB-Serial)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Wiring
&lt;/h2&gt;

&lt;p&gt;Lo primero que haremos es cablear nuestro hardware. para lo cual necesitamos un par de jumpers. Dependiendo de tu adaptador USB serial deberlas conectarte a la terminal de 5v o 3.3v en su defecto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FTDI       STM32F103
RXD  &amp;lt;----&amp;gt;  A9
TXD  &amp;lt;----&amp;gt;  A10
GND  &amp;lt;----&amp;gt;  GND
VCC  &amp;lt;----&amp;gt;  VCC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En esta ocacion programaremos nuestra placa utilizando el bootloadder Serial para lo cual debemos de mover el jumper &lt;code&gt;BOOT0 -&amp;gt; 1&lt;/code&gt; y &lt;code&gt;BOOT1 -&amp;gt; 0&lt;/code&gt; como se muestra en la imagen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KXLNMUG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/n6zwt6gtrm09iczq479e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KXLNMUG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/n6zwt6gtrm09iczq479e.jpg" alt="Alt Text" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencias del sistema
&lt;/h2&gt;

&lt;p&gt;Para poder utilizar el tool de &lt;code&gt;st&lt;/code&gt; así como para compilar la el código de Black magic probe requerimos tener instalado python en nuestro sistema así como GIT y el compilador de ARM.&lt;/p&gt;

&lt;p&gt;Para instalar &lt;code&gt;gcc-arm&lt;/code&gt; basta con descargar paquete para tu sistema operativo desde &lt;a href="https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads"&gt;aqui&lt;/a&gt; descomprimirlo y agregarlo al &lt;code&gt;$PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTA: Puede que tu adaptador USB-Serial requiera drivers específicos asegurarte de tenerlos instalados antes de continuar&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ej:&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:~/gcc-arm-none-eabi/bin/
&lt;span class="c"&gt;# en algunos casos se requiere `libncurses5`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libncurses5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para el resto clonaremos los repositorios necesarios e instalaremos las dependencias requeridas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;playground &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;playground
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/jsnyder/stm32loader.git
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/blacksphere/blackmagic.git

&lt;span class="c"&gt;# creare un anviente con la version 2.7 de python &lt;/span&gt;
&lt;span class="c"&gt;# si tu version de python pory default es 3 esta &lt;/span&gt;
&lt;span class="c"&gt;# es la mejor opcion utilizando `virtualenv`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;virtualenv &lt;span class="nt"&gt;--system-site-packages&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; python2.7 ./myemv
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ./myenv/bin/activate
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;myenv&lt;span class="o"&gt;)&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;pyserial
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este punto debes de tener esta estructura&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;── playground
   ├── myemv
   ├── blackmagic
   └── stm32loader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Compilando Black Magic
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;blackmagic
&lt;span class="c"&gt;# ejecuta make para que se recopilen todos los submódulos&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;make
&lt;span class="c"&gt;# si todo salio bien ahora debes entrar al directorio&lt;/span&gt;
&lt;span class="c"&gt;# src y compilar la versión especifica para el STlink&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;src
&lt;span class="nv"&gt;$ &lt;/span&gt;make clean &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nv"&gt;PROBE_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;stlink

&lt;span class="c"&gt;# al terminal debes encontrar los siguientes archivos&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; blackmagic_dfu.bin 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; blackmagic.bin
&lt;span class="nb"&gt;cd&lt;/span&gt; ../.. &lt;span class="c"&gt;# regresamos a la carpeta playground&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Flash ST Dev Board
&lt;/h2&gt;

&lt;p&gt;Con ayuda de &lt;a href="https://github.com/jsnyder/stm32loader"&gt;stm32loader&lt;/a&gt; agregaremos el firmware DFU para poder hacer mas fácil la carga de nuevas versiones.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;stm32loader
&lt;span class="c"&gt;# tty.SLAB_USBtoUART es igual al puerto de tu dispositivo&lt;/span&gt;
&lt;span class="c"&gt;# en mi caso ttyUSB0&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;python ./stm32loader &lt;span class="nt"&gt;-p&lt;/span&gt; /dev/tty.SLAB_USBtoUART &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; ../blackmagic/src/blackmagic_dfu.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si todo salio bien ahora podremos usar &lt;code&gt;dfu-util&lt;/code&gt; cada vez que debamos actualizar la versión de nuestro firmware.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# podemos instalar dfu-util dede apt&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;dfu-util &lt;span class="c"&gt;# with sudo&lt;/span&gt;
&lt;span class="c"&gt;# agregamos nuestro usuario al grupo `dialout`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;usermod &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-G&lt;/span&gt; dialout &lt;span class="nv"&gt;$USER&lt;/span&gt; &lt;span class="c"&gt;# with sudo&lt;/span&gt;

&lt;span class="c"&gt;# este comando lista los dispositivos dfu&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;dfu-util &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reinicia tu dispositivo al terminal, desconecta todos los cables y conectarlo desde el puerto USB.&lt;/p&gt;

&lt;h1&gt;
  
  
  Debugger
&lt;/h1&gt;

&lt;p&gt;Una vez conectado nuestro dispositivo veras dos puertos nuevos &lt;code&gt;/dev/ttyACM0&lt;/code&gt; y &lt;code&gt;/dev/ttyACM1&lt;/code&gt; el primero es que requerimos para hacer el debug y el segundo es un monitor serial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# con esto nos conectamos a nuestro debugger&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;arm-none-eabi-gdb &lt;span class="nt"&gt;-ex&lt;/span&gt; &lt;span class="s2"&gt;"target extended-remote /dev/ttyACM0"&lt;/span&gt;

&lt;span class="c"&gt;# Dentro de la consola de gdb podemos usar comandos como&lt;/span&gt;
&lt;span class="c"&gt;# `monitor swdp_scan` el cual nos muestra si tenemos un&lt;/span&gt;
&lt;span class="c"&gt;# dispositivo conectado.&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; monitor swdp_scan
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Target voltage: 2.94V
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Available Targets:
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; No. Att Driver
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   1      STM32F40x M3/M4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para conectarnos a un dispositivo por medio de JTAG/SWD usaremos el siguiente pinout&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TARGET          DEBUGGER
GND             GND
SWDIO           PB14
SWCLK           PA5
POWER           3.3V
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;para una conexion Serial/UART este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TARGET          DEBUGGER
RXD             PA3
TXD             PA2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Disclaimer: Todas los pruebas mostradas en este articulo fueron realizadas sobre la distribución Ubuntu (GNU/Linux).&lt;/code&gt;&lt;/p&gt;

</description>
      <category>arm</category>
      <category>arduino</category>
      <category>gdb</category>
      <category>electronic</category>
    </item>
  </channel>
</rss>
