我在配置寄存器的时候发现当打开 HSE PLL后 ready寄存器一直为0 所以在什么条件之下,这个寄存器的值会变为1呢,我使用的是stm32f401rct6 defmt输出为 <lvl> value: 1000000010101101110000011
新手菜鸡轻喷
let register_rcc_pllcfgr = unsafe{(RCC_BASE as *mut RW<u32>).offset(0x04 / 4)}; // GPIOC_MODER
let mut cfgr_value = unsafe{ptr::read_volatile(register_rcc_pllcfgr).read()};
cfgr_value &= !(0b1 << 22);
cfgr_value |= 0b1 << 22; // 设置为PLL_ON
cfgr_value &= !(0b111111111 << 6);
cfgr_value |= 0b010101000 << 6; //N
cfgr_value &= !(0b111111 << 0);
cfgr_value |= 0b000100 << 0;//M
cfgr_value &= !(0b11 << 16);
cfgr_value |= 0b01 << 16; //p
cfgr_value &= !(0b1111 << 24);
cfgr_value |= 0b0111 << 24; //q
unsafe{ptr::write_volatile(register_rcc_pllcfgr as *mut u32, cfgr_value)};
defmt::println!("value: {:b}",cfgr_value);
let register_rcc_cr = unsafe{(RCC_BASE as *mut RW<u32>).offset(0)}; // GPIOC_MODER
let mut cr_value =unsafe{ptr::read_volatile(register_rcc_cr).read()};
cr_value &= !(0b1 << 24); // 清除第 0 个引脚的配置
cr_value |= 0b1 << 24; // 设置为PLL_ON
cr_value &= !(0b1 << 16); // 清除第 0 个引脚的配置
cr_value |= 0b1 << 16; // 设置为HSE_ON
unsafe{ptr::write_volatile(register_rcc_cr as *mut u32, cr_value)};
//defmt::println!("value: {:b}",cr_value);
|
我知道了,真的太蠢,这里应该再读一下,不然一直是之前的值。
至于PLL的Ready位,是在RCC->CR寄存器里。
PLL的时钟源可以是HSI,也可以是HSE。可以先使用HSI验证下,然后再来验证HSE。
HSE必须稳定工作才行,否则用它做PLL的时钟源肯定有问题,没法进入PLL ready状态。
我确认HSE可以稳定的工作,因为我用hal库试过,而且他的cr寄存器中HSE和PLL的位确实是置高。我可以试一下HSI,稍等。所以如果要用寄存器配置HSE,流程是什么样的呢。