Rust嵌入式开发库rp2040-hal-macros的使用:Raspberry Pi Pico RP2040芯片HAL宏与硬件抽象层支持

rp2040-hal-macros

用于rp2040-hal的宏。

Entry宏

cortex-m-rt#[entry]的扩展,带有rp2040特定的初始化代码。目前它只是在调用入口函数之前解锁所有自旋锁。

许可证

可以选择以下任一许可证:

  • Apache License, Version 2.0 (APACHE2.0)
  • MIT license (MIT)

贡献

除非您明确说明,否则您有意提交的贡献将被视为上述双重许可,无需任何附加条款或条件。

安装

在项目目录中运行以下Cargo命令:

cargo add rp2040-hal-macros

或在Cargo.toml中添加:

rp2040-hal-macros = "0.1.0"

完整示例代码

// 使用rp2040-hal-macros的示例代码
#![no_std]
#![no_main]

use cortex_m_rt::entry;
use rp2040_hal_macros::entry;  // 导入rp2040特定的entry宏
use panic_halt as _;

// 使用#[rp2040_hal_macros::entry]替代标准#[entry]
#[rp2040_hal_macros::entry]
fn main() -> ! {
    // 初始化代码
    // 这里会自动解锁所有自旋锁
    
    // 主循环
    loop {
        // 你的应用代码
    }
}

这个示例展示了如何使用rp2040-hal-macros中的#[entry]宏来初始化Raspberry Pi Pico RP2040芯片。该宏会在调用你的主函数之前处理一些RP2040特定的初始化工作,特别是解锁所有自旋锁。

注意:实际使用时需要配合其他rp2040-hal库功能一起使用。

更完整示例代码

// 更完整的RP2040 HAL宏使用示例
#![no_std]
#![no_main]

// 引入必要的库
use cortex_m_rt::entry;
use rp2040_hal_macros::entry; // 导入RP2040特定的entry宏
use panic_halt as _; // 简易panic处理
use rp2040_hal::{
    clocks::init_clocks_and_plls,
    gpio::Pins,
    pac,
    sio::Sio,
    watchdog::Watchdog,
};

// RP2040硬件启动设置
#[rp2040_hal_macros::entry]
fn main() -> ! {
    // 获取外围设备
    let mut pac = pac::Peripherals::take().unwrap();
    let core = pac::CorePeripherals::take().unwrap();
    
    // 初始化SIO
    let sio = Sio::new(pac.SIO);
    
    // 设置时钟
    let mut watchdog = Watchdog::new(pac.WATCHDOG);
    let clocks = init_clocks_and_plls(
        rp2040_hal::XOSC_CRYSTAL_FREQ,
        pac.XOSC,
        pac.CLOCKS,
        pac.PLL_SYS,
        pac.PLL_USB,
        &mut pac.RESETS,
        &mut watchdog,
    )
    .ok()
    .unwrap();

    // 初始化GPIO引脚
    let _pins = Pins::new(
        pac.IO_BANK0,
        pac.PADS_BANK0,
        sio.gpio_bank0,
        &mut pac.RESETS,
    );

    // 主程序循环
    loop {
        // 在这里添加你的应用代码
        // 例如闪烁LED或读取传感器
    }
}

这个更完整的示例展示了如何结合rp2040-hal-macrosrp2040-hal库来初始化RP2040芯片的全部主要功能。它包括了:

  1. 时钟系统初始化
  2. 看门狗设置
  3. GPIO引脚初始化
  4. 基本程序结构

使用时需要确保你的Cargo.toml中包含了所有必要的依赖项。


1 回复

Rust嵌入式开发库rp2040-hal-macros的使用:Raspberry Pi Pico RP2040芯片HAL宏与硬件抽象层支持

简介

rp2040-hal-macros 是 Rust 嵌入式生态系统中的一个关键库,专门为 Raspberry Pi Pico 的 RP2040 微控制器提供硬件抽象层(HAL)的宏支持。这个库是 rp2040-hal 的一部分,提供了方便的宏来简化嵌入式开发流程。

该库主要功能包括:

  • 提供入口点宏定义嵌入式程序
  • 简化中断处理程序的定义
  • 提供硬件相关的便捷宏

使用方法

基本设置

首先需要在 Cargo.toml 中添加依赖:

[dependencies]
rp2040-hal-macros = "0.2"

主要宏介绍

1. entry!

定义程序的入口点:

use rp2040_hal_macros::entry;

#[entry]
fn main() -> ! {
    // 你的嵌入式应用程序代码
    loop {}
}

2. 中断处理宏

定义中断处理函数:

use rp2040_hal_macros::interrupt;

#[interrupt]
fn TIMER_IRQ_0() {
    // 定时器中断处理代码
}

3. 外设访问宏

提供对外设的便捷访问:

use rp2040_hal_macros::peripherals;

peripherals! {
    // 声明要使用的外设
    SIO,
    PADS_BANK0,
    IO_BANK0,
};

完整示例

下面是一个使用 rp2040-hal-macros 的完整示例,实现 LED 闪烁:

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use panic_halt as _;
use rp2040_hal_macros::{entry, interrupt};
use rp2040_hal::{
    clocks::{init_clocks_and_plls, Clock},
    pac,
    sio::Sio,
    watchdog::Watchdog,
};
use embedded_hal::digital::v2::OutputPin;

