两只袜子 发表于 2021-3-30 09:55

如何配置MM32系统时钟?

大家都知道在使用MCU时,时钟相当于MCU的 “心脏”,时钟的速度取决于外部晶振或内部RC振荡电路的频率,是不可改变的。而ARM的出现打破了这一传统法则,可通过软件随意改变时钟的速度。这一出现让我们的设计更加灵活,频率可选空间也更加广泛,用户可以根据自己的实际需求配置需要的系统时钟。为了让用户能够更简单的使用这一功能,下面小编将教大家如何配置MM32L0产品的系统时钟。
从时钟频率来分可分为高速时钟源和低速时钟源,从来源可分为外部时钟源和内部时钟源,外部时钟源就是通过外部接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其它的是内部时钟源。
用户可通过多个预分频器配置AHB 、高速APB(APB2)和低速APB(APB1)域的频率,AHB和APB1,APB2域的最大频率是48MHz。
MCO 是 MM32 的一个时钟输出 I/O (PA8),它可以选择一个时钟信号输出,可以选择为 PLL的 2 分频、 HSI、 HSE、LSI或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源。
首先让我们来看看 MM32L0产品的时钟系统图吧:MM32L0产品时钟树                              
MM32时钟配置方法:1、使用system_MM32L0产品.c配置时钟在MM32固件库中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为SystemInit(),但在调用前还需要进行一些宏定义的设置,具体的设置在system_MM32L0xx.c文件中。
system_MM32L0xx.c文件中定义://#defineSYSCLK_FREQ_HSE    HSE_VALUE//#defineSYSCLK_FREQ_24MHz24000000//#defineSYSCLK_FREQ_36MHz36000000#defineSYSCLK_FREQ_48MHz48000000 (配置外部48MHz系统时钟)
//#defineSYSCLK_HSI_24MHz24000000//#defineSYSCLK_HSI_36MHz36000000//#define SYSCLK_HSI_48MHz48000000
库函数的设置都是假定您的硬件已经接了外部8M晶振,所以上述宏都是在8MHz的基础上运算得来的,您只需要打开相对应的宏就可以实现对应的系统时钟配置。
2、使用库函数配置时钟用HSE作为时钟源,程序设置时钟参数流程:01、将RCC寄存器重新设置为默认值   RCC_DeInit;02、打开外部高速时钟晶振 HSE       RCC_HSEConfig(RCC_HSE_ON);03、等待外部高速时钟晶振工作      RCC_WaitForHSEStartUp()!=004、设置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 HSEHSEStartUpStatus = RCC_WaitForHSEStartUp(); // Waittill HSE is readyIF(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;   //MCOPA8   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观察系统频率   }



yangjiaxu 发表于 2021-5-23 19:46

感谢分享,这个写的详细

小明的同学 发表于 2021-5-23 19:54

时钟系统基本上都是大差不差。

piteqiu 发表于 2021-5-24 11:14

支持下,如果有类似ST那样的配置软件那就更方便了。

foxsbig 发表于 2021-6-23 10:44

piteqiu 发表于 2021-5-24 11:14
支持下,如果有类似ST那样的配置软件那就更方便了。

cube确实节省了不少时间
还是觉得,配置完了,有时间还是自己捋一遍。
脱离的硬件程序员,会受到不少限制

Betty1299 发表于 2021-6-23 16:45

可以参考官方提供的代码,直接copy一份就好了,基本上时钟也就那么多

Annie556 发表于 2021-6-23 16:45

芯片的时钟配置是个麻烦事儿,如果有自动生成的软件 会好很多

Candic12e 发表于 2021-6-23 16:46

时钟配置基本也就第一次麻烦,之后都是通用的了

B1lanche 发表于 2021-6-23 16:47

时钟树是MCU的灵魂,干吧,基本上这块是比较复杂的了

match007 发表于 2021-7-12 13:58

还是偏向于库函数
页: [1]
查看完整版本: 如何配置MM32系统时钟?