• STM32 RCC实验 MCO脚输出时钟波形


    为了能用示波器看到系统时钟,决定将系统时钟输出到MCO引脚上去。
    弄了一晚上,看见波形了。
    首先建立空的工程,将下面三行代码注释掉:
                    ;IMPORT  SystemInit          ;删除SystemInit自己写RCC初始化函数
                    ;LDR     R0, =SystemInit
                    ;BLX     R0    
    下面是设置函数,使用HSI作为系统时钟,不实用PLL,直接将HSI输出到MCO引脚:
    void My_RccInitMCOHSI(void)
    {
        uint8_t temp;
        My_Rcc_DeInit();
        RCC->CR |= 1<<0;  //复位HSION  开启内部时钟;其实内部时钟不用管的,开机自动使用内部时钟。
        while(!(RCC->CR>>1));    //检查HSI是否就绪
        RCC->CFGR &= (~0x03);     //清零CFGR的0、1位  HSI作为系统时钟   
        while(temp!=0x00)     //读取CFGR的2、3为,判断是否是HSI作为系统时钟设置
        {  
            temp=RCC->CFGR>>2;
            temp&=0x03;
        }  
        //此时HSI已经成为系统时钟
        //HSI时钟就绪后,直接输出到MCO(PA8)
        RCC->APB2ENR |= 1<<2;    //使能PA时钟
        RCC->APB2ENR|=1<<5;    //使能PORTD时钟   
        GPIOA->CRH&=0XFFFFFFF0;
        GPIOA->CRH|=0X0000000B;//PA8 推挽输出(MCO)
    //    //设置MCO输出内部HSI时钟
        RCC->CFGR |= 5<<24;       //MCO输出HSI时钟
        //RCC->CFGR |= 4<<24;    MCO输出系统时钟SYSCLK
        //此时就可以在PA8即MCO引脚看见输出波形了   对比下,两者是一样的。
    }
    下边是示波器出来的图:

    HSI

    HSE直接作为SYSCLK。与HSI相似
    设置方法如下,代码中有注释:
    void My_RccInitMCOHSE(void)
    {
    uint8_t temp;
    My_Rcc_DeInit();
    RCC->CR |= 1<<16;  //开启HSEON  开启外部时钟。
    while(!(RCC->CR>>17));    //等待HSE就绪

    //选择HSE作为系统时钟
    RCC->CFGR |= 0x01;

    while(temp!=0x01)     //读取CFGR的2、3为,判断是否是HSE作为系统时钟设置
    {  
      temp=RCC->CFGR>>2;
      temp&=0x03;
    }  
    //此时HSE已经成为系统时钟
    //HSE时钟就绪后,直接输出到MCO(PA8)
    RCC->APB2ENR |= 1<<2; //使能PA时钟
    GPIOA->CRH&=0XFFFFFFF0;
    GPIOA->CRH|=0X0000000B;//PA8 推挽输出(MCO)

    //设置MCO输出内部HSE时钟
    RCC->CFGR |= 0x06<<24;    //MCO输出HSE时钟
    //RCC->CFGR |= 4<<24; MCO输出系统时钟SYSCLK
    //此时就可以在PA8即MCO引脚看见输出波形了   对比下,两者是一样的。
    }

    IMAG0813

    PLL部分只放代码和图,刚才写了半天,提示2分钟只能提交5次信息,然后就没了。
    郁闷的不想再写了
    void My_RccInitMCOPLL(uint8_t PLL)
    {
        uint8_t temp;
        My_Rcc_DeInit();
        RCC->CR |= 1<<16;  //开启HSEON  开启外部时钟。
        while(!(RCC->CR>>17));    //等待HSE就绪
        //选择HSE作为系统时钟
        //RCC->CFGR |= 0x01;
        //设置PLL倍频数
        PLL -= 2;       //根据PLL倍频系数与RCC->CFGR的18到21位得出(PLLMUL)
        RCC->CFGR |= PLL<<18;
        RCC->CFGR |= 1<<16;  //HSE作为PLL时钟源
        RCC->CR |= 1<<24;
        while(!(RCC->CR>>25));//等待PLL锁定
        //选择PLL输出作为系统时钟源   
        RCC->CFGR |= 0x02;      
        while(temp!=0x02)     //读取CFGR的2、3为,判断是否是HSE作为系统时钟设置
        {  
            temp=RCC->CFGR>>2;
            temp&=0x03;
        }  
        //此时HSE已经成为系统时钟
        //HSE时钟就绪后,直接输出到MCO(PA8)
        RCC->APB2ENR |= 1<<2;    //使能PA时钟
        GPIOA->CRH&=0XFFFFFFF0;
        GPIOA->CRH|=0X0000000B;//PA8 推挽输出(MCO)
        //设置MCO输出内部HSE时钟
        RCC->CFGR |= 0x07<<24;       //MCO输出HSE时钟
        //RCC->CFGR |= 4<<24; //    MCO输出系统时钟SYSCLK
        //此时就可以在PA8即MCO引脚看见输出波形了   对比下,两者是一样的。
    }

    IMAG0814

    IMAG0816

    IMAG0817

    IMAG0819

    Technorati 标签: STM32,RCC,MCO
  • 相关阅读:
    [LeetCode] 638. Shopping Offers
    [LeetCode] 1436. Destination City
    [LeetCode] 405. Convert a Number to Hexadecimal
    [LeetCode] 1909. Remove One Element to Make the Array Strictly Increasing
    [LeetCode] 1475. Final Prices With a Special Discount in a Shop
    [LeetCode] 650. 2 Keys Keyboard
    [LeetCode] 1382. Balance a Binary Search Tree
    [LeetCode] 917. Reverse Only Letters
    [LeetCode] 1189. Maximum Number of Balloons
    [LeetCode] 447. Number of Boomerangs
  • 原文地址:https://www.cnblogs.com/zyqgold/p/2477383.html
Copyright © 2020-2023  润新知