99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

嵌入式 Rust 如何使用 Timer 外設

高級定時器

PY32F030 的內部有一個高級定時器TIM1,是一個16位可編程的定時器,可用于多種場合,如基礎定時功能,輸入脈沖測量,輸出PWM。TIM1的主要特性如下:

  • 16bit 可配置的向下、向上、上下重載模式
  • 16位的分頻器,支持1~65535的分頻
  • 4 個獨立的通道,可用于
    • 輸入脈沖捕獲
    • 輸出比較
    • PWM
    • 單脈沖輸出
  • 支持互補輸出的死區配置
  • 外部信號控制定時器或定時器級聯控制
  • DMA 操作
  • 中斷事件
    • 更新事件
    • 觸發事件
    • 輸入捕獲事件
    • 輸出比較
    • 剎車輸入
  • 支持正交編碼與霍爾傳感器電路

    在驅動包 py32f030-hal 中,目前已實現常用的定時、PWM輸出、中斷等功能,擴展其他功能也非常簡單。以下將提供裸機環境操作定時器和多任務系統中配置定時器輸出PWM的例程。

    示例1: 定時:examples/advanced_timer_block.rs

    #![no_std]
    #![no_main]
    
    use embedded_hal::digital::v2::ToggleableOutputPin;
    use hal::gpio::{Output, PinIoType, PinSpeed};
    use hal::mode::Blocking;
    use hal::timer::advanced_timer::AnyTimer;
    use py32f030_hal as hal;
    
    use {defmt_rtt as _, panic_probe as _};
    
    #[cortex_m_rt::entry]
    fn main() -> ! {
        defmt::info!("timer counter examples start...");
        let p = hal::init(Default::default());
    
        let gpioa = p.GPIOA.split();
    
        let timer = AnyTimer::<_, Blocking>::new(p.TIM1).unwrap();
        letmut counter = timer.as_counter();
    
        letmut led = Output::new(gpioa.PA0, PinIoType::PullUp, PinSpeed::Low);
    
        letmut cnt = 0;
    
        loop {
            let _ = led.toggle();
            // 延時 1s
            counter.delay_us_blocking(1_000_000);
            defmt::info!("{}", cnt);
            cnt += 1;
        }
    }
    #![no_std]
    #![no_main]
    
    use embedded_hal::digital::v2::ToggleableOutputPin;
    use hal::gpio::{Output, PinIoType, PinSpeed};
    use hal::mode::Blocking;
    use hal::timer::advanced_timer::AnyTimer;
    use py32f030_hal as hal;
    
    use {defmt_rtt as _, panic_probe as _};
    
    #[cortex_m_rt::entry]
    fn main() -> ! {
        defmt::info!("timer counter examples start...");
        let p = hal::init(Default::default());
    
        let gpioa = p.GPIOA.split();
    
        let timer = AnyTimer::<_, Blocking>::new(p.TIM1).unwrap();
        letmut counter = timer.as_counter();
    
        letmut led = Output::new(gpioa.PA0, PinIoType::PullUp, PinSpeed::Low);
    
        letmut cnt = 0;
    
        loop {
            let _ = led.toggle();
            // 延時 1s
            counter.delay_us_blocking(1_000_000);
            defmt::info!("{}", cnt);
            cnt += 1;
        }
    }

    運行:

    cargo r --example advanced_timer_block
    示例2: examples/advanced_timer_block_2.rs
    #![no_std]
    #![no_main]
    
    use embedded_hal::timer::CountDown;
    use fugit::ExtU32;
    use hal::mode::Blocking;
    use hal::timer::advanced_timer::AnyTimer;
    use py32f030_hal as hal;
    
    use {defmt_rtt as _, panic_probe as _};
    
    #[cortex_m_rt::entry]
    fn main() -> ! {
        defmt::info!("timer counter examples start...");
        let p = hal::init(Default::default());
    
        let timer = AnyTimer::<_, Blocking>::new(p.TIM1).unwrap();
        letmut counter = timer.as_counter();
    
        letmut cnt = 0;
        loop {
            // 延時 5s
            defmt::info!("repeat...{} ", cnt);
            counter.start(5u32.secs());
            let _ = counter.wait();
            cnt += 1;
        }
    }

    運行:

    cargo r --example advanced_timer_block_2

    示例3:PWM輸出:examples/embassy_pwm.rs

    配置輸出 PWM 波形

    #![no_std]
    #![no_main]
    
    use hal::timer::advanced_timer::{AnyTimer, ChannelConfig, ChannelOutputConfig};
    use py32f030_hal::gpio::gpioa::PA0;
    use py32f030_hal::{selfas hal, mode::Blocking, timer::advanced_timer::Channel};
    
    use embassy_executor::Spawner;
    use embassy_time::Timer;
    use embedded_hal::Pwm;
    
    use {defmt_rtt as _, panic_probe as _};
    
    #[embassy_executor::task]
    asyncfn run() {
        loop {
            Timer::after_secs(2).await;
            defmt::info!("task run");
        }
    }
    
    #[embassy_executor::main]
    asyncfn main(_spawner: Spawner) {
        defmt::info!("time1 start...");
        let p = hal::init(Default::default());
        let gpioa = p.GPIOA.split();
    
        _spawner.spawn(run()).unwrap();
    
        let timer: AnyTimer<_, Blocking> = AnyTimer::new(p.TIM1).unwrap();
        letmut pwm = timer.as_pwm();
    
        let channel_1_pin = gpioa.PA3;
        pwm.set_channel_1_pin::<_, PA0>(Some(channel_1_pin), None);
    
        // 配置定時器
        pwm.config(
            /* 配置通道1 */
           Some(ChannelConfig::default().ch(ChannelOutputConfig::default())),
            None,
            None,
            None,
        );
    
        // 計數頻率為1M
        pwm.set_frequency(1_000_000);
        // 設置計數周期為1000,則波形的頻率為 1000_000/1000 = 1K
        pwm.set_period(1000u16 - 1);
        let max_duty = pwm.get_max_duty();
        // 33%的占空比
        pwm.set_duty(Channel::CH1, max_duty / 3);
        // 使能通道
        pwm.enable(Channel::CH1);
        // 開始計數器
        pwm.start();
    
        loop {
            Timer::after_secs(1).await;
        }
    }

    運行: 
    cargo r --example embassy_pwm?
聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關注 13
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 久久精品亚洲精品无码金尊 | 国产成人午夜片在线观看高清观看 | 大地资源二在线观看官网 | 中文字幕第一区二区 | 日本在线看片免费人成视频 | 清纯女学生强制中出在线观看 | 偷窥xxxx盗摄国产 | 一本大道香蕉久在线播放29 | 国产实拍会所女技师在线观看 | 国产乱子伦视频大全 | 无码成人精品区在线观看 | 少妇翘臀亚洲精品av图片 | 篱笆女人狗电视连续剧第一部 | 国产一级片网站 | 成人av免费观看 | 九九夜夜 | 免费国产女王调教在线视频 | aⅴ日本亚洲欧洲免费天堂 2019中文字幕久久 | 四虎影视在线影院在线观看 | 国产欧美色一区二区三区 | 的九一视频入口在线观看 | 久久精品一二 | 人妻系列无码专区无码专区 | 91亚洲国产在人线播放午夜 | 亚洲国产成人精品无色码 | 欧美日产国产新一区 | 91久久精品国产91久久性色也 | 亚洲xxxx天美 | 高清视频一区 | 欧美精品无码一区二区三区 | 成人亚洲在线 | 美女内射无套日韩免费播放 | 丁香五月欧美成人 | 亚洲成人aa | 好爽好大久久久级淫片毛片小说 | 久久久久久久免费视频 | 绿帽在线 | 亚洲欧美一区二区三区色吧 | 92国产精品午夜福利免费 | 欧美一级鲁丝片 | 99视频在线精品 |