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秒
    }
}

使用说明

  1. 将上述代码保存为src/main.rs
  2. Cargo.toml中添加依赖:
[dependencies]
atsame54_xpro = "0.12.2"
  1. 使用以下命令编译并烧录:
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);

开发建议

  1. 参考ATSAME54-XPRO开发板的原理图确定引脚分配
  2. 使用cargo doc --open查看详细的API文档
  3. 从官方示例代码开始修改
  4. 使用defmtrtt-target进行调试输出
  5. 注意电源管理和时钟配置对性能的影响
回到顶部