我在挠头,因为我不能写和读一些/大多数外围寄存器。这里我使用的是Rust和rp2040-hal中的设置代码。
以下代码尝试将0x42写入DMA的CH0_READ_ADDR寄存器(0x50000000)并将其读取:
let ptr = (0x50000000 + 0x000) as *mut u16; // crtl
rprintln!("ptr {:p}", ptr);
unsafe {
rprintln!("reg_before {:b}", ptr.read_volatile());
ptr.write(0x42);
rprintln!("reg_after {:b}", ptr.read_volatile());
}这一产出如下:
ptr 0x50000000
reg_before 0
reg_after 0这发生在我测试过的几个寄存器中。但是,使用看门狗的划痕寄存器WATCHDOG_SCRATCH0 (0x4005800c) (如数据表第19页上的示例所示),一切都按预期工作。
我想,也许外围设备没有时钟之类的,但是我在数据表中没有发现任何有用的东西。也许有人对这里出了什么问题有个想法。
最小工作实例:
#![no_std]
#![no_main]
extern crate panic_rtt_target;
use cortex_m_rt::entry;
use rtt_target::{rprintln, rtt_init_print};
use rp2040_hal as hal;
use hal::pac;
use embedded_time::fixed_point::FixedPoint;
use rp2040_hal::clocks::Clock;
#[link_section = ".boot2"]
#[used]
pub static BOOT2: [u8; 256] = rp2040_boot2::BOOT_LOADER_W25Q080;
const XTAL_FREQ_HZ: u32 = 12_000_000u32;
#[entry]
fn entry() -> ! {
let mut pac = pac::Peripherals::take().unwrap();
let core = pac::CorePeripherals::take().unwrap();
let mut watchdog = hal::Watchdog::new(pac.WATCHDOG);
let clocks = hal::clocks::init_clocks_and_plls(
XTAL_FREQ_HZ,
pac.XOSC,
pac.CLOCKS,
pac.PLL_SYS,
pac.PLL_USB,
&mut pac.RESETS,
&mut watchdog,
)
.ok()
.unwrap();
rtt_init_print!();
rprintln!("Hello registers!");
//let ptr = (0x4005800c) as *mut u16; // scratchreg
let ptr = (0x50000000 + 0x000) as *mut u16; // dma ch0 read addr
rprintln!("ptr {:p}", ptr);
unsafe {
rprintln!("reg_before {:b}", ptr.read_volatile());
ptr.write(0x42);
rprintln!("reg_after {:b}", ptr.read_volatile());
}
loop {
}
}发布于 2022-06-14 13:27:01
好的,发现:这是关于芯片的重置。
数据表在2.14.1中声明:
由复位控制器进行的每一次外围复位都在开机时进行复位.这取决于软件来降低它打算使用的外围设备的复位。
因此,在这种情况下,必须清除DMA寄存器的RESET位:
pac.RESETS.reset.modify(|_, w| w.dma().clear_bit());然后,可以按预期的方式将寄存器写入和读取。
https://stackoverflow.com/questions/72615214
复制相似问题