皇冠新体育APP

IT技术之家

笔记(STM32篇)day8——系统时钟配置、MCO输出系统时钟_stm32 时钟输出_NYMuggle

发布公告用时:2023-08-24 10:30:37 嵌入式 96次 标签:stm32 单片机 嵌入式硬件
系统时钟配置、MCO输出系统时钟...

目录

一、钟表框图 二、手机配置进程 1、装置钟表系统配置函数公式 2、MCO选配 规范

一、时钟框图

? ? ? ? 如图只是STM32F10x的数字时钟软件系统框图,此页用的正点原子团的图,左边四位蓝色的的对应是: ????????迅速内部管理RC挂钟(HSI):8MHz,准确度差,受的电压室温干扰。 ????????绕城高速第三方晶振闹钟(HSE):4-16MHz,一半用8MHz,惯用HSE为软件系统闹钟。 ????????高转速外面晶振秒表(LSE):32.768kHz,一般的给RTC做秒表源。 ? ? ? ? 快速室内RC钟表(LSI):30-60kHz,通常情况下给独有看门狗或自行呼唤单园做钟表源。 ? ? ? ? 只能根据框图,AHB操作设备闹钟SYSCLK,SYSCLK有HSI、HSE还有PLLCLK六种的选择,首次增加操作PLLCLK当做设备闹钟,从HSE(8MHz)经途PLL倍频至72MHz。其身,AHB和ABP2一般的给72MHz,AHB1为36MHz。

????????

二、配置过程

1、系统时钟配置函数

? ? ? ? 配置单按序详细: ? ? ? ? 0、RCC原始化;

????????1、开启HSE ,并等待 HSE 稳定;
????????2、设置 AHB、APB2、APB1的预分频因子;
????????3、设置PLL的时钟来源,和PLL的倍频因子,设置各种频率主要就是在这里设置;
????????4、开启PLL,并等待PLL稳定;
????????5、把PLLCK切换为系统时钟SYSCLK;
????????6、读取时钟切换状态位,确保PLLCLK被选为系统时钟。

? ? ? ? 此地真接贴编号,整体性只是 RCC使能并超时阶段位完美后,从中系统化框图的右方,也即外设部位,往左设置(AHB、APB1、APB2次数,PLL种类或者次数设置,系统化秒表种类设置)。
void HSE_SYSCLK( uint32_t pllmul)
{
	RCC_DeInit();		//先初始化RCC
	ErrorStatus HSEStatus;  //枚举变量:0为ERROR,1为SUCCESS
	RCC_HSEConfig(RCC_HSE_ON);		//使能HSE
	HSEStatus = RCC_WaitForHSEStartUp();		//等待RCC稳定,稳定后返回SUCCESS
	if (HSEStatus == SUCCESS)
  {
    
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);		// 使能FLASH 预存取缓冲区
    FLASH_SetLatency(FLASH_Latency_2);		//延迟设置,CPU等待FLASH两个周期,根据SYSCLK频率设置
		
		//此处开始可以看成从后往前配置,即从外设时钟到锁相环
    RCC_HCLKConfig(RCC_SYSCLK_Div1);   // AHB预分频因子设置为1分频,HCLK = SYSCLK 
    RCC_PCLK2Config(RCC_HCLK_Div1); 	// APB2预分频因子设置为1分频,PCLK2 = HCLK
    RCC_PCLK1Config(RCC_HCLK_Div2);// APB1预分频因子设置为1分频,PCLK1 = HCLK/2 

    // 设置PLL时钟来源为HSE,设置PLL倍频因子
	// PLLCLK = 8MHz * pllmul
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1, pllmul);   
		
    RCC_PLLCmd(ENABLE); 	// 开启PLL  
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)		// 等待 PLL稳定
    {
    }
		
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);		// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK

    // 读取时钟切换状态位,确保PLLCLK被选为系统时钟
    while (RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  else
  { // 如果HSE开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理
		// 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,HSI是内部的高速时钟,8MHZ
    while (1)
    {
    }
  }
}

2、MCO配置

? ? ? ? 首先,MCO是和PA8的端口复用,作为输出,应该配置模式为复用推挽输出,同时,在系统时钟作为输出至MCO引脚时,保证输出时钟频率不超过50MHz (I/O口最高频率)。其余操作与正常外设相同,先声明GPIO结构体,使能APB2时钟,引脚、模式、速率三个成员配置,最后初始化这个结构体,之后就可以在PA8口用示波器看系统时钟频率(MCO可以查看SYSCLK、HSI、HSE、PLL/2四个频率,在RCC_CFGR中配置)

void MCO_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	// 开启GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 选择GPIO8引脚
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	
	//设置为复用功能推挽输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	
	//设置IO的翻转速率为50M
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	// 初始化GPIOA8
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

参考

[野火?]STM32库搭建实用技巧经验指导意见——应用于野火指导意见者搭建板 — [野火]STM32库搭建实用技巧经验指导意见——应用于野火指导意见者搭建板 word表格