STM32F407启用内部时钟

野火例程

int main(void)
{
	// 使用HSI,配置系统时钟为168M
	HSI_SetSysClock(16, 336, 2, 7);
	while(1)
	{}
}
/*
 * m: VCO输入时钟 分频因子,取值2~63
 * n: VCO输出时钟 倍频因子,取值192~432
 * p: PLLCLK时钟分频因子  ,取值2,4,6,8
 * q: OTG FS,SDIO,RNG时钟分频因子,取值4~15
 * 函数调用举例,使用HSI设置时钟
 * SYSCLK=HCLK=168M,PCLK2=HCLK/2=84M,PCLK1=HCLK/4=42M
 * HSI_SetSysClock(16, 336, 2, 7);
 * HSE作为时钟来源,经过PLL倍频作为系统时钟,这是通常的做法
 
 * 系统时钟超频到216M爽一下
 * HSI_SetSysClock(16, 432, 2, 9);
 */

void HSI_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)	
{
  __IO uint32_t HSIStartUpStatus = 0;
	
	// 把RCC外设初始化成复位状态
  RCC_DeInit();
  
  //使能HSI, HSI=16M
	RCC_HSICmd(ENABLE);
	
  // 等待 HSI 就绪
	HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
	
	// 只有 HSI就绪之后则继续往下执行
  if (HSIStartUpStatus == RCC_CR_HSIRDY)
  {
    // 调压器电压输出级别配置为1,以便在器件为最大频率
		// 工作时使性能和功耗实现平衡
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    PWR->CR |= PWR_CR_VOS;
		
		// HCLK = SYSCLK / 1
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		
		// PCLK2 = HCLK / 2
		RCC_PCLK2Config(RCC_HCLK_Div2);
		
		// PCLK1 = HCLK / 4
		RCC_PCLK1Config(RCC_HCLK_Div4);
		
    // 如果要超频就得在这里下手啦
		// 设置PLL来源时钟,设置VCO分频因子m,设置VCO倍频因子n,
		//  设置系统时钟分频因子p,设置OTG FS,SDIO,RNG分频因子q
		RCC_PLLConfig(RCC_PLLSource_HSI, m, n, p, q);
		
		// 使能PLL
		RCC_PLLCmd(ENABLE);
  
	  // 等待 PLL稳定
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }   

/*-----------------------------------------------------*/
    //开启 OVER-RIDE模式,以能达到更高频率(F429才有该功能)
//    PWR->CR |= PWR_CR_ODEN;
//    while((PWR->CSR & PWR_CSR_ODRDY) == 0)
//    {
//    }
//    PWR->CR |= PWR_CR_ODSWEN;
//    while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
//    {
//    }      
    // 配置FLASH预取指,指令缓存,数据缓存和等待状态
    FLASH->ACR = FLASH_ACR_PRFTEN 
		            | FLASH_ACR_ICEN 
		            |FLASH_ACR_DCEN 
		            |FLASH_ACR_LATENCY_5WS;
/*-----------------------------------------------------*/
		
		// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    // 读取时钟切换状态位,确保PLLCLK被选为系统时钟
    while (RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  else
  { // HSI启动出错处理
    while (1)
    {
    }
  }
}

中文参考手册在这里插入图片描述
英文数据手册在这里插入图片描述
STM32CubeMX在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407的RTC实时时钟可以通过以下步骤进行设置: 1. 打开PWR和BKP外设时钟。 2. 配置RTC时钟,使其与LSE低速外部晶振同步。 3. 配置RTC预分频器和计数器,以确定RTC时钟的更新频率。 4. 配置RTC时钟日历,包括时间和日期。 5. 使能RTC时钟和RTC中断,以便在时间更新时进行相应处理。 下面是一个简单的示例代码,用于初始化RTC实时时钟: ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 使能PWR外设时钟 PWR_BackupAccessCmd(ENABLE); // 允许修改RTC寄存器 // 选择LSE作为RTC时钟 RCC_LSEConfig(RCC_LSE_ON); while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); // 使能RTC外设时钟 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); // 配置RTC预分频器和计数器 RTC_InitStructure.RTC_AsynchPrediv = 0x7F; // 异步预分频器值 RTC_InitStructure.RTC_SynchPrediv = 0xFF; // 同步预分频器值 RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; // 24小时格式 RTC_Init(&RTC_InitStructure); // 配置RTC时钟日历 RTC_DateTypeDef RTC_DateStructure; RTC_TimeTypeDef RTC_TimeStructure; RTC_DateStructure.RTC_Year = 0x21; // 年份 RTC_DateStructure.RTC_Month = RTC_Month_November; // 月份 RTC_DateStructure.RTC_Date = 0x01; // 日 RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Sunday; // 星期几 RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure); RTC_TimeStructure.RTC_Hours = 0x10; // 小时 RTC_TimeStructure.RTC_Minutes = 0x30; // 分钟 RTC_TimeStructure.RTC_Seconds = 0x00; // 秒 RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); // 使能RTC中断 RTC_ITConfig(RTC_IT_SEC, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 使能RTC时钟 RTC_WaitForSynchro(); RTC_Cmd(ENABLE); ``` 在上述代码中,我们首先打开PWR和BKP外设时钟,然后配置RTC时钟使用LSE低速外部晶振。接下来,我们设置RTC的异步预分频器和同步预分频器,以确定RTC时钟的更新频率。然后,我们配置RTC时钟日历,包括时间和日期。最后,我们使能RTC中断,以便在时间更新时进行相应处理,并启用RTC时钟

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值