首页 > 其他分享 >system_stm32f4xx.c文件配置时钟

system_stm32f4xx.c文件配置时钟

时间:2023-09-13 23:55:24浏览次数:37  
标签:AHB 分频 PLL HSE system 时钟 stm32f4xx RCC

static void SetSysClock(void)
{

/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
/*------------------------------------------------------------------------------------------------启动HSE-------------------------------------------------------*/
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  /* Enable HSE 
#define  RCC_CR_HSEON ((uint32_t)0x00010000)
位 16 HSEON:HSE 时钟使能 (HSE clock enable)
由软件置 1 和清零。
由硬件清零,用于在进入停机或待机模式时停止 HSE 振荡器。如果 HSE 振荡器直接或间接 
用于作为系统时钟,则此位不可复位。
0:HSE 振荡器关闭 
1:HSE 振荡器打
  */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    /* #define  RCC_CR_HSERDY  ((uint32_t)0x00020000)
    位 17 HSERDY:HSE 时钟就绪标志 (HSE clock ready flag)
    由硬件置 1,用以指示 HSE 振荡器已稳定。在将 HSEON 位清零后,HSERDY 将在 6 个 
    HSE 振荡器时钟周期后转为低电平。
    0:HSE 振荡器未就绪 
    1:HSE 振荡器已就绪
    */
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    /*超时控制*/
    StartUpCounter++;
    /*#define HSE_STARTUP_TIMEOUT ((uint16_t)0x05000)*/
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

/*HSE启动是否成功,写HSE状态标志HSEStatus*/
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }
  /*-------------------------------------------------------------------------系统时钟分频----------------------------------------------------------------*/
