使用 rust 开发 stm32:stm32f303-horse-race-lamp-with-timer-in-pulling-mode

更多分享内容可访问我的个人博客

https://www.niuiic.top/

本系列教程全部置于stm32专栏。本系列教程全部置于 stm32 专栏。

本例程参考stm32fxxx-hal crate(如stm32f1xx-hal)官方例程,并在官方例程的基础上增加了一些注释,修正了一些错误。可以借鉴不同型号的 stm32 例程,毕竟固件库的核是一样的。

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use panic_halt as _;
use stm32f3::stm32f303;

#[entry]
fn main() -> ! {
    let peripherals = stm32f303::Peripherals::take().unwrap();
    let rcc = &peripherals.RCC;

    // init leds
    rcc.ahbenr.modify(|_, w| w.iopeen().set_bit());
    let gpioe = &peripherals.GPIOE;
    gpioe.moder.modify(|_, w| {
        w.moder8()
            .output()
            .moder9()
            .output()
            .moder10()
            .output()
            .moder11()
            .output()
            .moder12()
            .output()
            .moder13()
            .output()
            .moder14()
            .output()
            .moder15()
            .output()
    });

    // init TIM6 timer
    // power on TIM6 timer
    rcc.apb1enr.modify(|_, w| w.tim6en().set_bit());
    let tim6 = &peripherals.TIM6;
    // opm : set the timer mode to one pulse mode
    // cen : disable the counter during the configuration
    tim6.cr1.modify(|_, w| w.opm().set_bit().cen().clear_bit());
    // the default clock APB1_CLOCK = 8 MHz
    // PSC = 7999
    // 8 M / (7999 + 1) = 1 k
    // configure the prescaler to have the counter operate at 1 kHz
    // that means the counter will increase on every millisecond
    tim6.psc.write(|w| w.psc().bits(7_999));
    // set counter period
    tim6.arr.write(|w| w.arr().bits(1000));
    // enable the counter
    tim6.cr1.modify(|_, w| w.cen().set_bit());
    let mut i = 0;
    loop {
        if i == 0 {
            gpioe.odr.modify(|_, w| w.odr9().set_bit());
            gpioe.odr.modify(|_, w| w.odr8().clear_bit());
        } else if i == 1 {
            gpioe.odr.modify(|_, w| w.odr10().set_bit());
            gpioe.odr.modify(|_, w| w.odr9().clear_bit());
        } else if i == 2 {
            gpioe.odr.modify(|_, w| w.odr11().set_bit());
            gpioe.odr.modify(|_, w| w.odr10().clear_bit());
        } else if i == 3 {
            gpioe.odr.modify(|_, w| w.odr12().set_bit());
            gpioe.odr.modify(|_, w| w.odr11().clear_bit());
        } else if i == 4 {
            gpioe.odr.modify(|_, w| w.odr13().set_bit());
            gpioe.odr.modify(|_, w| w.odr12().clear_bit());
        } else if i == 5 {
            gpioe.odr.modify(|_, w| w.odr14().set_bit());
            gpioe.odr.modify(|_, w| w.odr13().clear_bit());
        } else if i == 6 {
            gpioe.odr.modify(|_, w| w.odr15().set_bit());
            gpioe.odr.modify(|_, w| w.odr14().clear_bit());
        } else if i == 7 {
            gpioe.odr.modify(|_, w| w.odr8().set_bit());
            gpioe.odr.modify(|_, w| w.odr15().clear_bit());
        }
        // wait until the counter completes one period
        while !tim6.sr.read().uif().bit_is_set() {}
        // clear the update event flag
        tim6.sr.modify(|_, w| w.uif().clear_bit());
        i = if i == 7 { 0 } else { i + 1 };
        // since we select one pulse mode, it's necessary to restart the timer
        tim6.cr1.modify(|_, w| w.cen().set_bit());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值