Embassy實戰:Rust嵌入式異步開發指南

嵌入式異步框架 Embassy 實例

以下是關于嵌入式異步框架 Embassy 的實用示例,涵蓋常見外設操作、多任務協作和硬件交互場景。示例基于STM32和Raspberry Pi Pico等平臺,使用Rust語言編寫。

GPIO 控制

use embassy_stm32::gpio::{Input, Output, Pull, Speed};
use embassy_stm32::peripherals::PA5;// 配置GPIO輸出
async fn blink_led(pin: PA5) {let mut led = Output::new(pin, Speed::Low);loop {led.set_high();embassy_time::Timer::after_secs(1).await;led.set_low();embassy_time::Timer::after_secs(1).await;}
}

中斷處理

use embassy_stm32::exti::ExtiInput;
use embassy_stm32::gpio::Input;// 配置外部中斷
async fn button_interrupt(pin: impl Peripheral<P = impl InputPin>) {let button = Input::new(pin, Pull::Up);let mut exti = ExtiInput::new(button, EXTI0);loop {exti.wait_for_falling_edge().await;defmt::println!("Button pressed!");}
}

串口通信

use embassy_stm32::usart::{Uart, Config};
use embassy_stm32::peripherals::USART1;// 異步串口回顯
async fn uart_echo(usart: USART1, tx: impl Pin, rx: impl Pin) {let mut uart = Uart::new(usart, tx, rx, Config::default());let mut buf = [0; 8];loop {uart.read(&mut buf).await.unwrap();uart.write(&buf).await.unwrap();}
}

定時器PWM輸出

use embassy_stm32::pwm::Pwm;
use embassy_stm32::time::hz;// 配置PWM輸出
async fn pwm_control(tim: impl Peripheral<P = impl PwmPin>) {let mut pwm = Pwm::new(tim, hz(1000));pwm.set_max_duty(1000);loop {for duty in 0..=1000 {pwm.set_duty(duty);embassy_time::Timer::after_millis(10).await;}}
}

SPI 數據傳輸

use embassy_stm32::spi::Spi;
use embassy_stm32::peripherals::SPI1;// SPI讀取傳感器數據
async fn read_spi_sensor(spi: SPI1, sck: impl Pin, mosi: impl Pin, miso: impl Pin) {let mut spi = Spi::new(spi, sck, mosi, miso, Config::default());let mut buf = [0; 2];loop {spi.transfer(&mut buf).await.unwrap();defmt::println!("Sensor value: {}", buf[0] as u16 | ((buf[1] as u16) << 8));embassy_time::Timer::after_secs(1).await;}
}

I2C 設備訪問

use embassy_stm32::i2c::I2c;
use embassy_stm32::peripherals::I2C1;// I2C讀取溫濕度傳感器
async fn read_i2c_sensor(i2c: I2C1, sda: impl Pin, scl: impl Pin) {let mut i2c = I2c::new(i2c, scl, sda, Config::default());let mut buf = [0; 4];loop {i2c.write_read(0x40, &[0xE3], &mut buf).await.unwrap();defmt::println!("Temperature: {}", f32::from_be_bytes(buf));embassy_time::Timer::after_secs(2).await;}
}

多任務協作

use embassy_executor::Spawner;// 啟動并發任務
#[embassy_executor::main]
async fn main(spawner: Spawner) {spawner.spawn(blink_led()).unwrap();spawner.spawn(button_interrupt()).unwrap();spawner.spawn(uart_echo()).unwrap();
}

看門狗配置

use embassy_stm32::wdg::IndependentWatchdog;// 初始化獨立看門狗
async fn init_watchdog() {let mut wdt = IndependentWatchdog::new(IWDG, 2_000_000);wdt.start();loop {wdt.pet();embassy_time::Timer::after_secs(1).await;}
}

DMA 數據傳輸

use embassy_stm32::dma::NoDma;
use embassy_stm32::usart::UartTx;// 使用DMA的串口發送
async fn dma_uart_send(usart: USART1, tx: impl Pin, dma: impl Peripheral) {let mut uart = UartTx::new(usart, tx, NoDma, Config::default());let data = b"Hello DMA!\r\n";loop {uart.write(&data).await.unwrap();embassy_time::Timer::after_secs(1).await;}
}

ADC 采樣

use embassy_stm32::adc::Adc;
use embassy_stm32::peripherals::ADC1;// 多通道ADC采樣
async fn read_adc(adc: ADC1, pin1: impl Pin, pin2: impl Pin) {let mut adc = Adc::new(adc, &mut Delay);let mut ch1 = adc.enable_pin(pin1);let mut ch2 = adc.enable_pin(pin2);loop {let v1 = adc.read(&mut ch1).await.unwrap();let v2 = adc.read(&mut ch2).await.unwrap();defmt::println!("ADC1: {}, ADC2: {}", v1, v2);embassy_time::Timer::after_millis(500).await;}
}

