Blinky~~~

本系列所有的源代码均可在stm32-rustup获得,如果这些对你有帮助,请给个star让我知道我在做的分享是有意义的。

Intro

经过了前面的基础介绍,自然就应该开始逐步了解如何使用Rust进行开发。

那首先的就是使用GPIO输出,也就是点亮LED了。

detail

先让我们来逐步分解整个应用。

entry

#[entry]标记整个应用的入口,因为在嵌入式系统上,应用程序启动的方法有所不同,所以不能够使用标准的main函数。

usage:

// ...

use cortex_m_rt::entry;\

#[entry]
fn start() -> {
    // ...

    loop {
        // ...
    }
}

rtt

rtt_init_printprobe-rs打开RTT的要求。

只有执行过rtt_init_print才能使用rprintln进行通讯。

当然,如果你并不使用cargo-embed,你也可以使用ITMsemi-hosting进行通讯。

Peripherals

Peripherals是全部外设,因Rust的所有权机制,你在使用时应该注意他的作用域。

Pin

into_push_pull_output()使一个引脚进入推挽输出模式。

Next

{% post_link gpio-input %}

ScreenShots

blink

Code

#![no_main]
#![no_std]

// alias
use stm32f4xx_hal as hal;

// attribute
use cortex_m_rt::entry;

// prelude
use hal::prelude::*;
use stm32_rustup::*;

// import
use hal::{
    stm32,
    delay,
};
use rtt_target::{rtt_init_print, rprintln};

#[entry]
fn main() -> ! {
    rtt_init_print!();
    // 获取外设
    let dp = stm32::Peripherals::take().unwrap();
    let cp = stm32::CorePeripherals::take().unwrap();
    // 设置时钟
    let clocks = setup_clocks(dp.RCC.constrain());
    // 初始化延时 (时钟实现)
    let mut delays = delay::Delay::new(cp.SYST, clocks);
    // GPIOB
    let gb = dp.GPIOB.split();
    // led 推挽输出
    let mut led_green = gb.pb0.into_push_pull_output();
    let mut led_red = gb.pb1.into_push_pull_output();
    rprintln!(\\\"ready\\\");
    loop {
        rprintln!("new loop");
        // 反转 500ms
        led_green.toggle().unwrap();
        delays.delay_ms(500_u32);
        led_red.toggle().unwrap();
        delays.delay_ms(500_u32);
    }
}

最后修改日期: 2021年6月20日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。