MM32时钟配置方法:
1、使用system_MM32L0产品.c配置时钟
在MM32固件库中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为SystemInit(),但在调用前还需要进行一些宏定义的设置,具体的设置在system_MM32L0xx.c文件中。
system_MM32L0xx.c文件中定义:
//#defineSYSCLK_FREQ_HSE HSE_VALUE
//#defineSYSCLK_FREQ_24MHz 24000000
//#defineSYSCLK_FREQ_36MHz 36000000
#defineSYSCLK_FREQ_48MHz 48000000 (配置外部48MHz系统时钟)
//#defineSYSCLK_HSI_24MHz 24000000
//#defineSYSCLK_HSI_36MHz 36000000
//#define SYSCLK_HSI_48MHz 48000000
库函数的设置都是假定您的硬件已经接了外部8M晶振,所以上述宏都是在8MHz的基础上运算得来的,您只需要打开相对应的宏就可以实现对应的系统时钟配置。
2、使用库函数配置时钟
用HSE作为时钟源,程序设置时钟参数流程:
01、将RCC寄存器重新设置为默认值 RCC_DeInit;
02、打开外部高速时钟晶振 HSE RCC_HSEConfig(RCC_HSE_ON);
03、等待外部高速时钟晶振工作 RCC_WaitForHSEStartUp()!=0
04、设置AHB时钟 RCC_HCLKConfig;
05、设置APB2时钟 RCC_PCLK2Config;
06、设置APB1时钟 RCC_PCLK1Config;
07、设置PLL输入时钟源 RCC_PLLConfig;
08、打开PLL RCC_PLLCmd(ENABLE);
09、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) ==RESET)
10、设置系统时钟 RCC_SYSCLKConfig;
11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08)
12、打开要使用的外设时钟
RCC_APB2PeriphclockCmd()/RCC_APB1PeriphClockCmd()
下面是MM32软件固件库的程序中对RCC的配置函数:
void System_HSE_Clock_Init(u8 PLL)
{
RCC_DeInit(); // RCC system reset
RCC_HSEConfig(RCC_HSE_ON); // Enable HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Waittill HSE is ready
IF(HSEStartUpStatus == SUCCESS) // 当HSE准备完毕切振荡稳定后
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK/2
FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, PLL); //PLLis 48MHz
RCC_PLLCmd(ENABLE); // Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource()!= 0x08)
{
}
}
}
3、使用寄存器配置时钟
void System_HSE_Clock_Init(u8 PLL)
{
unsigned char temp=0;
RCC->CR|=RCC_CR_HSEON; // Enable HSE
while(!(RCC->CR&RCC_CR_HSERDY)); // Wait till HSE is ready
RCC->CFGR=RCC_CFGR_PPRE1_2; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
RCC->CFGR|=RCC_CFGR_PLLSRC;
RCC->CR &=~(RCC_CR_PLLON);
RCC->CR &=~(0x1f<<26);
RCC->CR|=(PLL - 1) << 26; //
FLASH->ACR|=FLASH_ACR_LATENCY_1|FLASH_ACR_PRFTBE|FLASH_ACR_PRFTBS; // Flash 2 wait state
RCC->CR|=RCC_CR_PLLON; // Enable PLL
while(!(RCC->CR&RCC_CR_PLLRDY));
RCC->CFGR|=RCC_CFGR_SW_PLL; // Wait till PLL is ready
while(temp!=0x02)
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
通过上面三种方式都可配置MM32时钟,微控制器允许输出时钟信号到外部MCO管脚,用户可通过引脚PA8输出时钟更直观的方式观察时钟系统,配置方法如下:
int RCC_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8; //MCO PA8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_0);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
RCC_MCOConfig(RCC_MCO_SYSCLK); //通过PA8观察系统频率
}