嵌入式异步框架 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;支…