定時器編碼器模式

use embassy_stm32::timer::Encoder;// 讀取編碼器值
async fn read_encoder(tim: impl TimerWithEncoder) {let mut enc = Encoder::new(tim);loop {let count = enc.read_count();defmt::println!("Encoder: {}", count);embassy_time::Timer::after_millis(100).await;}
}

USB CDC 虛擬串口

use embassy_stm32::usb::Driver;
use embassy_usb::class::cdc_acm;// USB串口回顯
async fn usb_cdc_echo(driver: Driver<'static>) {let mut usb = embassy_usb::Builder::new(driver);let mut class = cdc_acm::Builder::new().build(&mut usb);usb.build().await;let mut buf = [0; 64];loop {let n = class.read(&mut buf).await.unwrap();class.write(&buf[..n]).await.unwrap()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90139.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ChatGPT桌面版深度解析

ChatGPT桌面版深度解析&#xff1a;功能、安裝與高效使用全攻略 一、核心功能全景解析 &#xff08;一&#xff09;全場景交互體系 全局熱鍵喚醒 支持MacOS&#xff08;Option空格&#xff09;與Windows&#xff08;Alt空格&#xff09;全局快捷鍵&#xff0c;實現跨應用無縫調…

RLVR的一種擴展方案--RLPR論文閱讀

論文鏈接&#xff1a;RLPR: EXTRAPOLATING RLVR TO GENERAL DOMAINS WITHOUT VERIFIERS 文章目錄簡介RLPRRLVR概率獎勵/Probability Reward獎勵設計標準差過濾總結簡介 可驗證獎勵的強化學習(Reinforcement Learning with Verifiable Rewards, RLVR)在提升大語言模型&#xff…

odoo歐度小程序——添加用戶

odoo歐度小程序添加登錄用戶 1. 直接在登錄用戶頁面添加用戶點擊 添加登錄用戶輸入用戶和密碼&#xff0c;點擊登錄驗證進入odoo頁面2. 在用戶切換頁面添加用戶點擊選擇切換用戶點擊域名彈出菜單點擊添加新用戶輸入用戶和密碼&#xff0c;點擊登錄驗證進入odoo頁面

Docker 應用數據備份、遷移方案

一、為什么要做Docker數據備份1、保障數據與配置的安全性防止數據丟失&#xff1a;Docker 容器本身是 “臨時性” 的&#xff08;基于鏡像創建&#xff0c;刪除后數據默認丟失&#xff09;&#xff0c;但容器中運行的應用&#xff08;如數據庫、日志服務&#xff09;會產生持久…

【PTA數據結構 | C語言版】強連通分量

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 本題請你編寫程序&#xff0c;輸出給定有向圖中的各個強連通分量&#xff0c;并統計強連通分量的個數。 輸入格式&#xff1a; 輸入首先在第一行給出 2 個整數&#xff0c;依次為有向圖的頂點數 n&…

idea部署新項目時,用自定義的maven出現的問題解決

出現這個問題是因為maven版本和idea版本不兼容&#xff0c;例如圖示是maven3.9和idea2021.3的版本不兼容&#xff0c;maven換成3.8.x即可解決

OCR 身份識別:讓身份信息錄入場景更高效安全

在銀行柜臺開戶、線上平臺實名認證等場景中&#xff0c;身份信息錄入是基礎環節&#xff0c;OCR 身份識別產品正成為提升效率與安全性的關鍵。?傳統人工錄入身份證信息&#xff0c;不僅耗時久&#xff0c;還易因手誤導致姓名、號碼出錯&#xff0c;影響業務辦理進度。而 OCR 身…

Web 服務器和Web 中間件

一、什么是 Web 中間件 Web 中間件&#xff08;Web Middleware&#xff09;是運行在 Web 服務器與實際業務程序之間的一層“膠水”軟件&#xff0c;用來統一處理公共事務&#xff0c;讓開發者專注寫業務邏輯。常見職責&#xff1a; 請求/響應攔截&#xff08;鑒權、日志、跨域、…

Paimon的部分更新以及DeleteVector實現

背景 本文基于 Paimon 0.9 出于對與Paimon內部的DeleteVctor的實現以及部分更新的實現進行的源碼閱讀。 關于 DeleteVector的介紹可以看這里 說明 對于Paimon來說無論是Spark中使用還是Flink使用&#xff0c;后面的邏輯都是一樣的&#xff0c;所以我們以Spark為例來說。所以…

Redis 的事務機制是怎樣的?

Redis 的事務機制 Redis支持事務機制,其主要目的是確保多個命令執行的原子性,即這些命令會作為一個不可分割的操作單元執行。 需要注意的是,Redis事務不支持回滾操作。從Redis 2.6.5版本開始,服務器會在命令累積階段檢測錯誤。在執行EXEC命令時,若發現錯誤則會拒絕執行事…

網安學習NO.17

1. VPN 概述定義&#xff1a;在公用網絡&#xff08;如 Internet、幀中繼、ATM 等&#xff09;中&#xff0c;通過技術手段虛擬出的一條企業內部專線&#xff0c;能像私有網絡一樣提供安全性、可靠性和可管理性。核心特征&#xff1a;利用公共網絡構建&#xff0c;具備 “虛擬性…

MCU芯片AS32S601在衛星光纖放大器(EDFA)中的應用探索

摘要&#xff1a;本文聚焦于國科安芯推出的AS32S601型MCU芯片在衛星光纖放大器&#xff08;EDFA&#xff09;中的潛在應用&#xff0c;探討其技術特性、抗輻射性能及適用性。通過分析其在單粒子效應脈沖激光試驗中的表現&#xff0c;結合EDFA系統對控制芯片的要求&#xff0c;評…

Hexo - 免費搭建個人博客02 - 創建個人博客

導言我的博客&#xff1a;https://q164129345.github.io/ 開始一步一步地完成博客的創建。 一、初始化Hexo博客以上所示&#xff0c;運行以下指令在myCode文件夾里初始化一個hexo博客。 hexo init myblog二、安裝依賴如上所示&#xff0c;完成依賴的安裝。 cd myblog npm insta…

單片機-----基礎知識整合

一、基礎知識1&#xff09;單片機的組成&#xff1a;中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、定時器、多種I/O接口、中斷系統等2&#xff09;STM32U575RIT6采用ARM Cortex-M33內核架構ARM是什么&#xff1f;①ARM是一家公司&#xff0c;ARM公司是一家芯片知識產權&#…

雙流join 、 Paimon Partial Update 和 動態schema

背景 Paimon 通過其獨特的 partial-update 合并引擎和底層的 LSM 存儲結構&#xff0c;巧妙地將傳統雙流 Join 中對 Flink State 的高頻隨機讀/寫&#xff0c;轉換為了對 Paimon 表的順序寫和后臺的高效合并&#xff0c;從而一站式地解決了 Flink 作業狀態過大、依賴外部 KV 系…

7.3.1 進程調度機制那些事兒

一&#xff1a;task_struct結構體分析 1、進程有兩種特殊形式&#xff1a;沒有用戶虛擬地址空間的進程叫內核線程&#xff0c;共享用戶虛擬地址空間的進程叫作用戶線程。共享同一個用戶虛擬地址空間的所有用戶線程叫線程組。 C語言標準庫進程 Linux內核進程 …

基于多種機器學習的水質污染及安全預測分析系統的設計與實現【隨機森林、XGBoost、LightGBM、SMOTE、貝葉斯優化】

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 隨著工業化和城市化的不斷推進&#xff0c;水質污染問題逐漸成為影響生態環境…

Linux第三天Linux基礎命令(二)

1.grep命令可以通過grep命令&#xff0c;從文件中通過關鍵字過濾文件行。grep [-n] 關鍵字 文件路徑選項-n&#xff0c;可選&#xff0c;表示在結果中顯示匹配的行的行號。參數&#xff0c;關鍵字&#xff0c;必填&#xff0c;表示過濾的關鍵字&#xff0c;帶有空格或其它特殊符…

Linux Debian操作系統、Deepin深度操作系統手動分區方案參考

以下是Linux Debian操作系統、Deepin深度操作系統安裝過程中手動分區的建議&#xff0c;按UEFI、swap、boot、根分區、home分區劃分&#xff0c;以下是詳細的分區配置參考建議&#xff1a; 一、手動分區方案&#xff08;UEFI模式&#xff09;分區名稱分區類型大小建議掛載點文件…

jmeter如何做自動化接口測試?

全網最全流程&#xff01;JmeterAntAllureJenkins搭建屬于你的接口自動化流水線&#xff0c;CI/CD直接起飛&#xff01;1.什么是jmeter&#xff1f; JMeter是100%完全由Java語言編寫的&#xff0c;免費的開源軟件&#xff0c;是非常優秀的性能測試和接口測試工具&#xff0c;支…