{"id":1800,"date":"2022-05-30T22:34:19","date_gmt":"2022-05-30T20:34:19","guid":{"rendered":"http:\/\/www.fabienm.eu\/wordpress\/?p=1800"},"modified":"2022-05-31T11:51:02","modified_gmt":"2022-05-31T09:51:02","slug":"rust-sur-rp2040","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/wordpress\/2022\/05\/30\/rust-sur-rp2040\/","title":{"rendered":"Rust sur RP2040"},"content":{"rendered":"\n<p>Dans la continuit\u00e9 de la LED clignotante sur <a href=\"http:\/\/www.fabienm.eu\/wordpress\/?p=1775\" data-type=\"URL\" data-id=\"http:\/\/www.fabienm.eu\/wordpress\/?p=1775\">Longan Nano<\/a>, pourquoi ne pas tester sur RP2040 puisque j&rsquo;en ai une dans mon \u00e9tag\u00e8re ? En plus, il existe un projet <a href=\"https:\/\/github.com\/eterevsky\/rp2040-blink\">tout pr\u00eat pour \u00e7a<\/a>.<\/p>\n\n\n\n<p>Alors allons y. On clone d&rsquo;abord le projet :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php \">$ git <span class=\"hljs-keyword\">clone<\/span> https:<span class=\"hljs-comment\">\/\/github.com\/eterevsky\/rp2040-blink.git<\/span>\n$ cd rp2040-blink\/<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>On installe la cha\u00eene de d\u00e9veloppement <a href=\"https:\/\/www.rust-lang.org\/f\">rust<\/a> pour le <a href=\"https:\/\/www.raspberrypi.com\/documentation\/microcontrollers\/rp2040.html\">RP2040<\/a> (Arm cortex-m0 et tous les trucs elf2uf2-rs):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \">$ rustup target install thumbv6m-none-eabi\n<span class=\"hljs-attr\">info<\/span>: downloading component <span class=\"hljs-string\">'rust-std'<\/span> <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-string\">'thumbv6m-none-eabi'<\/span>\n<span class=\"hljs-attr\">info<\/span>: installing component <span class=\"hljs-string\">'rust-std'<\/span> <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-string\">'thumbv6m-none-eabi'<\/span>\n$ cargo install --locked elf2uf2-rs\n    Updating crates.io index\n  Downloaded elf2uf2-rs v1<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.7<\/span>\n  Downloaded <span class=\"hljs-number\">1<\/span> crate (<span class=\"hljs-number\">51.1<\/span> KB) <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-number\">0.52<\/span>s\n  Installing elf2uf2-rs v1<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.7<\/span>\n<span class=\"hljs-attr\">warning<\/span>: package <span class=\"hljs-string\">`crossbeam-utils v0.8.5`<\/span> <span class=\"hljs-keyword\">in<\/span> Cargo.lock is yanked <span class=\"hljs-keyword\">in<\/span> registry <span class=\"hljs-string\">`crates-io`<\/span>, consider running without --locked\n...\n   Compiling elf2uf2-rs v1<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.7<\/span>\n    Finished release &#91;optimized] target(s) <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-number\">2<\/span>m <span class=\"hljs-number\">06<\/span>s\n  Installing \/home\/fabien\/.cargo\/bin\/elf2uf2-rs\n   Installed package <span class=\"hljs-string\">`elf2uf2-rs v1.3.7`<\/span> (executable <span class=\"hljs-string\">`elf2uf2-rs`<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Enfin on connecte la carte sur l&rsquo;USB en laissant le bouton \u00abBOOTSEL\u00bb appuy\u00e9 pour lancer la compilation de l&rsquo;exemple avec cargo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \">$ cargo run --release\n    Updating crates.io index\n  Downloaded debug-helper v0<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.13<\/span>\n...\n  Compiling rp2040-hal v0<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.0<\/span>\n    Finished release &#91;optimized] target(s) <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-number\">41.66<\/span>s\n     Running <span class=\"hljs-string\">`elf2uf2-rs -d -s target\/thumbv6m-none-eabi\/release\/blink`<\/span>\nFound pico uf2 disk \/media\/fabien\/RPI-RP2\nTransfering program to pico\n<span class=\"hljs-number\">61.50<\/span> KB \/ <span class=\"hljs-number\">61.50<\/span> KB &#91;=======================================================================================================================================================================] <span class=\"hljs-number\">100.00<\/span> % <span class=\"hljs-number\">122.27<\/span> KB\/s \nFound pico serial on \/dev\/ttyACM0\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Chez moi \u00e7a se bloque dans cet \u00e9tat. Pour lancer le programme il faut d\u00e9brancher puis rebrancher la carte et &#8230; la LED clignote !<\/p>\n\n\n\n<p>Alors, tout comme pour la Longan Nano, je dois dire que l&rsquo;installation et l&rsquo;utilisation des outils de crosscompilation et de t\u00e9l\u00e9chargement est g\u00e9niale ! C&rsquo;est tr\u00e8s rapide, \u00e7a s&rsquo;installe en tr\u00e8s peu de commande. Et visiblement c&rsquo;est compl\u00e8tement cross-platforme puisque la doc du projet de led clignotant indique que \u00e7a n&rsquo;avait pas \u00e9t\u00e9 test\u00e9 sous Linux mais seulement W$ et pomme.<\/p>\n\n\n\n<p>Par contre pour le moment nous n&rsquo;avons pas vu une once de code rust. Il est temps de fourrer notre groin dans le code d&rsquo;exemple pour pacifier un peu le clignotement de cette led.<\/p>\n\n\n\n<p><strong>Codons mon bon<\/strong><\/p>\n\n\n\n<p>Allum\u00e9, \u00e9teint, allum\u00e9, \u00e9teint, &#8230; c&rsquo;est un peu violent. Voyons si nous pouvons faire quelque chose de plus progressif pour avoir un clignotement doux. Le <a href=\"https:\/\/github.com\/eterevsky\/rp2040-blink\/blob\/main\/src\/main.rs\">code d&rsquo;exemple<\/a> est nettement plus long que celui que nous avions sur la <a href=\"https:\/\/github.com\/riscv-rust\/longan-nano\/blob\/master\/examples\/blinky.rs\">Longan Nano<\/a>. La raison principale \u00e9tant que le programme int\u00e8gre la gestion de l&rsquo;USB en plus de la simple LED clignotante.<\/p>\n\n\n\n<p>Pas besoin d&rsquo;avoir des milliers d&rsquo;heures de pratique pour trouver la boucle de clignotement cependant :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \">    loop {\n        led_pin.set_high().unwrap();\n        write!(usb, <span class=\"hljs-string\">\"On\\n\"<\/span>).unwrap();\n        delay.delay_ms(<span class=\"hljs-number\">500<\/span>);\n\n        led_pin.set_low().unwrap();\n        write!(usb, <span class=\"hljs-string\">\"Off\\n\"<\/span>).unwrap();\n        delay.delay_ms(<span class=\"hljs-number\">500<\/span>);\n    }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Les macro \u00abwrite!()\u00bb permettent d&rsquo;\u00e9crire du texte sur le port uart \u00e9mul\u00e9 par l&rsquo;usb.<\/p>\n\n\n\n<p>\u00c0 partir de l\u00e0 il est assez simple de modifier cette partie pour faire du soft-blink. Comme pour la Longan Nano, <a href=\"https:\/\/docs.rs\/cortex-m\/latest\/cortex_m\/delay\/struct.Delay.html#method.delay_us-2\">la documentation de la cagette cortex_m<\/a> nous indique qu&rsquo;il existe une mani\u00e8re d&rsquo;attendre les \u00b5s : <em>delay_us<\/em>(). Le code va donc ressembler \u00e0 s&rsquo;y m\u00e9prendre \u00e0 celui de la Longan Nano :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \">    <span class=\"hljs-keyword\">let<\/span> count_max:u32 = <span class=\"hljs-number\">1000<\/span>;\n    <span class=\"hljs-keyword\">let<\/span> mut count:u32 = <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">let<\/span> mut decount: bool = <span class=\"hljs-literal\">true<\/span>;\n\n    loop {\n        <span class=\"hljs-comment\">\/\/ on<\/span>\n        led_pin.set_high().unwrap();\n        delay.delay_us(count);\n        <span class=\"hljs-comment\">\/\/ off<\/span>\n        led_pin.set_low().unwrap();\n        delay.delay_us(count_max - count);\n        <span class=\"hljs-keyword\">if<\/span> decount {\n            <span class=\"hljs-keyword\">if<\/span> count == <span class=\"hljs-number\">0<\/span> {\n                decount = <span class=\"hljs-literal\">false<\/span>;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                count = count - <span class=\"hljs-number\">1<\/span>;\n            }\n        } <span class=\"hljs-keyword\">else<\/span> {\n            <span class=\"hljs-keyword\">if<\/span> count &lt; count_max {\n                count = count + <span class=\"hljs-number\">1<\/span>;\n            }<span class=\"hljs-keyword\">else<\/span>{\n                decount = <span class=\"hljs-literal\">true<\/span>;\n            }\n        }\n    }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>On prendra bien soin de virer les messages on\/off qui ralentissent prodigieusement le comptage du clignotement doux.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Et la LED clignote<\/h2>\n\n\n\n<iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/8MWa3KK5_NQ\" title=\"YouTube video player\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\" width=\"560\" height=\"315\" frameborder=\"0\"><\/iframe>\n\n\n\n<p>Voila \\o\/<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pour conclure<\/h2>\n\n\n\n<p>Encore une fois, la mise en \u0153uvre des outils pour programmer en <strong>Rust<\/strong> sur un microcontr\u00f4leur est d&rsquo;une incroyable facilit\u00e9 et rapidit\u00e9. Deux trois lignes de commandes (et un projet github qui va bien quand m\u00eame \ud83d\ude09 et c&rsquo;est pli\u00e9 !<\/p>\n\n\n\n<p>Je suis encore tr\u00e8s loin de ma\u00eetriser le langage, mais il m&rsquo;a \u00e9t\u00e9 extr\u00eamement facile de trouver la bonne documentation pour avoir la fonction qui va bien de mani\u00e8re \u00e0 am\u00e9liorer l&rsquo;exemple et faire un minimum \u00abjoujou\u00bb avec la machine.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans la continuit\u00e9 de la LED clignotante sur Longan Nano, pourquoi ne pas tester sur RP2040 puisque j&rsquo;en ai une dans mon \u00e9tag\u00e8re ? En plus, il existe un projet tout pr\u00eat pour \u00e7a. Alors allons y. On clone d&rsquo;abord &hellip; <a href=\"http:\/\/www.fabienm.eu\/wordpress\/2022\/05\/30\/rust-sur-rp2040\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[269,268,240,266,191],"class_list":["post-1800","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-blinky","tag-cortex_m0","tag-microcontroleur","tag-rp2040","tag-rust"],"_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=1800"}],"version-history":[{"count":6,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1800\/revisions"}],"predecessor-version":[{"id":1810,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1800\/revisions\/1810"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=1800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=1800"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=1800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}