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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM