我正在try 配置一块STM32G474RE线路板的RCC时钟,其中PLL使用HSI16作为时钟源,PLLM=1、PLLN=10、AHB=1、APB1=1和APB2=4作为配置.然而,当我运行代码时,PLLRDY标志从未被设置,并且我被困在无限循环中.

#include "main.h"

void SytemClockConfig(void){
    /*Enable HSI16*/
    RCC->CR |= RCC_CR_HSION;
    while(!(RCC->CR & RCC_CR_HSIRDY)){}
    
    /*Configure PWR and FLASH*/
    RCC->APB1ENR1 |= RCC_APB1ENR1_PWREN;
    PWR->CR1 |= (0x01 & PWR_CR1_VOS_Msk);
    FLASH->ACR |= FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_2WS | FLASH_ACR_PRFTEN;
        
    /*Configure AHB and APB*/
    RCC->CFGR |= (0x00 & RCC_CFGR_HPRE_Msk);
    RCC->CFGR |= (0x00 & RCC_CFGR_PPRE1_Msk);
    RCC->CFGR |= (0x05 & RCC_CFGR_PPRE2_Msk);
        
    /*Config PLL*/
    RCC->PLLCFGR |= (0x02 & RCC_PLLCFGR_PLLSRC_Msk);
    RCC->PLLCFGR |= (0x00 & RCC_PLLCFGR_PLLM_Msk);
    RCC->PLLCFGR &= ~(RCC_PLLCFGR_PLLN_Msk);
    RCC->PLLCFGR |= (0x0A & RCC_PLLCFGR_PLLN_Msk);
    RCC->PLLCFGR |= (0x01 & RCC_PLLCFGR_PLLREN_Msk);
    RCC->PLLCFGR |= (0x00 & RCC_PLLCFGR_PLLR_Msk);

        
    /*Enable PLL*/
    RCC->CR |= (0x01 & RCC_CR_PLLON);
    while(!(RCC->CR & RCC_CR_PLLRDY)){}
        
    RCC->CFGR |= (0x05 & RCC_CFGR_SW_Msk);
    while((RCC->CFGR & RCC_CFGR_SWS) != (0x03 & RCC_CFGR_SWS_Msk)){}
} 

int main(void){
    SytemClockConfig();
    
}

推荐答案

你只是没有写出你认为你所写的价值观.您需要了解二进制逻辑运算是如何工作的.基本上,几乎所有的操作都是错误的.我只给你举几个例子.

  • RCC->CR |= (0x01 & RCC_CR_PLLON);这个操作什么也不做.PLLON位位于位置24.你的二进制和11 << 24.结果是0.然后将其与RCC->;CR寄存器进行二进制或运算.此操作不执行任何操作.105

  • RCC->CFGR |= (0x00 & RCC_CFGR_HPRE_Msk);RCC->CFGR |= 0相同;(它does not个零HPRE位!)

还有更多(几乎全部).

我建议在try 任何裸金属编程之前练习二进制逻辑操作.

如果您想:

  • 在位置n-VAL |= (1U << n)设置位
  • 复位位在位置n - VAL &= ~(1 << n)
  • 位置n-VAL ^= (1 << n)的切换位

如果要将值5放入寄存器中的PPRE2

uint32_t tmp = RCC->CFGR;
tmp &= ~RCC_CFGR_PPRE2_Msk;
tmp |= 5UL << RCC_CFGR_PPRE2_Pos
RCC->CFGR = tmp;

C++相关问答推荐

数组元素的编号索引

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

需要大整数和浮点数.使用long long int和long double

为什么复合文字(C99)的返回会生成更多的汇编代码?

为什么在C中进行大量的位移位?

C编译器是否遵循restrict的正式定义?

为什么在函数内部分配内存空间时需要添加符号?

在编译时参数化类型定义

为什么GCC C23中的关键字FALSE不是整数常量表达式?

字符是否必须转换为无符号字符,然后才能与getc家族的返回值进行比较?

C++中矢量类型定义和数据保护的高效解决方案

插座打开MacOS组件

在libwget中启用Cookie会导致分段故障

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

我在C程序的Flex/Bison中遇到语法错误

C语言中奇怪的输出打印数组

如何逐位读取二进制文件?

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

哪个首选包含第三个库S头文件?#INCLUDE;文件名或#INCLUDE<;文件名&>?

中位数和众数不正确