打印
[其他ST产品]

STM32 RCC配置时钟 MCO输出实验

[复制链接]
864|45
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
引言:微控制器允许输出时钟信号到外部MCO管脚。配置选择外部HSE时钟输入12MHz,作为PLL时钟源,经过6倍倍频到72MHz后作为系统时钟(通常的配置是HSE=8MHz,PLL 的倍频因子为9,配置流程同理),通过MCO输出系统时钟SYSCLK,芯片:STM32F103VCT6。


使用特权

评论回复
沙发
过期的塔头|  楼主 | 2022-8-24 14:23 | 只看该作者
1、时钟树中工作流程


使用特权

评论回复
板凳
过期的塔头|  楼主 | 2022-8-24 14:25 | 只看该作者
上图所示,时钟树中工作流程为1,2,3,4,5,6。

1:HSE OSC,外部HSE输入12MHz时钟信号;

2:PLLXTPRE,HSE分频器作为PLL输入,此处选择不分频;(可以选择不分频,或者2分频)

3:PLLSRC,HSE时钟作为PLL输入时钟;

4:PLLMUL,PLL倍频系数,此处设置为6,得到PLLCLK;

5: SW,系统时钟SYSCLK选择PPLLCLK;(如图,这里系统时钟有三种选择,HSI,HSE,PPLLCLK)

6:MCO,此处选择输出SYSCLK信号。(MCO可以输出四个时钟信号SYSCLK,HSI,HSE,除2的PLL时钟,需要配置相应的输出管脚及功能)

使用特权

评论回复
地板
过期的塔头|  楼主 | 2022-8-24 14:26 | 只看该作者
2、程序的实现(基于寄存器)

由上面步骤可知,需要用到以下寄存器红色框中的位。

(1)所用到的寄存器

时钟控制寄存器(RCC_CR)

使用特权

评论回复
5
过期的塔头|  楼主 | 2022-8-24 14:27 | 只看该作者
时钟配置寄存器(RCC_CFGR)

使用特权

评论回复
6
过期的塔头|  楼主 | 2022-8-24 14:29 | 只看该作者
APB2外设时钟使能寄存器(RCC_APB2ENR)

使用特权

评论回复
7
过期的塔头|  楼主 | 2022-8-24 14:30 | 只看该作者
端口配置高寄存器(GPIOx_CRH)

使用特权

评论回复
8
过期的塔头|  楼主 | 2022-8-24 14:31 | 只看该作者
(2)代码实现
#include "sys.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void Stm32_Clock_Init()

   {
                uint8_t temp=0;      /*  定义temp  */
                RCC_DeInit ();     /*  复位RCC  */
                RCC->CR|=1<<16;     /*  HSE使能  */
                while(!(RCC->CR>>17));     /*  判断HSE是否Ready  */
                RCC->CFGR|=1<<16;     /*  配置HSE时钟作为PLL时钟输入  */
                RCC->CFGR|=0x00100000;     /*  PLL 6倍输出  */
                RCC->CR|=1<<24;     /*  PLL使能  */
                while(!(RCC->CR>>25));     /*  判断PLL时钟是否Ready  */
                RCC->CFGR|=0x02;     /*  选择PLL为SYSCLK  */
                while(temp!=0x02)     /*  判断SYSCLK是否设置成功  */
                {
                        temp=RCC->CFGR>>2;     
                        temp&=0x03;
                }
        }


int main(void)
{

        Stm32_Clock_Init();
                RCC->APB2ENR|=1<<2;     /* IOPA使能   */
                GPIOA->CRH&=0xFFFFFFF0;     /*  PA8输出,CHR后四位清零  */
                GPIOA->CRH|=0x0000000B;     /*  推挽输出,最高50MHZ  */
                RCC->CFGR|=4<<24;     /*  SYSCLK输出  */
                //RCC->CFGR|=5<<24;     /*  HSI输出  */
                //RCC->CFGR|=6<<24;     /* HSE输出   */
                //RCC->CFGR|=7<<24;     /* PLL 2分频后输出 */


}

使用特权

评论回复
9
过期的塔头|  楼主 | 2022-8-24 14:32 | 只看该作者
(3)代码解释

RCC->CR|=1<<16;     

RCC_CR中第16位置1,HSE使能

使用特权

评论回复
10
过期的塔头|  楼主 | 2022-8-24 14:33 | 只看该作者
while(!(RCC->CR>>17));     

RCC_CR中第17位置1,判断HSE是否Ready

使用特权

评论回复
11
过期的塔头|  楼主 | 2022-8-24 16:07 | 只看该作者
RCC->CFGR|=1<<16;   

RCC_CFGR中第16位置1,配置HSE时钟作为PLL时钟输入

使用特权

评论回复
12
过期的塔头|  楼主 | 2022-8-24 16:07 | 只看该作者
RCC->CFGR|=0x00100000;   

RCC_CFGR中第18-21位为0100,PLL 6倍频输出

使用特权

评论回复
13
过期的塔头|  楼主 | 2022-8-24 16:10 | 只看该作者
RCC->CR|=1<<24;   

RCC_CR中第24位置1,打开PLL

使用特权

评论回复
14
过期的塔头|  楼主 | 2022-8-24 16:11 | 只看该作者
while(!(RCC->CR>>25));   

RCC_CR中第25位置1,判断PLL时钟是否Ready

使用特权

评论回复
15
过期的塔头|  楼主 | 2022-8-24 16:11 | 只看该作者
RCC->CFGR|=0x02;   

RCC_CFGR中第0-1位置为10, 选择PLL为系统时钟SYSCLK

使用特权

评论回复
16
过期的塔头|  楼主 | 2022-8-24 16:12 | 只看该作者
while(temp!=0x02)     

{

temp=RCC->CFGR>>2;     

temp&=0x03;

}

判断SYSCLK是否设置成功,若位3:2为10,则PLL作为系统时钟就绪  

使用特权

评论回复
17
过期的塔头|  楼主 | 2022-8-24 16:13 | 只看该作者

使用特权

评论回复
18
过期的塔头|  楼主 | 2022-8-24 16:14 | 只看该作者
Stm32_Clock_Init();  

系统时钟初始化

RCC->APB2ENR|=1<<2;  

RCC_APB2ENR中第二位置1,IOPA使能,此时系统时钟为72MHz,选择APB2外设时钟使能寄存器,(APB1最高频率为36MHz),且由硬件原理图知MCO输出引脚为PA8,因此需要配置IOPA8;

使用特权

评论回复
19
过期的塔头|  楼主 | 2022-8-24 16:15 | 只看该作者

GPIOA->CRH&=0xFFFFFFF0;   

由于是PA8引脚输出,端口8属于高位,选择端口配置高寄存器,有前面的寄存器GPIOx_CRH知其 复位值并不为0,这里需要用到该寄存器的后四位(PA8引脚)进行输出管脚配置,因此需要将后四位先清零。

使用特权

评论回复
20
过期的塔头|  楼主 | 2022-8-24 16:16 | 只看该作者
GPIOA->CRH|=0x0000000B;     

MCO属于输出模式,且配置为推挽输出,则GPIOA_CRH寄存器的后四位配置为1011,即十六进制的B。

使用特权

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

本版积分规则

78

主题

923

帖子

0

粉丝