[TOC] # 時鐘的產生 ## 時鐘電路 - 見 <手把手教你DSP> 第8.1節,實驗室電路板外掛的晶振即為常用的30MHz - ![image](https://hackmd.io/_uploads/rk-XpmOCR.png =70%x) ## 暫存器設定 - 書中提及。時鐘頻率常用 150 MHz,而如同書中提及的,在DSP281x_Example.h 預設也是使用150MHz ``` c++= /* Only one statement should be uncommented. Example: CLKIN is a 30MHz crystal. In step 1 the user specified PLLCR = 0xA for a 150Mhz CPU clock (SYSCLKOUT = 150MHz). In this case, the CPU_RATE will be 6.667L Uncomment the line: #define CPU_RATE 6.667L -----------------------------------------------------------------------------*/ #define CPU_RATE 6.667L // for a 150MHz CPU clock speed (SYSCLKOUT) //#define CPU_RATE 7.143L // for a 140MHz CPU clock speed (SYSCLKOUT) //#define CPU_RATE 8.333L // for a 120MHz CPU clock speed (SYSCLKOUT) ``` - PLLCR暫存器儲存PLL的值。配合外掛的30 MHz晶振,需要設置PLLCR為10,CLKIN的頻率才會是 30*(10/2) = 150MHz - 這在[DSP的初始化](https://hackmd.io/vGiH_bLMTEC1baO3HxS5NA)範例中,InitSysCtrl() 函式內的 InitPll(0xA) 一行可發現確實有呼應設定 # 其他時鐘和系統相關暫存器 ## 其他(子)時鐘 - 整個DSP除了有時鐘電路生成的 CLKIN 進入 CPU 之外,各個module電路也需要時鐘信號才能工作 - 這些module使用的是SYSCLKOUT時鐘,並且不同module使用的時鐘也各自有暫存器做設置 - ![image](https://hackmd.io/_uploads/rkFwx4u0A.png =80%x) - ![image](https://hackmd.io/_uploads/r1WQg4ORR.png) ## HSPCLK - 這邊特別關注高速時鐘HSPCLK的部分,因為他為後續提及的 EV 和 ADC 提供時鐘源 - 有使用到 EV 和 ADC 的話,決定EV Timer或ADC採樣頻率的部分可能都需要依據需求決定HSPCLK的頻率 ### 使用HSPCLK相關的暫存器 - **PCLKCR** - 控制各時鐘是否啟用 - 在[DSP的初始化](https://hackmd.io/vGiH_bLMTEC1baO3HxS5NA)範例中,同樣是 InitSysCtrl() 函式內呼叫的 InitPeripheralClocks() 函式可發現確實有有設定PCLKCR啟用這部分的時鐘 - **<font color="red">HISPCP</font>** - HSPCLK的預除器,僅由3個bits做控制 - ![image](https://hackmd.io/_uploads/r10m_4Y0R.png =70%x) ### 程式語法範例 - 以修改高速時鐘的預除器為例 ``` c++= #define HSPCLK_PSC_1 0 #define HSPCLK_PSC_2 1 #define HSPCLK_PSC_4 2 #define HSPCLK_PSC_6 3 #define HSPCLK_PSC_8 4 #define HSPCLK_PSC_10 5 #define HSPCLK_PSC_12 6 #define HSPCLK_PSC_14 7 EALLOW; //This is needed to write to EALLOW protected registers SysCtrlRegs.HISPCP.all = HSPCLK_PSC_10;// HSPCLK = SYSCLKOUT/HSPCLK_PSC_10 EDIS; ```