6个版本 (3个重大更新)
0.4.0 | 2024年4月28日 |
---|---|
0.3.0 | 2024年4月17日 |
0.2.0 | 2024年2月11日 |
0.1.2 |
|
0.1.1 | 2024年1月18日 |
#533 在 嵌入式开发
每月473次下载
255KB
6K SLoC
JH71xx-HAL
jh71xx-hal
是 StarFive 基于 JH71xx 的 SoC 的 HAL(硬件抽象层)crate。
目前,仅支持 JH7110
SoC。 JH7100
似乎已停产,StarFive 的下一款 SoC 系列将是 JH81xx
系列。
如果您想添加对 JH7100
SoC 的支持,请提交更改!
用法
GPIO
完全支持GPIO配置和访问
use jh71xx_hal::{pac, gpio};
use embedded_hal::digital::{InputPin, OutputPin};
let dp = pac::Peripherals::take().unwrap();
let gpio0 = gpio::get_gpio(dp.sys_pinctrl.gpio_0());
// Configure as an enabled output
let mut gpio0_out = gpio0.into_enabled_output();
// Drive pin high
gpio0_out.set_high();
// Drive pin low
gpio0_out.set_low();
// Configure as an enabled input
let gpio0_in = gpio0_out.into_enabled_input();
// Configure as high-impedance input
let gpio0_in_high_z = gpio0_in.into_input_high_z();
// Configure as pull-up input
let gpio0_in_pull_up = gpio0_in_high_z.into_input_pull_up();
// Configure as pull-down input
let mut gpio0_in_pull_down = gpio0_in_pull_up.into_input_pull_down();
// Is pin low?
if gpio0_in_pull_down.is_low() {
// do interesting GPIO stuff
}
// Is pin high?
if gpio0_in_pull_down.is_high() {
// do interesting GPIO stuff
}
WIP:GPIO
JH7110
SoC 使用引脚复用器来配置引脚以实现专用功能(I2C、SPI等)。
正在进行工作,以提供用于配置GPIO引脚的专用功能的高级接口。
目前可以通过重导出为 jh71xx_hal::pac
的 jh71xx-pac
crate 来实现低级配置。
I2C
完全支持I2C配置和访问。
use embedded_hal::i2c::{I2c as _, Operation};
use jh71xx_hal::{pac, i2c};
let dp = pac::Peripherals::take().unwrap();
let mut i2c0 = i2c::I2c::new(dp.i2c0);
// 7-bit address
let addr: u8 = 1;
let mut read_buf = [0u8; 1];
let ops = Operation::Read(&mut read_buf);
i2c0.transaction(addr, &mut [ops]).unwrap();
// 10-bit address
let addr: u16 = 1;
i2c0.transaction(addr, &mut [ops]).unwrap();
SPI
完全支持SPI配置和访问。
use embedded_hal::spi::SpiBus;
use jh71xx_hal::{pac, spi};
let dp = pac::Peripherals::take().unwrap();
// 8-bit transactions
let mut spi0 = spi::Spi::<pac::Spi0, 8>::new(dp.spi0).unwrap();
let mut read_buf = [0u8; 1];
let write_buf = [0u8; 1];
// Read and write as separate transactions
spi0.read(read_buf.as_mut()).unwrap();
spi0.write(write_buf.as_ref()).unwrap();
// Read and write in the same call
spi0.transfer(read_buf.as_mut(), write_buf.as_ref()).unwrap();
// Write and read from the same buffer
// NOTE: writes happen first, since the read overwrites the buffer
spi0.transfer_in_place(read_buf.as_mut()).unwrap();
// Flushes read/write FIFOs, and waits for peripheral to become idle
spi0.flush().unwrap();
// 16-bit transactions
let mut spi1 = spi::Spi::<pac::Spi1, 16>::new(dp.spi1).unwrap();
let mut read_buf = [0u16; 1];
let write_buf = [0u16; 1];
// Read and write as separate transactions
spi1.read(read_buf.as_mut()).unwrap();
spi1.write(write_buf.as_ref()).unwrap();
// Read and write in the same call
spi1.transfer(read_buf.as_mut(), write_buf.as_ref()).unwrap();
// Write and read from the same buffer
// NOTE: writes happen first, since the read overwrites the buffer
spi1.transfer_in_place(read_buf.as_mut()).unwrap();
// Flushes read/write FIFOs, and waits for peripheral to become idle
spi1.flush().unwrap();
WIP:SPI
目前仅支持8位和16位传输。SoC的外设支持4位到16位传输。
TBD:接口是否应支持
- 打包数据传输以提高效率(但增加了复杂性)
- 未打包传输以提高简单性(但降低了效率)
无论如何,都可以在不更改当前API的情况下支持额外的数据大小。
ARM pl022 SSP SPI外设还支持“从”模式,它超出了 embedded-hal
traits 的范围,但对 jh71xx-hal
用户可能仍然有用。
同样,该外设还支持德州仪器的同步串行和微线串行帧格式(目前不支持)。
PWM
完全支持PWM配置和访问。
use embedded_hal::pwm::SetDutyCycle;
use jh71xx_hal::{pac, pwm};
let dp = pac::Peripherals::take().unwrap();
let mut pwm0 = pwm::Pwm::new(dp.pwm);
// Gets the maximum duty cycle
let max_cycle = pwm0.max_duty_cycle();
// Sets the PWM peripheral to a ~50% duty cycle
pwm0.set_duty_cycle(max_cycle / 2).unwrap();
依赖关系
约10MB
约213K SLoC