/*HSE启动成功执行*/
  if (HSEStatus == (uint32_t)0x01)
  {
    /* Select regulator voltage output Scale 1 mode
    #define  RCC_APB1ENR_PWREN  ((uint32_t)0x10000000)
    位 28 PWREN:电源接口时钟使能 (Power interface clock enable)
    由软件置 1 和清零。
    0:禁止电源接口时钟 
    1:使能电源接口时钟
     */
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    /*调压器输出电压级别选择
    #define  PWR_CR_VOS ((uint32_t)0x0000C000)
    Bits 15:14 VOS[1:0]: Regulator voltage scaling output selection
    These bits control the main internal voltage regulator output voltage to achieve a trade-off 
    between performance and power consumption when the device does not operate at the 
    maximum frequency (refer to the corresponding datasheet for more details).
    These bits can be modified only when the PLL is OFF. The new value programmed is active 
    only when the PLL is ON. When the PLL is OFF, the voltage regulator is set to scale 3 
    independently of the VOS register content.
    00: Reserved (Scale 3 mode selected)
    01: Scale 3 mode <= 64 MHz
    10: Scale 2 mode (reset value) <= 84 MHz
    11: Scale 1 mode <= 100 MHz
    */
    PWR->CR |= PWR_CR_VOS;

    /* HCLK = SYSCLK / 1
    #define  RCC_CFGR_HPRE_DIV1  ((uint32_t)0x00000000)
    位 7:4 HPRE:AHB 预分频器 (AHB prescaler)
    由软件置位和清零,用于控制 AHB 时钟分频系数。
    小心: 在 HPRE 写入后,时钟将通过 1 AHB 到 16 AHB 周期新预分频系数进行分频。
    小心: 当使用以太网时,AHB 时钟频率必须至少为 25 MHz。
    0xxx:系统时钟不分频 
    1000:系统时钟 2 分频 
    1001:系统时钟 4 分频 
    1010:系统时钟 8 分频 
    1011:系统时钟 16 分频 
    1100:系统时钟 64 分频 
    1101:系统时钟 128 分频 
    1110:系统时钟 256 分频 
    1111:系统时钟 512 分频
    */
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;

    /* PCLK2 = HCLK / 2
    位 15:13 PPRE2:APB 高速预分频器 (APB2) (APB high-speed prescaler (APB2))
    由软件置位和清零,用于控制 APB 高速时钟分频系数。
    小心: 软件必须正确设置这些位,使其在此域中不超过 84 MHz。在 PPRE2 写入后,时钟 
    将通过 1 AHB 到 16 AHB 周期新预分频系数进行分频。
    0xx:AHB 时钟不分频 
    100:AHB 时钟 2 分频 
    101:AHB 时钟 4 分频 
    110:AHB 时钟 8 分频 
    111:AHB 时钟 16 分频
    */
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
    
    /* PCLK1 = HCLK / 4
    位 12:10 PPRE1:APB 低速预分频器 (APB1) (APB Low speed prescaler (APB1))
    由软件置位和清零,用于控制 APB 低速时钟分频系数。
    小心: 软件必须正确设置这些位,使其在此域中不超过 42 MHz。在 PPRE1 写入后,时钟 
    将通过 1 AHB 到 16 AHB 周期新预分频系数进行分频。
    0xx:AHB 时钟不分频 
    100:AHB 时钟 2 分频 
    101:AHB 时钟 4 分频 
    110:AHB 时钟 8 分频 
    111:AHB 时钟 16 分频
    */
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;


/*-------------------------------------------------------------------------------------主PLL分频----------------------------------------*/
    /* Configure the main PLL 
    RCC PLL 配置寄存器 (RCC_PLLCFGR)
    #define  RCC_PLLCFGR_PLLSRC_HSE              ((uint32_t)0x00400000)
    */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

 
    
    /* Enable the main PLL
    #define  RCC_CR_PLLON                        ((uint32_t)0x01000000)
    位 24 PLLON:主 PLL (PLL) 使能 (Main PLL (PLL) enable)
    由软件置 1 和清零,用于使能 PLL。
    当进入停机或待机模式时由硬件清零。如果 PLL 时钟用作系统时钟,则此位不可清零。
    0:PLL 关闭 
     */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till the main PLL is ready 
    位 25 PLLRDY:主 PLL (PLL) 时钟就绪标志 (Main PLL (PLL) clock ready flag)
    由硬件置 1,用以指示 PLL 已锁定。
    0:PLL 未锁定 
    1:PLL 已锁定
    */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   

/*----------------------------------------------------------------------------------Flash访问设置--------------------------------------------------------------*/
    /* Configure Flash prefetch, Instruction cache, Data cache and wait state 
    
    位 2:0 LATENCY:延迟 (Latency)
    这些位表示 CPU 时钟周期与 Flash 访问时间之比。
    000:零等待周期 
    001:一个等待周期 
    010:两个等待周期 
    011:三个等待周期 
    100:四个等待周期 
    101:五个等待周期 
    110:六个等待周期 
    111:七个等待周期
    位 8 PRFTEN:预取使能 (Prefetch enable)
    位 9 ICEN:指令缓存使能 (Instruction cache enable)
    位 10 DCEN:数据缓存使能 (Data cache enable)
    */
    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;


/*-----------------------------------------------------------------------------------系统时钟源选择----------------------------------------------------------------------*/
    /* Select the main PLL as system clock source 
    位 1:0 SW:系统时钟切换 (System clock switch)
    由软件置 1 和清零,用于选择系统时钟源。
    由硬件置 1,用于在退出停机或待机模式时或者在直接或间接用作系统时钟的 HSE 振荡器发 
    生故障时强制 HSI 的选择。
    00:选择 HSI 振荡器作为系统时钟 
    01:选择 HSE 振荡器作为系统时钟 
    10:选择 PLL 作为系统时钟 
    11:不允许
    */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= RCC_CFGR_SW_PLL;

    /* Wait till the main PLL is used as system clock source 
    
    */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }

}

 

