loop{
let mut cr_value =unsafe{ptr::read_volatile(register_rcc_cr).read()};
let is_25_bit_set = (cr_value & (1 << 25)) != 0;
let is_17_bit_set = (cr_value & (1 << 17)) != 0;
if is_25_bit_set && is_17_bit_set{
break;
}
}
let mut cr_value =unsafe{ptr::read_volatile(register_rcc_cr).read()};
defmt::println!("afterloop value: {:b}",cr_value);
let register_rcc_cfgr = unsafe{(RCC_BASE as *mut RW<u32>).offset(0x08 / 4)}; // GPIOC_MODER
let mut cfgr_sys_value = unsafe{ptr::read_volatile(register_rcc_cfgr).read()};
// cfgr_value &= !(0b11111 << 16); // 清除第 0 个引脚的配置
// cfgr_value |= 0b01000 << 16; // 设置为rtc_pre
// cfgr_value &= !(0b111 << 13); // 清除第 0 个引脚的配置
// cfgr_value |= 0b000 << 13; // 设置为rtc_apb2
cfgr_sys_value &= !(0b111 << 10); // 清除第 0 个引脚的配置
cfgr_sys_value |= 0b100 << 10; // 设置为rtc_apb2
cfgr_sys_value &= !(0b11 << 0); // 清除第 0 个引脚的配置
cfgr_sys_value |= 0b10 << 0; // 设置SYS_CLK
cfgr_sys_value &= !(0b1111 << 4); // 清除第 0 个引脚的配置
cfgr_sys_value |= 0b0000 << 4; // 设置SYS_CLK PRE
unsafe{ptr::write_volatile(register_rcc_cfgr as *mut u32, cfgr_sys_value)};
具体报错如下:
ERROR probe_rs::architecture::arm::core::armv7m: The core is in locked up status as a result of an unrecoverable exception
ERROR probe_rs::architecture::arm::core::armv7m: The core is in locked up status as a result of an unrecoverable exception
Error: The core is locked up.
Stack backtrace:
0: <unknown>
1: <unknown>
2: hid_write
3: <unknown>
4: <unknown>
5: <unknown>
6: <unknown>
7: <unknown>
8: <unknown>
9: <unknown>
10: hid_write
11: BaseThreadInitThunk
12: RtlUserThreadStart
error: process didn't exit successfully: probe-rs run --chip STM32F401RCTx target\thumbv7em-none-eabihf\debug\hello (exit code: 1) |
在库中有相关配置的源码,感兴趣的话可以仔细研读,这样大幅度提高效率。
在32位单片机中,已经极少用户去配置寄存器了,不利于阅读和移植,并且已经有些过时了。
随着芯片不断的推陈出新,芯片越来越强大,细节无数,分工也会越来越细,使用HAL 驱动库效率更高,管理更方便。
建议你检查下从HSE到最终系统时钟的形成所涉及到各个参数,主要是那些分频、倍频参数,
不要配置出超出数据手册约定之外的更高时钟频率了。
你可以基于CbueMx配置生成相应代码后,你相应移植过来。