Stm32F04 时钟配置
时钟配置
1、概述
F407的内部时钟有LSI(32Hz)、HSI(16MHz)
外部时钟有 HSE 25MHz,用外部时钟比较稳定。
用HSE时钟配置系统时钟如下
25Mhz,通过PLL倍频,作为PllClk和PLL48CLK时钟,(m分频因子一般为HSE大小:配置为输入VCO为1MHz,XN倍频为输出VCO =336Mhz,通过分频因子p(=2)和R(=7)给外部总线提供时钟,ABB(HCLK)=168,APB1总线为42Hz、APB2总线为84Hz,定时器时钟是APB总线时钟2倍,)
2、时钟配置总结
/*
- 使用 HSE 时,设置系统时钟的步骤
- 1、开启 HSE ,并等待 HSE 稳定
- 2、设置 AHB、 APB2、 APB1 的预分频因子
- 3、设置 PLL 的时钟来源
- 设置 VCO 输入时钟 分频因子 m
- 设置 VCO 输出时钟 倍频因子 n
- 设置 PLLCLK 时钟分频因子 p
- 设置 OTG FS,SDIO,RNG 时钟分频因子 q
- 4、开启 PLL,并等待 PLL 稳定
- 5、把 PLLCK 切换为系统时钟 SYSCLK
- 6、读取时钟切换状态位,确保 PLLCLK 被选为系统时钟
- m: VCO 输入时钟 分频因子,取值 2~63
- n: VCO 输出时钟 倍频因子,取值 192~432
- p: PLLCLK 时钟分频因子 ,取值 2, 4, 6, 8
- q: OTG FS,SDIO,RNG 时钟分频因子,取值 4~15
- 函数调用举例,使用 HSE 设置时钟
- SYSCLK=HCLK=168M,PCLK2=HCLK/2=84M,PCLK1=HCLK/4=42M
*/
3、用寄存器编程
void hseCfg(void)
{
/*****************************************************************************/
/ PLL (clocked by HSE) used as System clock source /
/****************************************************************************/
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/ 复位RCC的所有寄存器 */
RCC_DeInit();
RCC->CR |=(uint32_t)RCC_CR_HSEON;//使能HSE时钟
// 下面是等着硬件自动设置CR寄存器为HSERDY为1表示HSE时钟就绪
do
{
HSEStatus=RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
}while((HSEStatus==0)&&(StartUpCounter!=HSE_STARTUP_TIMEOUT));
if((RCC->CR & RCC_CR_HSERDY)!=RESET)
{HSEStatus=0x1;
}
else
{HSEStatus=0x0;
}
if(HSEStatus==0x1)
{/* Select regulator voltage output Scale 1 mode *//* 选择电压调节器的模式为1,用来平衡电压,减低功耗 */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS; /* 给系统各总线分频AHB 分频为1APB1 分频为4APB1 分频为2
*/RCC->CFGR |=RCC_CFGR_HPRE_DIV1;RCC->CFGR |=RCC_CFGR_PPRE1_DIV4;RCC->CFGR |=RCC_CFGR_PPRE2_DIV2;
/* PLL倍频* RCC_PLLCFGR_PLLSRC_HSE 作为系统时钟/
RCC->PLLCFGR = 25 | (336 << 6) | (((2 >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSE) | (7 << 24);
/* Enable the main PLL /
/ 使能主PLL /
RCC->CR |= RCC_CR_PLLON;
/ Wait till the main PLL is ready /
/ 等待主PLL稳定 */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}/* Configure Flash prefetch, Instruction cache, Data cache and wait state *//* 配置FLASH预取指,指令缓存,数据缓存,等待周期 */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;RCC->CFGR &=~(RCC_CFGR_SW);RCC->CFGR |=RCC_CFGR_SW_PLL;//选择PLL作为系统时钟while((RCC->CFGR &(uint32_t)RCC_CFGR_SWS_PLL) !=RCC_CFGR_SWS_PLL){}//等待PLL就绪,有硬件设置
}
else
{异常做其他处理
}
}
4、用固件库编程
void HseCFg(uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)
{
ErrorStatus errorStatus=ERROR;
RCC_DeInit(); /* 复位RCC的所有寄存器 */
RCC_HSEConfig(RCC_HSE_ON);//使能HSE时钟
// 下面是等着硬件自动设置CR寄存器为HSERDY为1表示HSE时钟就绪
errorStatus=RCC_WaitForHSEStartUp();
if(errorStatus==SUCCESS)
{/* 给系统各总线分频AHB 分频为1APB1 分频为4APB1 分频为2
*/RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div4);RCC_PCLK2Config(RCC_HCLK_Div2);/* PLL倍频* RCC_PLLCFGR_PLLSRC_HSE 作为系统时钟/RCC_PLLConfig(RCC_PLLSource_HSE, PLLM, PLLN, PLLP, PLLQ);RCC_PLLCmd(ENABLE);//用的位带操作,给寄存器X位置1while((RCC->CR & RCC_CR_PLLRDY) == 0)
{}/* Configure Flash prefetch, Instruction cache, Data cache and wait state *//* 配置FLASH预取指,指令缓存,数据缓存,等待周期 */
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while((RCC->CFGR &(uint32_t)RCC_CFGR_SWS_PLL) !=RCC_CFGR_SWS_PLL)
{
}
}
else
{
}
}
5、HSI配置为系统时钟
void HSIFun(uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
// ErrorStatus errorStatus=ERROR;
/* 复位RCC的所有寄存器 */
RCC_DeInit();
RCC->CR |=(uint32_t)RCC_CR_HSION;
do
{
HSEStatus=RCC->CR & RCC_CR_HSIRDY;
StartUpCounter++;
}while((HSEStatus==0)&&(StartUpCounter!=HSE_STARTUP_TIMEOUT));
if((RCC->CR & RCC_CR_HSIRDY)==RCC_CR_HSIRDY)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div4);
RCC_PCLK2Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSI, PLLM, PLLN, PLLP, PLLQ);RCC_PLLCmd(ENABLE);while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}/* Configure Flash prefetch, Instruction cache, Data cache and wait state *//* 配置FLASH预取指,指令缓存,数据缓存,等待周期 */
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while((RCC->CFGR &(uint32_t)RCC_CFGR_SWS_PLL) !=RCC_CFGR_SWS_PLL)
{
}
}
else
{}
}
Stm32F04 时钟配置相关推荐
- STM32的时钟配置随笔
以前使用STM32都是使用库函数开发,最近心血来潮想要使用寄存器来试试手感,于是乎便在工作之余研究了一下STM32F4的时钟配置,在此将经历过程写下来作为锻炼,同时也供和我一样的新手参考,如有错误或者 ...
- 华大单片机HC32L136J8TA读取DS18B20温度(源码+时钟配置)
免费的C语言和linuxPDF文档:传送门 有一点C语言基础和华大单片机开发经验,应该就能看得懂就不多介绍了,有疑问可以留言,看到就回了; 关于协议具体解析:传送门@不脱发的程序猿 注(2021-05 ...
- STM32的时钟配置——时钟树解析
此文章由于讲得较详细因此篇幅较长,请带着一点耐心去读,相信会有收获! 目录 STM32为什么要有复杂的时钟系统 详解STM32时钟系统 STM32有几个时钟源 关于时钟输出 软件配置时钟 STM32为 ...
- NXP(I.MX6uLL)DDR3实验——DDR3重要时间参数、时钟配置与原理图简析
目录 DDR3 内存时间参数 传输速率 tRCD 参数 CL 参数 AL 参数 tRC 参数 tRAS 参数 I.MX6U MMDC内存控制器简介 MMDC内存控制器简介 MMDC内存控制器信号引脚 ...
- STM32 RCC时钟配置
STM32 RCC时钟配置 时钟源 外部高速晶振HSE,通常是8MHz. 内部高速晶振HSI,8MHz. 外部低速晶振LSE,32.768KHz. 内部低速晶振LSI,40KHz. 时钟源选择 通常使 ...
- stm32时钟配置总结
stm32时钟配置时钟源: 1,HSE(高速外部时钟)即常见的外接8M晶振方案: 2,HSI(高速内部时钟) 即8M内部振荡时钟方案: 3,LSE(低速外部时钟)即常见的32.768Khz晶振方案: ...
- 火牛单片机rtc时钟配置_怎么用STM32F103RTC进行时钟的配置
#include "sys.h" #include "delay.h" #include "usart.h" #include " ...
- DSP28377s系统时钟配置注意事项
DSP28377s系统时钟配置注意事项 问题一脸嫣然的向我们走来... 近日,一个兄弟在配置基于28377s芯片的主控系统时钟时,遇到点困难. 具体是这样的,原来的主控板使用的是20MHz外部晶振,为 ...
- 如何修改IMX6UL开发板时钟配置?
启扬i.MX6UL开发板时钟由24Mhz与32.768Khz晶振提供,这里不具体介绍NXP公司整体的时钟规划,只从软件API接口方面去分析如何去修改一个外设的时钟. 接下来的讲解将以CAN总线的时钟为 ...
最新文章
- FeignClientAutoConfiguration
- C语言 | 卡尔曼滤波算法2——算法分析
- python中re_Python中re(正则表达式)模块学习
- HDU 1542 Atlantis 线段树+离散化+扫描线
- 分治法求两个等长升序序列的联合中位数
- ON_EVENT 报错
- 第二个Arduino小车 两轮自平衡
- 中国气象数据网的.nc数据批量下载(Python代码)
- java导出文件放到压缩包里
- Win10隐藏图标怎么恢复
- 简易打折,输入数量金额然后计算打折
- js刻度尺插件_html5 canvas+js刻度尺代码
- linux sh文件执行情况,Linux下SH执行
- 博尔德大学计算机专业本科,2020美国大学计算机专业本科排名
- 【小样本分割】PFENet
- 测试/开发程序员幽默的 “自嘲“?印象流派......
- python爬虫天气实例_Python爬虫实例扒取2345天气预报
- nginx配置ip黑名单
- java教程(三)初识J2ee十三个规范
- iOS Odyssey 和 unc0ver 的区别