标签:AHB,分频,PLL,HSE,system,时钟,stm32f4xx,RCC
From: https://www.cnblogs.com/Yannnnnn/p/17701142.html

相关文章

  • systemd病毒遏制流程参考
    systemd挖矿病毒遏制流程参考top查看进程占用情况systemctlstatus128724找出占用较高的恶意进程的相关进程killSTOP128724121095停止对应恶意PID进程,为服务器CPU降压(注:这里不推荐直接删除进程,因为挖矿往往存在定时任务,删除后还会自动生成,但停止恶意进程会使其陷......
  • System.OutOfMemoryException:“Exception_WasThrown”
    32位4g内存吃满了,改64位重新编译,我这个程序的问题32位程序,最大只能用4G内存,但实机需要远超4G,内存不足就会报这种错误  ......
  • win2003系统system占用80端口的解决办法
    本人一直都是用APMServ在winxp中搭建本地服务器测试网站,但最近换了win2003系统,结果本来在XP正常使用的APMServ启动时死活都提示80端口被占用,换成8080端口,虽然提示服务启动了,但是本地网站却打不开,在cmd中用命令查找时,发现提示system占用了80端口。如何查看端口在win03的cmd命令窗口......
  • 80端口被system 占用解决方法
    今天启动Apache的时候老是提示失败,很简单,使用netstat-ano发现80端口被占用。如图所示: 按照PID来说:在任务管理器中查看PID的进程名 既然是system。那么应该不回是真正的系统。而是微软的其他系列产品的进程在运行。【注意:我已经在服务services.msc中结束了IISADmin服务......
  • JDBC 连接 MySQL 报错 Unknown system variable ‘query_cache_size‘
    官方说法:ThequerycacheisdeprecatedasofMySQL5.7.20,andisremovedinMySQL8.0.Deprecationincludesquery_cache_size.querycache在MySQL5.7.20已经过时了,并且在MySQL8.0版本中被移除了。所以要更新mysql驱动版本<dependency><groupId>mysql</groupId......
  • Android9.0 SystemServerCrash问题总结
    设备在反复休眠唤醒后SystemServer挂掉背景:同事自测发现,当反复按压Power键后概率性出现系统挂掉的问题。分析过程查看系统log如下:12-0511:43:27.53015091759IWatchdog:CollectingBinderTransactionStatusInformation12-0511:43:29.70415091759EWatchdog:First......
  • 深入解析Java中的数组复制:System.arraycopy、Arrays.copyOf和Arrays.copyOfRange
    当涉及到在Java中处理数组时,有许多方法可供选择,其中一些包括System.arraycopy()、Arrays.copyOf()和Arrays.copyOfRange()。这些方法允许您在不同的数组之间复制数据,但它们之间有一些细微的差异。在本篇博客文章中,我们将深入探讨这些方法,以便您了解何时使用它们以及如何正确使用它......
  • 树莓派加挂实时时钟芯片PCF8563模块
    硬件:树莓派4B,PCF8563模块树莓派系统版本::~$lsb_release-aNoLSBmodulesareavailable.DistributorID:RaspbianDescription:RaspbianGNU/Linux10(buster)Release:10Codename:buster 在开始之前需要确认自己手里的芯片是PCF8563还是PCF8583,......
  • 修改主频 & 时钟树
    在system_stm32f10x.c中可以更改这个 最先调用voidSystemInit(void)启动HSI+各种恢复缺省配置  然后  调用SetSysClock();执行设置时钟72M 设置AHB APB分频,RLL倍频后作为系统时钟输出(SystemInit默认工作如下,若是初始化失败则用HSI内部8M的时钟) externuint......
  • Java系统变量参数 获取 设置 System.getProperties()
    目录1.获取2.设置3.常用参数4.Systm.getenv()与System.getProperties()区别1.获取 StringosName=System.getProperties().getProperty("os.name"); System.out.println(osName);结果输出:Windows102.设置System.setProperty("jdbc.drivers"......