#[entry]
fn main() -> ! {
    let mut pac = pac::Peripherals::take().unwrap();
    let core = pac::CorePeripherals::take().unwrap();
    let mut watchdog = Watchdog::new(pac.WATCHDOG);
    let sio = Sio::new(pac.SIO);

    // 外部时钟为12MHz
    let external_xtal_freq_hz = 12_000_000u32;
    let clocks = init_clocks_and_plls(
        external_xtal_freq_hz,
        pac.XOSC,
        pac.CLOCKS,
        pac.PLL_SYS,
        pac.PLL_USB,
        &mut pac.RESETS,
        &mut watchdog,
    )
    .ok()
    .unwrap();

    let pins = rp2040_hal::gpio::Pins::new(
        pac.IO_BANK0,
        pac.PADS_BANK0,
        sio.gpio_bank0,
        &mut pac.RESETS,
    );

    let mut led_pin = pins.gpio25.into_push_pull_output();
    
    loop {
        led_pin.set_high().unwrap();
        cortex_m::asm::delay(1_000_000);
        led_pin.set_low().unwrap();
        cortex_m::asm::delay(1_000_000);
    }
}

#[interrupt]
fn TIMER_IRQ_0() {
    // 定时器中断处理
}

高级用法

自定义中断优先级

use rp2040_hal_macros::interrupt;

#[interrupt(priority = 2)]
fn USBCTRL_IRQ() {
    // USB中断处理,优先级为2
}

多个中断处理

#[interrupt]
fn TIMER_IRQ_0() {
    // 定时器0中断
}

#[interrupt]
fn TIMER_IRQ_1() {
    // 定时器1中断
}

注意事项

  1. 使用这些宏时,确保你的项目配置了正确的目标 (thumbv6m-none-eabi)
  2. 需要配合 cortex-m-rtrp2040-hal 使用
  3. 宏展开后的代码依赖于特定的硬件抽象层实现,确保版本兼容性

通过使用 rp2040-hal-macros,开发者可以更专注于业务逻辑,而不必处理底层的硬件细节,大大提高了开发效率和代码可维护性。

完整示例代码

以下是一个更完整的示例,展示了如何使用 rp2040-hal-macros 创建一个简单的 LED 闪烁应用,并添加了串口打印功能:

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use panic_halt as _;
use rp2040_hal_macros::{entry, interrupt};
use rp2040_hal::{
    clocks::{init_clocks_and_plls, Clock},
    pac,
    sio::Sio,
    watchdog::Watchdog,
    gpio::Pins,
    uart::{UartConfig, BaudRate, DataBits, StopBits, UartPeripheral},
};
use embedded_hal::digital::v2::OutputPin;
use core::fmt::Write;

#[entry]
fn main() -> ! {
    // 获取外设实例
    let mut pac = pac::Peripherals::take().unwrap();
    let core = pac::CorePeripherals::take().unwrap();
    let mut watchdog = Watchdog::new(pac.WATCHDOG);
    let sio = Sio::new(pac.SIO);

    // 初始化时钟和PLL
    let external_xtal_freq_hz = 12_000_000u32;
    let clocks = init_clocks_and_plls(
        external_xtal_freq_hz,
        pac.XOSC,
        pac.CLOCKS,
        pac.PLL_SYS,
        pac.PLL_USB,
        &mut pac.RESETS,
        &mut watchdog,
    )
    .ok()
    .unwrap();

    // 初始化GPIO
    let pins = Pins::new(
        pac.IO_BANK0,
        pac.PADS_BANK0,
        sio.gpio_bank0,
        &mut pac.RESETS,
    );

    // 设置LED引脚(GPIO25)为输出
    let mut led_pin = pins.gpio25.into_push_pull_output();

    // 初始化UART (GPIO0为TX,GPIO1为RX)
    let uart = UartPeripheral::new(
        pac.UART0,
        (pins.gpio0.into_mode(), pins.gpio1.into_mode()),
        &mut pac.RESETS,
    )
    .enable(
        UartConfig::new(
            BaudRate::BAUD_115200,
            DataBits::Eight,
            None,
            StopBits::One,
        ),
        clocks.system_clock.freq(),
    );

    // 通过串口发送启动消息
    writeln!(uart, "RP2040 HAL Macros 示例启动").unwrap();

    let mut counter = 0;
    loop {
        // LED闪烁
        led_pin.set_high().unwrap();
        cortex_m::asm::delay(500_000);
        led_pin.set_low().unwrap();
        cortex_m::asm::delay(500_000);

        // 每闪烁5次通过串口发送计数
        counter += 1;
        if counter % 5 == 0 {
            writeln!(uart, "LED已闪烁 {} 次", counter).unwrap();
        }
    }
}

#[interrupt]
fn TIMER_IRQ_0() {
    // 定时器中断处理
}

这个示例扩展了基本功能,添加了:

  1. UART串口通信功能
  2. 通过串口打印启动消息
  3. 记录LED闪烁次数并通过串口定期输出
  4. 更详细的初始化过程注释

您可以根据实际需求修改这个示例,添加更多功能如ADC读取、PWM输出等。

回到顶部