stm32如何配置时钟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学习STM32笔记2 如何配置时钟
学习STM32笔记2 如何配置时钟
/*************************************************************
该程序目的是用于测试核心板回来后是否能正常工作。

包括
两个按键、两个LED现实。

按键为PC4、PC5,LED为PA0\PA1。

LED为
低电平时点亮。

按键为低电平时触发。

************************************************************/
#i nclude "stm32f10x_lib.h"
void RCC_Configuration(void);//设置系统主时钟
void GPIO_Configuration(void);//设置邋邋IO参数
void NVIC_Configuration(void);//设置中断表地址
void delay(void);//延时函数
int main(void)
{
#ifdef DEBUG
debug();
#endifRCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
while (1)
{
delay();
//设置指定的数据端口位
GPIO_SetBits(GPIOA,GPIO_Pin_0);
//设置指定的数据端口位
delay();
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
//清除指定的数据端口位
GPIO_SetBits(GPIOA,GPIO_Pin_1);
delay();
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
delay();
/*********************************************
使用setbits 与resetbits 是比较简单,其实还是可以使用
其它函数。

例如可以使用GPIO_WriteBit
GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);对于好像流水灯呀这些一个整段IO,可以使用GPIO_Write(GPIOA, 0x1101);
*********************************************/
}
}
/******************************************************************************* 系统时钟函数,要设置系统使用哪个晶振工作。

*******************************************************************************/ void RCC_Configuration(void)
{
RCC_DeInit();
//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);
/*设置外部高速晶振(HSE)
这里是设置高速晶振打开,其实一共有三种设置
RCC_HSE_OFF HSE晶振OFF
RCC_HSE_ON HSE晶振ON
RCC_HSE_Bypass HSE晶振使用外部时钟源。

*/ HSEStartUpStatus = RCC_WaitForHSEStartUp();
//等待 HSE 起振
if(HSEStartUpStatus == SUCCESS)
//等主晶振起振成功起振后执行操作
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*预取指缓存使能
FLASH_PrefetchBuffer用来选择FLASH预取指缓存的模式。

如果需关闭则使用FLASH_PrefetchBuffer_Disable
*/ FLASH_SetLatency(FLASH_Latency_2);
/*设置代码延时值
FLASH_Latency用来设置FLASH存储器延时时钟周期数。

FLASH_Latency_2 2为延时周期
可以使用以下参数FLASH_Latency_0 0延时周期
FLASH_Latency_1 1延时周期
FLASH_Latency_2 2延时周期
*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/*
设置AHB时钟(HCLK)
RCC_SYSCLK_Div1
AHB时钟 = 系统时钟
RCC_SYSCLK_Div2
AHB时钟 = 系统时钟 / 2
RCC_SYSCLK_Div4
AHB时钟 = 系统时钟 / 4
RCC_SYSCLK_Div8
AHB时钟 = 系统时钟 / 8
RCC_SYSCLK_Div16
AHB时钟 = 系统时钟 / 16
RCC_SYSCLK_Div64
AHB时钟 = 系统时钟 / 64
RCC_SYSCLK_Div128
AHB时钟 = 系统时钟 / 128
RCC_SYSCLK_Div256
AHB时钟 = 系统时钟 / 256
RCC_SYSCLK_Div512
AHB时钟 = 系统时钟 / 512
*/
RCC_PCLK2Config(RCC_HCLK_Div2);
/*设置高速AHB 时钟(PCLK2)
RCC_HCLK_Div2 APB1 时钟 = HCLK / 2 RCC_HCLK_Div1
APB2时钟 = HCLK
RCC_HCLK_Div2
APB2时钟 = HCLK / 2
RCC_HCLK_Div4
APB2时钟 = HCLK / 4
RCC_HCLK_Div8
APB2时钟 = HCLK / 8
RCC_HCLK_Div16
APB2时钟 = HCLK / 16
*/ RCC_PCLK1Config(RCC_HCLK_Div2);
/*设置低速 AHB 时钟(PCLK1)
RCC_HCLK_Div2 APB1 时钟 = HCLK / 2 RCC_HCLK_Div1
APB1时钟 = HCLK
RCC_HCLK_Div2
APB1时钟 = HCLK / 2
RCC_HCLK_Div4
APB1时钟 = HCLK / 4
RCC_HCLK_Div8
APB1时钟 = HCLK / 8
RCC_HCLK_Div16
APB1时钟 = HCLK / 16用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。

AHB和APB2域的最大频率是72MHZ? PB1域的最大允许频率是36MHZ。

SDIO接口的时钟频率固定为HCLK/2。

RCC通过AHB时钟8分频后供给Cortex系统定时
器的(SysTick)外部时钟。

通过对SysTick控制与状态寄
存器的设置,可选择上述时钟或Cortex AHB时钟
作为SysTick时钟。

ADC时钟由高速APB2时钟经2、4、
6或8分频后获得。

*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* PLLCLK = 8MHz * 9 = 72 MHz
设置 PLL 时钟源及倍频系数
RCC_PLLSource 描述
RCC_PLLSource_HSI_Div2
PLL的输入时钟 = HSI时钟频率除以2
RCC_PLLSource_HSE_Div1
PLL的输入时钟 = HSE 时钟频率
RCC_PLLSource_HSE_Div2
PLL的输入时钟 = HSE 时钟频率除以2
RCC_PLLMul
描述
RCC_PLLMul_2 PLL输入时钟 x 2
RCC_PLLMul_3 PLL输入时钟 x 3
RCC_PLLMul_4 PLL输入时钟 x 4
RCC_PLLMul_5 PLL输入时钟 x 5
RCC_PLLMul_6 PLL输入时钟 x 6
RCC_PLLMul_7 PLL输入时钟 x 7
RCC_PLLMul_8 PLL输入时钟 x 8
RCC_PLLMul_9 PLL输入时钟 x 9
RCC_PLLMul_10 PLL输入时钟 x 10
RCC_PLLMul_11 PLL输入时钟 x 11
RCC_PLLMul_12 PLL输入时钟 x 12
RCC_PLLMul_13 PLL输入时钟 x 13
RCC_PLLMul_14 PLL输入时钟 x 14
RCC_PLLMul_15 PLL输入时钟 x 15
RCC_PLLMul_16 PLL输入时钟 x 16
警告:必须正确设置软件,
使PLL输出时钟频率不超过72 MHz
当HSI被用于作为PLL时钟的输入时,
系统时钟的最大频率不得超过64MHz。

*/
RCC_PLLCmd(ENABLE);
//使能或者失能 PLL,关闭使用DISABLE
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//等待指定的 RCC 标志位设置成功等待PLL初始化成功
/*
RCC_FLAG值
RCC_FLAG 描述
RCC_FLAG_HSIRDY HSI晶振就绪
RCC_FLAG_HSERDY HSE晶振就绪
RCC_FLAG_PLLRDY PLL就绪
RCC_FLAG_LSERDY LSI晶振就绪
RCC_FLAG_LSIRDY LSE晶振就绪
RCC_FLAG_PINRST 管脚复位
RCC_FLAG_PORRST POR/PDR复位
RCC_FLAG_SFTRST 软件复位
RCC_FLAG_IWDGRST IWDG复位
RCC_FLAG_WWDGRST WWDG复位
*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/*设置系统时钟(SYSCLK)设置PLL为系统时钟?
RCC_SYSCLKSource 描述
RCC_SYSCLKSource_HSI 选择HSI作为系统时钟
RCC_SYSCLKSource_HSE 选择HSE作为系统时钟
RCC_SYSCLKSource_PLLCLK 选择PLL作为系统时钟
?
*/
?
while(RCC_GetSYSCLKSource() != 0x08)
/*等待PLL成功用作于系统时钟的时钟源
返回用作系统时钟的时钟源
0x00:HSI作为系统时钟
0x04:HSE作为系统时钟
0x08:PLL作为系统时钟
*/
{
}
}
else {
}//如果晶振没有正常起振则输出错误。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
//使能或者失能 APB2 外设时钟
/*
RCC_AHB2Periph 描述
RCC_APB2Periph_AFIO 功能复用IO时钟
RCC_APB2Periph_GPIOA GPIOA时钟
RCC_APB2Periph_GPIOB GPIOB时钟
RCC_APB2Periph_GPIOC GPIOC时钟
RCC_APB2Periph_GPIOD GPIOD时钟
RCC_APB2Periph_GPIOE GPIOE时钟
RCC_APB2Periph_ADC1 ADC1时钟
RCC_APB2Periph_ADC2 ADC2时钟
RCC_APB2Periph_TIM1 TIM1时钟
RCC_APB2Periph_SPI1 SPI1时钟
RCC_APB2Periph_USART1 USART1时钟
RCC_APB2Periph_ALL 全部APB2外设时钟
*/
}
/*
对于时钟设置的总结
一共有4种时钟1、HSE振荡器时钟(外部8M时钟)
2、HSI振荡器时钟(内部8M时钟)
3、LSE时钟(外部32.768kHz时钟)
4、LSI时钟(内部40kHz时钟)HSE振荡器时钟就是外部主要时钟就是8 M
晶振。

HSI时钟信号由内部8MHz的RC振荡器产生,
可直接作为系统时钟或在2分频后作为PLL输入。

是没有晶振时候使用内部时钟精度很差。

内部PLL可以用来倍频HSI RC的输出时钟或
HSE晶体输出时钟。

LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。

LSI RC担当一个低功耗时钟源的角色,
它可以在停机和待机模式下保持运行,
为独立看门狗和自动唤醒单元提供时钟。

PLL内部PLL可以用来倍频HSI RC的输出时钟
或HSE晶体输出时钟。

AHB预分频器配置高速APB(APB2)和低速APB(APB1)域的频率。

总体来说时钟配置流程如下: 首先将HSE外部时钟除2,然后使用PLL开始倍频。

设置主系统时间为倍频的n/1,一般直接设置为72M
然后使用AHB将系统时钟变成各个端口可以使用
速度。

今天的例子流程如下:
1、打开晶振---
2、等待起振---
3、设置代码延时为2
----4、AHB时钟 = 系统时钟-----5、设置高速AHB 时钟为2/1 ----6、设置低速 AHB 时钟(PCLK1)为2/1----
7、设置 PLL 时钟源及倍频系数使主频为72M-- -
8、设置使能或者失能 APB2 外设时值的IO
最终高速低速频率都是为36M。

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。

RTC的时钟源通过RTCSEL[1:0]来选择。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。

系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。

系统时钟可选择为PLL输出、HSI或者HSE。

系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、
2、4、8、16、64、128、256、512分频。

其中AHB分频器输出的时钟送给5大模块使用:
①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。

②、通过8分频后送给Cortex的系统定时器时钟。

③、直接送给Cortex的空闲运行时钟FCLK。

④、送给APB1分频器。

APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。

该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

⑤、送给APB2分频器。

APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。

该倍频器可选择1或者2倍频,时钟输出供定时器1使用。

另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。

ADC 分频器可选择为2、4、6、8分频。

在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。

当需要使用某模块时,记得一定要先使能对应的时钟。

需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。

连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。

注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。

USB模块工作的时钟应该是由APB1提供的。

连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。

相关文档
最新文档