---
# System prepended metadata

title: F2812的時鐘
tags: [F2812]

---

[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;
```