学习STM32笔记2如何配置时钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习STM32笔记2 如何配置时钟*
学习STM32笔记2 如何配置时钟
原创笔记2009-09-20 19:56 阅读116 评论0
字号:大中小
/*************************************************************
该程序目的是用于测试核心板回来后是否能正常工作。
包括
两个按键、两个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。