历史上的今天
返回首页

历史上的今天

今天是:2025年03月01日(星期六)

2020年03月01日 | STM32-嵌入式学习笔记1-使用HSE和HSI配置时钟

2020-03-01 来源:elecfans

RCC主要作用:时钟


设置SYSCLK   设置AHB分频因子····配置好这些因子就能对时钟进行完整的配置。

时钟树如图:


系统时钟的选择是在启动时进行,复位时内部8MHz的RC振荡器被选为默认的CPU时钟,随后可以

选择外部的、具失效监控的4~16MHz时钟;当检测到外部时钟失效时,它将被隔离,系统自动地切

换到内部的RC振荡器,如果使能了中断,软件可以接收到相应的中断。同样,在需要时可以采取对

PLL时钟完全的中断管理(如当一个间接使用的外部振荡器失效时)。

多个预分频器用于配置AHB的频率、高速APB(APB2)和低速APB(APB1)区域。AHB和APB的最高频

率是36MHz。


 


编程要领:


1)开启HSE/HSI 等待HSE/HSI 稳定


2)设置AHB,APB2,APB1的预分频因子


3)设置PLL的时钟来源和PLL的倍频因子,各个频率主要在这里设置


4)开启PLL 等待PLL稳定


5)把PLLCK切换为系统时钟SYSCLK


6)读取时钟切换状态位,确保PLLCLK被选中为系统时钟


HSE配置系统时钟


#include "stm32f10x.h"

#include "bsp_rccclkconfig.h"

 

void HSE_SetSysClk(uint32_t RCC_PLLMul_x) //设置HSE为系统时钟

{

//把RCC外设初始化成复位状态

ErrorStatus HSEStatus;

//把RCC寄存器复位

RCC_DeInit();

//使能HSE,开启外部晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待HSE启动

HSEStatus=RCC_WaitForHSEStartUp();

//当HSE稳定之后继续往下执行

if(HSEStatus== SUCCESS )

{

//使能预取指

FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_2);

        //LATENCY:时延

//这些位表示SYSCLK(系统时钟)周期与闪存访问时间的比例

//000:零等待状态,当 0 < SYSCLK ≤ 24MHz

//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz

//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div2);

 

//配置PLLCLK = HSE *RCC_PLLMul_x

RCC_PLLConfig( RCC_PLLSource_HSE_Div1,RCC_PLLMul_x);

//使能PLL

RCC_PLLCmd(ENABLE);

//等待PLL时钟稳定

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET )

{

//选择系统时钟

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource() !=0x08);

}

}

else

{

}

}

 

void MCO_GPIO_Config()

{

//定义一个GPIO_InitTypeDef类型的结构体

GPIO_InitTypeDef GPIO_InitStructure;

 

//开启LED相关GPIO的外设时钟

RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA, ENABLE);

//选择控制的引脚

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

 

//选择输出方式为推挽输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   

 

//设置引脚速率为50MHZ

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

 

//调用库函数,初始化GPIO

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

使用HSI作为系统时钟


#include "stm32f10x.h"

#include "bsp_rccclkconfig.h"

 

void HSI_SetSysClk(uint32_t RCC_PLLMul_x) //设置HSE为系统时钟

{

//把RCC外设初始化成复位状态

__IO uint32_t HSIStatus=0;

//把RCC寄存器复位

RCC_DeInit();

//使能HSI,开启外部晶振

RCC_HSICmd(ENABLE);

//等待HSE启动

HSIStatus =RCC->CR & RCC_CR_HSIRDY;

//当HSE稳定之后继续往下执行

if(HSIStatus== SUCCESS )

{

//使能预取指

FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_2);

//设置SYSCLK周期与flash的访问时间比例,这里为2

//设置成2的时候,SYSCLK低于48MHz也可以工作,设置成0或者1

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div2);

 

//配置PLLCLK = HSE *RCC_PLLMul_x

RCC_PLLConfig( RCC_PLLSource_HSI_Div2,RCC_PLLMul_x);

//使能PLL

RCC_PLLCmd(ENABLE);

//等待PLL时钟稳定

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET )

{

//选择系统时钟

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource() !=0x08);

}

}

else

{

}

}

 

void MCO_GPIO_Config()

{

//定义一个GPIO_InitTypeDef类型的结构体

GPIO_InitTypeDef GPIO_InitStructure;

 

//开启LED相关GPIO的外设时钟

RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA, ENABLE);

//选择控制的引脚

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

 

