時鐘是單片機運行的基礎,是同步單片機各個模塊工作時序的最小時間單位。時鐘的速度取決于外部晶振或內部RC振蕩電路。單片機擁有豐富的外設,但實際使用的時候只會用到有限的外設,且有的外設需要高速時鐘提升性能,有的外設需要低速時鐘降低功耗或提高抗干擾能力,因此單片機采用多種時鐘源來解決此問題。
下面將詳細介紹如何配置CW32L083產品的系統時鐘。
CW32L083一共有5個系統時鐘來源LSI,LSE,HSI,HSE,PLL;可以按照時鐘頻率分為高速時鐘源和低速時鐘源,也可根據來源分為內部時鐘源和外部時鐘源。
? 外部高速時鐘(HSE)
? 外部低速時鐘(LSE)
? 內部高速時鐘(HSI)
? 內部低速時鐘(LSI)
? 鎖相環時鐘(PLL)
鎖相環時鐘由HSE時鐘或HSI時鐘經鎖相環PLL倍頻(2~12 倍)產生。
下圖為CW32L083的系統內部時鐘樹,由圖可以看到HSI時鐘是由內部高速RC振蕩器HSIOSC經過分頻后產生的,分頻系數是通過內置高頻時鐘控制寄存器SYSCTRL_HSI的DIV位域進行設置,有效分頻系數為1,2,4,6,8,10,12,14,16。系統時鐘SysClk可選的5個時鐘源如上文所示。
圖:CW32L083的系統內部時鐘樹
SysClk分頻可以產生高級高性能總線時鐘HCLK,作為M0+內核,SysTick,DMA,FLASH,CRC,GPIO等模塊的配置時鐘及工作時鐘,分頻系數是通過系統控制寄存器SYSCTRL_CR0的HCLKPRS位域設置,有效分頻系數為2^n(n = 0~7)。而外設時鐘PCLK,是由HCLK經過分頻產生,通過配置系統控制器SYSCTRL_CR0的PCLKPRS位域設置,有效的分頻系數為2^n(n= 0~3),可作為GTIM,BTIM,ATIM等定時器以及SPI,I2C,UART等外設的配置時鐘和工作時鐘。CW32L083還有兩個低速時鐘源,RC10K的時鐘可作為獨立看門狗的計數時鐘以及GPIO端口中斷輸入信號的濾波時鐘使用,RC150K時鐘可以作為LVD和VC數字濾波模塊的濾波時鐘以及GPIO端口中斷輸入信號的濾波時鐘使用。
CW32L083默認系統時鐘為HSIOSC的6分頻,即8MHz時鐘,下面介紹時鐘配置方法,CW32L083有豐富的時鐘配置函數,內部FLASH存儲器支持最快24MHz頻率的操作時鐘,當配置HCLK頻率大于24MHz時,需要通過FLASH控制寄存器FLASH_CR2的WAIT位域來配置插入等待HCLK周期個數。大于24MHz,小于等于48MHz時,需要插入2個等待周期;大于48MHz時,需要插入3個等待周期。
1.HSI的時鐘配置
在HSI小于等于24MHz的時候,可以不用配置FLASH等待周期
RCC_HSI_Enable( RCC_HSIOSC_DIV2 );
//內部高速時鐘2分頻SysClk=24MHz
RCC_HSI_Enable( RCC_HSIOSC_DIV6 );
//內部高速時鐘6分頻SysClk=8MHz,當HSI配置大于24MHz的時候,需要配置FLASH等待周期
__RCC_FLASH_CLK_ENABLE();
//使能FLASH配置時鐘
FLASH_SetLatency(FLASH_Latency_2);
//頻率大于24MHz,小于48MHz需要配置FlashWait=2
RCC_HSI_Enable(RCC_HSIOSC_DIV1);
//內部高速時鐘1分頻SysClk=48MHz
2.HSE的時鐘配置
RCC_HSE_Enable(RCC_HSE_MODE_OSC,16000000,RCC_HSE_DRIVER_NORMAL,RCC_HSE_FLT_CLOSE);
//開啟HSE時鐘,HSE的頻率范圍為4MHz-32MHz
RCC_SysClk_Switch( RCC_SYSCLKSRC_HSE );
//切換系統時鐘為外部高速時鐘
3.LSI的時鐘配置
RCC_LSI_Enable();
//開啟內部低速時鐘LSI
RCC_SysClk_Switch( RCC_SYSCLKSRC_LSI );
//切換系統時鐘到LSI
4.LSE的時鐘配置
RCC_LSE_Enable(RCC_LSE_MODE_OSC,RCC_LSE_AMP_LARGER,RCC_LSE_DRIVER_LARGER);
//開啟外部低速時鐘LSE
RCC_SysClk_Switch( RCC_SYSCLKSRC_LSE );
//切換系統時鐘到LSE
5.PLL的時鐘配置
CW32L083的PLL輸入可以是HSI和HSE,下面以HSE為例
RCC_HSE_Enable( RCC_HSE_MODE_OSC, 16000000, RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE );
//開啟外部高速時鐘HSE,頻率需要根據實際晶體頻率進行填寫
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH,ENABLE); RCC_PLL_Enable(RCC_PLLSOURCE_HSEOSC,16000000,RCC_PLL_MUL_2);
//開啟PLL,PLL輸入為HSE
FLASH_SetLatency(FLASH_Latency_2);
//頻率大于24MHz,小于等于48MHz需要配置FlashWait=2
RCC_SysClk_Switch( RCC_SYSCLKSRC_PLL );
//切換系統時鐘到PLL
上面所描述的是用庫函數來配置CW32L083的系統時鐘,接下來舉例用寄存器來配置64MHz的系統時鐘,思路是先將HSIOSC六分頻得到8MHz的HSI,然后通過PLL倍頻至64MHz。
//開啟HSI時鐘
CW_SYSCTRL->HSI=(5HSI&SYSCTRL_HSI_STABLE_Msk)!=SYSCTRL_HSI_STABLE_Msk)
//Wait stable
{
;
}
//設置PLL參數
CW_SYSCTRL->PLL = (RCC_PLL_WAITCYCLE_16384 | \
((uint32_t)(0x07 << SYSCTRL_PLL_FREQOUT_Pos)) | \
((uint32_t)(0x08 << SYSCTRL_PLL_MUL_Pos)) | \
((uint32_t)(0x01 << SYSCTRL_PLL_FREQIN_Pos)) | \
((uint32_t)(0x03 << SYSCTRL_PLL_SOURCE_Pos)));
// SYSCTRL_PLL_FREQOUT_Pos是PLL輸出時鐘頻率范圍配置因為是輸出64MHz,需要設置為1xx
// SYSCTRL_PLL_MUL_Pos是PLL倍頻系數配置位域,因為本例需倍頻8倍,設置為0x08
// SYSCTRL_PLL_FREQIN_Pos是PLL輸入時鐘頻率范圍配置,本例HSI經分頻之后為8MHz,設置為01
// SYSCTRL_PLL_SOURCE_Pos是PLL輸入時鐘來源選擇,HSI時鐘,設置為11
//使能PLL
CW_SYSCTRL->CR1 |= SYSCTRL_BYPASS | SYSCTRL_CR1_PLLEN_Msk;
//Enable PLL
//等待PLL時鐘穩定
while((CW_SYSCTRL->PLL&SYSCTRL_PLL_STABLE_Msk)!=SYSCTRL_PLL_STABLE_Msk)
{
;
}
CW_SYSCTRL->AHBEN_f.FLASH = 1;
CW_FLASH->CR2 = 0x5A5A0000 | ((uint32_t)0x00000002);
//頻率為64MHz,配置3個等待周期。
//轉換時鐘
CW_SYSCTRL->CR0 = ((((CW_SYSCTRL->CR0 & (~SYSCTRL_BYPASS_MASK)) | SYSCTRL_BYPASS) & (~SYSCTRL_CR0_SYSCLK_Msk)) | ((0x00000002U)));
RCC_SystemCoreClockUpdate(RCC_Sysctrl_GetHClkFreq());
配置完成之后,可以通過RCC_PLL_OUT(),看到輸出頻率。除了上述功能,CW32L083還可以通過配置GPIO口直接輸出時鐘端口,方便用戶進行測試。
RCC_HCLK_OUT() //PA04輸出HCLK時鐘
RCC_PCLK_OUT() //PA03輸出PCLK時鐘
RCC_HSE_OUT() //PC15輸出HSE時鐘
RCC_HSI_OUT() //PB00輸出HSI時鐘
RCC_LSE_OUT() //PB12輸出LSE時鐘
RCC_LSI_OUT() //PD05輸出LSI時鐘
RCC_PLL_OUT() //PC13輸出PLL時鐘
以上是CW32L083時鐘部分的介紹,CW32其他型號亦可參考此篇文檔。
-
微控制器
+關注
關注
48文章
7641瀏覽量
151823 -
單片機
+關注
關注
6041文章
44615瀏覽量
637368 -
mcu
+關注
關注
146文章
17301瀏覽量
352137 -
時鐘
+關注
關注
11文章
1745瀏覽量
131664
發布評論請先 登錄
相關推薦
評論