打印
[MM32软件]

如何配置MM32系统时钟?

[复制链接]
4631|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家都知道在使用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_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观察系统频率
   }




使用特权

评论回复
沙发
yangjiaxu| | 2021-5-23 19:46 | 只看该作者
感谢分享,这个写的详细

使用特权

评论回复
板凳
小明的同学| | 2021-5-23 19:54 | 只看该作者
时钟系统基本上都是大差不差。

使用特权

评论回复
地板
piteqiu| | 2021-5-24 11:14 | 只看该作者
支持下,如果有类似ST那样的配置软件那就更方便了。

使用特权

评论回复
5
foxsbig| | 2021-6-23 10:44 | 只看该作者
piteqiu 发表于 2021-5-24 11:14
支持下,如果有类似ST那样的配置软件那就更方便了。

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

使用特权

评论回复
6
Betty1299| | 2021-6-23 16:45 | 只看该作者
可以参考官方提供的代码,直接copy一份就好了,基本上时钟也就那么多

使用特权

评论回复
7
Annie556| | 2021-6-23 16:45 | 只看该作者
芯片的时钟配置是个麻烦事儿,如果有自动生成的软件 会好很多

使用特权

评论回复
8
Candic12e| | 2021-6-23 16:46 | 只看该作者
时钟配置基本也就第一次麻烦,之后都是通用的了

使用特权

评论回复
9
B1lanche| | 2021-6-23 16:47 | 只看该作者
时钟树是MCU的灵魂,干吧,基本上这块是比较复杂的了

使用特权

评论回复
10
match007| | 2021-7-12 13:58 | 只看该作者
还是偏向于库函数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1921

主题

6677

帖子

8

粉丝