為了能用示波器看到系統時鍾,決定將系統時鍾輸出到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引腳看見輸出波形了 對比下,兩者是一樣的。
}
下邊是示波器出來的圖:
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引腳看見輸出波形了 對比下,兩者是一樣的。
}
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引腳看見輸出波形了 對比下,兩者是一樣的。
}






