Rust嵌入式开发库atsame54_xpro的使用,针对ATSAME54微控制器的硬件抽象层(HAL)和外围设备驱动支持
SAM E54 Xplained Pro评估套件板级支持包
这个crate为SAM E54 Xplained Pro评估套件提供了一个类型安全的Rust API。
开发板特性
- Microchip ATSAME54P Cortex-M4F微控制器
- 1MB Flash
- 256kB SRAM (如果启用ECCRAM则为128kB)
- 8MB SPI Flash芯片
前提条件
- 安装交叉编译目标
rustup target add thumbv7em-none-eabihf
- 安装cargo-embed
cargo install cargo-embed
运行示例
- 检出atsamd仓库
- 进入目录
boards/atsame54_xpro
- 构建并烧录设备
- 例如:
cargo embed --release --example blinky_rtic
- 例如:
完整示例代码
以下是使用atsame54_xpro库实现LED闪烁的完整示例:
//! 使用ATSAME54 Xplained Pro开发板的LED闪烁示例
#![no_std]
#![no_main]
use atsame54_xpro as bsp;
use bsp::hal;
use hal::clock::GenericClockController;
use hal::delay::Delay;
use hal::entry;
use hal::pac::{CorePeripherals, Peripherals};
use hal::prelude::*;
#[entry]
fn main() -> ! {
// 获取外设和核心外设实例
let mut peripherals = Peripherals::take().unwrap();
let core = CorePeripherals::take().unwrap();
// 初始化时钟控制器
let mut clocks = GenericClockController::with_external_32kosc(
peripherals.GCLK,
&mut peripherals.MCLK,
&mut peripherals.OSC32KCTRL,
&mut peripherals.OSCCTRL,
&mut peripherals.NVMCTRL,
);
// 初始化延迟功能
let mut delay = Delay::new(core.SYST, &mut clocks);
// 初始化引脚
let pins = bsp::Pins::new(peripherals.PORT);
// 配置LED引脚为输出
let mut led = pins.led0.into_push_pull_output();
// 主循环 - LED闪烁
loop {
led.toggle().unwrap(); // 切换LED状态
delay.delay_ms(1000u16); // 延迟1秒
}
}
使用说明
- 将上述代码保存为
src/main.rs
- 在
Cargo.toml
中添加依赖:
[dependencies]
atsame54_xpro = "0.12.2"
- 使用以下命令编译并烧录:
cargo embed --release
这个示例展示了如何使用atsame54_xpro库的基本功能:
- 初始化时钟系统
- 配置GPIO引脚
- 控制LED闪烁
- 使用延迟功能
该库还支持ATSAME54微控制器的其他外设功能,包括:
- UART/SPI/I2C通信
- 定时器/PWM
- ADC/DAC
- 中断处理等
可以找到更多API使用示例和详细信息。
1 回复
Rust嵌入式开发库atsame54_xpro的使用指南
介绍
atsame54_xpro是一个针对Microchip ATSAME54微控制器系列的Rust硬件抽象层(HAL)库,提供了对该系列芯片外围设备的类型安全访问。这个库特别适合使用ATSAME54-XPRO开发板的开发者。
该库基于embedded-hal和atsamd-hal构建,提供了对ATSAME54系列MCU的完整支持,包括GPIO、UART、SPI、I2C、PWM、ADC等常用外设的驱动。
主要特性
- 类型安全的硬件抽象
- 支持ATSAME54系列所有外设
- 基于embedded-hal标准特性
- 时钟配置和电源管理支持
- 中断处理支持
- 丰富的示例代码
使用方法
1. 添加依赖
在Cargo.toml中添加依赖:
[dependencies]
atsame54_xpro = "0.1"
cortex-m = "0.7"
cortex-m-rt = "0.7"
2. 基本设置示例
#![no_std]
#![no_main]
use atsame54_xpro as hal;
use hal::pac;
use hal::clock::GenericClockController;
use hal::delay::Delay;
use hal::prelude::*;
use hal::entry;
#[entry]
fn main() -> ! {
let mut peripherals = pac::Peripherals::take().unwrap();
let mut core = pac::CorePeripherals::take().unwrap();
let mut clocks = GenericClockController::with_internal_32kosc(
peripherals.GCLK,
&mut peripherals.MCLK,
&mut peripherals.OSC32KCTRL,
&mut peripherals.OSCCTRL,
&mut peripherals.NVMCTRL,
);
let mut delay = Delay::new(core.SYST, &mut clocks);
loop {
delay.delay_ms(1000u16);
// 你的代码
}
}
3. GPIO使用示例
use hal::gpio::{self, IntoPushPullOutput};
// 初始化GPIO
let pins = hal::Pins::new(peripherals.PORT);
let mut led = pins.pa15.into_push_pull_output();
// 控制LED
loop {
led.set_high().unwrap();
delay.delay_ms(500u16);
led.set_high().unwrap();
delay.delay_ms(500u16);
}
4. UART通信示例
use hal::sercom::{uart, Sercom0};
use hal::gpio::v2::{PA08, PA09};
// 配置UART引脚
let tx_pin = pins.pa08;
let rx_pin = pins.pa09;
// 创建UART实例
let uart = uart::Config::new(
peripherals.SERCOM0,
(tx极in, rx_pin),
115200.hz(),
&mut clocks,
&mut peripherals.MCLK,
).unwrap();
// 发送数据
uart.write(b"Hello, ATSAME54!\r\n").unwrap();
// 接收数据
let mut buffer = [0u8; 32];
let bytes_read = uart.read(&mut buffer).unwrap();
5. SPI通信示例
use hal::sercom::{spi, Sercom1};
use hal::gpio::v2::{PA16, PA17, PA19};
// 配置SPI引脚
let sck = pins.pa17;
let mosi = pins.pa16;
let miso = pins.pa19;
// 创建SPI实例
let mut spi = spi::Config::new(
peripherals.SERCOM1,
(sck, mosi, miso),
spi::MODE_0,
1.mhz(),
&mut clocks,
&mut peripherals.MCLK,
).unwrap();
// SPI传输
let write = [0x01, 0x02, 0x03];
let mut read = [0u8; 3];
spi.transfer(&mut read, &write).unwrap();
6. I2C通信示例
use hal::sercom::{i2c, Sercom2};
use hal::gpio::v2::{PA12, PA13};
// 配置I2C引脚
let sda = pins.pa12;
let scl = pins.pa13;
// 创建I2C实例
let mut i2c = i2c::Config::new(
peripherals.SERCOM2,
(sda, scl),
100.khz(),
&mut clocks,
&mut peripherals.MCLK,
).unwrap();
// I2C读写
let address = 0x42;
let write_data = [0x01, 0x02];
i2c.write(address, &write_data).unwrap();
let mut read极ta = [0u8; 2];
i2c.read(address, &mut read_data).unwrap();
完整示例:LED闪烁与UART通信
#![no_std]
#![no_main]
use atsame54_xpro as hal;
use hal::{
clock::GenericClockController,
delay::Delay,
gpio::{self, IntoPushPullOutput},
pac,
prelude::*,
sercom::{uart, Sercom0},
};
use hal::{entry, gpio::v2::{PA08, PA09}};
#[entry]
fn main() -> ! {
// 获取外设实例
let mut peripherals = pac::Peripherals::take().unwrap();
let mut core = pac::CorePeripherals::take().unwrap();
// 配置时钟
let mut clocks = GenericClockController::with_internal_32kosc(
peripherals.GCLK,
&mut peripherals.MCLK,
&mut peripherals.OSC32KCTRL,
&mut peripherals.OSCCTRL,
&mut peripherals.NVMCTRL,
);
// 初始化延时
let mut delay = Delay::new(core.SYST, &mut clocks);
// 初始化GPIO
let pins = hal::Pins::new(peripherals.PORT);
let mut led = pins.pa15.into_push_pull_output();
// 配置UART引脚
let tx_pin = pins.pa08;
let rx_pin = pins.pa09;
// 创建UART实例
let uart = uart::Config::new(
peripherals.SERCOM0,
(tx_pin, rx_pin),
115200.hz(),
&mut clocks,
&mut peripherals.MCLK,
).unwrap();
// 主循环
loop {
// LED闪烁
led.set_high().unwrap();
delay.delay_ms(500u16);
led.set_low().unwrap();
delay.delay_ms(500u16);
// UART发送消息
uart.write(b"LED toggled!\r\n").unwrap();
}
}
高级功能
中断处理
use cortex_m::peripheral::NVIC;
use hal::pac::interrupt;
// 定义中断处理函数
#[interrupt]
fn SERCOM0() {
// 处理SERCOM0中断
}
// 启用中断
unsafe {
NVIC::unmask(pac::Interrupt::SERCOM0);
}
PWM输出
use hal::pwm::{Pwm0, Channel};
use hal::gpio::v2::PA14;
// 配置PWM引脚
let pwm_pin = pins.pa14;
// 创建PWM实例
let mut pwm = Pwm0::new(
peripherals.TCC0,
pwm::TC0_WO4,
pwm::Prescaler::DIV64,
&mut clocks,
&mut peripherals.MCLK,
);
// 设置PWM参数
let max_duty = pwm.get_max_duty();
pwm.set_duty(Channel::_0, max_duty / 2);
pwm.enable(Channel::_0);
开发建议
- 参考ATSAME54-XPRO开发板的原理图确定引脚分配
- 使用
cargo doc --open
查看详细的API文档 - 从官方示例代码开始修改
- 使用
defmt
或rtt-target
进行调试输出 - 注意电源管理和时钟配置对性能的影响