//选择输出方式为推挽输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   

 

//设置引脚速率为50MHZ

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

 

//调用库函数,初始化GPIO

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

推荐阅读

史海拾趣

Atlantic Microwave Ltd公司的发展小趣事

Atlantic Microwave Ltd公司成立于电子科技蓬勃发展的年代,初期只有几名志同道合的工程师,他们怀揣着对微波技术的热情,在狭小的办公室中开始了他们的创业之旅。资金短缺、技术难题、市场认可度低等问题接踵而至。然而,团队凭借着对技术的执着追求和对市场的敏锐洞察,不断攻克技术难关,优化产品设计,逐渐在市场上站稳了脚跟。

Einfochips公司的发展小趣事

随着硬件设计和验证领域的发展,SystemVerilog逐渐成为行业内的主流语言。Einfochips公司敏锐地捕捉到了这一趋势,并决定为客户提供从其他传统语言和环境转变到SystemVerilog的验证迁移服务。这一服务的推出,不仅帮助客户提高了设计和验证效率,还进一步扩大了Einfochips在硬件设计和验证领域的市场份额。

Dearborn Electronics Inc公司的发展小趣事

Dearborn Electronics Inc.始终将品质放在首位,建立了严格的质量管理体系。公司从原材料采购到生产、检验、包装等各个环节都进行严格的质量控制,确保每一件产品都符合最高标准。此外,公司还不断引进先进的生产设备和技术,提高生产效率和产品质量。

CIPS公司的发展小趣事

自CIPS系统上线以来,其业务量呈现快速增长的态势。通过CIPS系统处理的跨境人民币业务量逐年攀升,连接到该系统的参与者数量也大幅增加。这些参与者遍布全球各地,涵盖了银行、金融机构等多个领域。CIPS系统的业务范围不断扩大,实际业务覆盖全球多个国家和地区,为全球金融网络的发展做出了重要贡献。

南晶电子(DGNJDZ)公司的发展小趣事

随着市场竞争的加剧,南晶电子意识到技术创新是企业发展的核心动力。公司投入大量研发资金,与多所高校和科研机构建立合作关系,共同研发新型半导体器件。经过不懈努力,南晶电子成功推出了一系列具有自主知识产权的高性能产品,赢得了市场的广泛认可。

Beck IPC GmbH公司的发展小趣事

Beck IPC始终坚持以研发和创新为核心驱动力。公司每年投入大量资金用于研发新技术和产品,并建立了完善的研发团队和体系。通过不断的技术创新和产品升级,Beck IPC始终保持着在嵌入式通讯和工业物联网领域的领先地位。同时,公司还积极参与国际标准制定和行业交流活动,为推动行业发展贡献自己的力量。

问答坊 | AI 解惑

模范论文

本帖最后由 paulhyde 于 2014-9-15 09:16 编辑 国赛的模范论文  …

查看全部问答>

Wince6 中怎么开发一个支持ESC/POS 打印机驱动?

WINCE 中怎么开发一个打印机驱动,我把OAK中的PRINTER移植到DRIVER中编译有问题,具体应该怎么移植和设置呢?我的开发平台是PXA303+一台热敏打印机(UART口支持)。我不想做成应用直接往串口发命令行,想把它做成一个标准的打印驱动,但以前没做过 ...…

查看全部问答>

NK.bin中N代表什么

nk.bin作为wince的内核文件,K 应该是Kernel,内核的意思吧。那么,其中的N代表什么呢…

查看全部问答>

编写wince的底层驱动应该如果实现比较精确的uS、mS级延时呢?

比如我想一个GPIO先设为高电平,2uS后就变成低电平。…

查看全部问答>

VxWorks CPU的调度时间算不算临界资源.

任务在获得相应资源后由阻塞态变成就绪态,然后等待由CPU来执行,那么,这个CPU的执行时间片算不算临界资源呢?…

查看全部问答>

ISP下载问提

高手大哥!  能告诉我一个ISP在线下载软件地址吗?   关于AT89S52地最好   我自己不清楚ISP下载软件是什么样的   刚刚接触单片机     谢谢…

查看全部问答>

请教高手安装CYGWIN

请教大侠CYGWIN的完整安装教程,我怎么总是装了有错误无法进行下去的啊…

查看全部问答>

ucos ii 的定时器创建函数疑问

OS_TMR  *OSTmrCreate (INT32U           dly,                       INT32U        &nbs ...…

查看全部问答>