|
楼主 |
发表于 2017-1-16 12:58:21
|
显示全部楼层
以如下代码初始化时钟:
/*时钟源选择*/
#define SYSCLK_HSI 0
#define SYSCLK_HSE 1
/*********************************************************************************
* @函数名: syscolock_init
* @描述: 系统时钟初始化
* @参数:clkfrom 时钟源:CLK_HSI 内部时钟;CLK_HSE 外部时钟
* pll 倍频:从2开始,最大16
* @返回值:无
* @说明:
**********************************************************************************/
void syscolock_init(uint8_t clkfrom, uint8_t pll)
{
uint8_t temp = 0;
RCC_DeInit(); /*复位并配置向量表*/
RCC->CFGR = 0X00000400; /*APB1 = DIV2; APB2 = DIV1; AHB = DIV1;*/
pll -= 2; /*偏移2(因为从0开始,0就是2)*/
RCC->CFGR |= pll << 18; /*设置PLL值,2--16*/
if (clkfrom == SYSCLK_HSI) /*使用内部时钟,sysclk =4*pllMhz*/
{
RCC->CR |= 0x00000001; /*内部高速时钟使能HSION*/
while(!(RCC->CR >> 1)); /*等待内部时钟就绪*/
RCC->CFGR &= ~(1 << 16); /*HSI经过2分频后作为PLL输入*/
}
else if (clkfrom == SYSCLK_HSE) /*使用外部时钟HSE sysclk = HSE * PLL MHz*/
{
RCC->CR |= 0x00010000; /*外部时钟源HSEON*/
while(!(RCC->CR >> 17)); /*等待外部时钟就绪*/
RCC->CFGR |= 1 << 16; /*HSE作为PLL输入*/
}
FLASH->ACR |= 0x32; /* FLASH 2个延时周期*/
RCC->CR |= 0x01000000; /*PLLON*/
while (!(RCC->CR >> 25)); /*等待PLL锁定*/
RCC->CFGR |= 0x00000002; /*PLL作为系统时钟*/
while (temp != 0x02) /*等待PLL作为系统时钟设置成功*/
{
temp = RCC->CFGR >> 2;
temp &= 0x03;
}
} |
|