首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法修改rp2040上的外围寄存器

无法修改rp2040上的外围寄存器
EN

Stack Overflow用户
提问于 2022-06-14 10:15:17
回答 1查看 130关注 0票数 1

我在挠头,因为我不能写和读一些/大多数外围寄存器。这里我使用的是Rust和rp2040-hal中的设置代码。

以下代码尝试将0x42写入DMA的CH0_READ_ADDR寄存器(0x50000000)并将其读取:

代码语言:javascript
复制
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());
}

这一产出如下:

代码语言:javascript
复制
ptr 0x50000000
reg_before 0
reg_after 0

这发生在我测试过的几个寄存器中。但是,使用看门狗的划痕寄存器WATCHDOG_SCRATCH0 (0x4005800c) (如数据表第19页上的示例所示),一切都按预期工作。

我想,也许外围设备没有时钟之类的,但是我在数据表中没有发现任何有用的东西。也许有人对这里出了什么问题有个想法。

最小工作实例:

代码语言:javascript
复制
#![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 {
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-14 13:27:01

好的,发现:这是关于芯片的重置。

数据表在2.14.1中声明:

由复位控制器进行的每一次外围复位都在开机时进行复位.这取决于软件来降低它打算使用的外围设备的复位。

因此,在这种情况下,必须清除DMA寄存器的RESET位:

代码语言:javascript
复制
pac.RESETS.reset.modify(|_, w| w.dma().clear_bit());

然后,可以按预期的方式将寄存器写入和读取。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72615214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档