91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

國產芯片 Rust 快速點燈

代碼地址:https://github.com/hysonglet/py32f030-hal  

在單片機的學習中,點燈是開發者的一個入門儀式,點亮一個 led 燈,將會帶你進入新世界的大門,讓你感受軟件如何控制硬件。

 硬件 

在 Py32_Rust_dev_V1.1 開發版中,LED 的相關原理圖如下:

從圖中可以看出,開發版有 2 個可以通過 GPIO 引腳控制的 LED,且這兩個引腳與串口下載的電路復用。因此在點燈的同時可能會影響串口的正常工作,理論上是不能同時使用。

Rust 的庫接口已經保證 PA10 和 PA11 引腳只能在一種場合安全被使用,因此在本篇使用 LED GPOIO 控制亮滅的實驗中,請不要去使用其他非常手段來做串口的引腳,當然鼓勵去嘗試一起使用, 甚至嘗試修改代碼把同一引腳創建多個 Output 對象,去感受 Rust 的安全特性。本篇僅分享如何使用  GPIO 控制 LED 閃爍。

在原理圖圖中有以下信息在編程中會用到:

  • RX LED:PA9
  • TX LED:PA10
  • 當引腳為 低電平時,LED 亮,反之則滅

 測試代碼:examples/blinky.rs

#![no_std]
#![no_main]

use embedded_hal::digital::v2::ToggleableOutputPin;
use hal::gpio::{Output, PinIoType, PinSpeed};
use py32f030_hal as hal;

use {defmt_rtt as _, panic_probe as _};

#[cortex_m_rt::entry]
fn main() -> ! {
    let p = hal::init(Default::default());

    defmt::info!("Led blinky testing...");

    let gpioa = p.GPIOA.split();
    let mut led = Output::new(gpioa.PA10, PinIoType::PullDown, PinSpeed::Low);

    loop {
        // 翻轉led
        let _ = led.toggle();
        cortex_m::asm::delay(10_000_000);
    }
}

編譯&運行 

cargo r --example blinky

效果

?  py32f030-hal git:(main) ? cargo r --example blinky
warning: unused manifest key: dependencies.embedded-io-async.option
   Compiling py32f030_hal v0.1.0 (/Users/hunter/mywork/py32/py32f030-hal)
    Finished `dev` profile [optimized + debuginfo] target(s) in 0.48s
     Running `probe-rs run --chip PY32F030x8 target/thumbv6m-none-eabi/debug/examples/blinky`
      Erasing ? [00:00:00] [######################################################################################################################] 12.00 KiB/12.00 KiB @ 57.31 KiB/s (eta 0s )
  Programming ? [00:00:04] [#######################################################################################################################] 10.62 KiB/10.62 KiB @ 2.53 KiB/s (eta 0s )    Finished in 4.483s
INFO  Led blinky testing...
└─ blinky::__cortex_m_rt_main @ examples/blinky.rs:14

你可能好奇的地方

  1. 為什么添加 use embedded_hal::digital::v2::ToggleableOutputPin;? 引用這個 trait后,Output 實例將能在該代碼范圍使用 ToggleableOutputPin 的函數,當然 Output 已經在文件 src/gpio/mod.rs 中實現了 ToggleableOutputPin, 因此 Output 具備了 ToggleableOutputPin trait 的能力, 如果不引用 ToggleableOutputPin , 則 Outout 的 toggle 接口將被隱藏不能使用。
  2. 為什么沒有開啟 GPIOA 外設的時鐘地方?因為在 p.GPIOA.split(); 中,驅動幫我們偷偷開啟了外設時鐘,因此上層應用開發者可以無感使用。
  3. cortex_m::asm::delay(10_000_000); 定時準嗎?通常與cpu 的頻率有關,參數為 tick 數。
  4. use 的調用順序有關系嗎?沒關系,只要調用了,編譯會自動識別的。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關注 14
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 永兴县| 沂南县| 台湾省| 武强县| 乌什县| 漳州市| 陆良县| 赤城县| 陈巴尔虎旗| 贵定县| 禄丰县| 华容县| 威远县| 那坡县| 姚安县| 绥化市| 武强县| 迭部县| 盐亭县| 漠河县| 马山县| 皮山县| 西充县| 晋州市| 辉南县| 宝应县| 建始县| 凯里市| 垫江县| 广水市| 尚义县| 英山县| 长汀县| 永和县| 山阳县| 玉溪市| 白银市| 古交市| 明星| 沁源县| 呼伦贝尔市|