mv k210.md k210/系统控制器.md

This commit is contained in:
shzhxh 2019-06-07 21:52:53 +08:00
parent b7d839dc89
commit e7b6dde91c
1 changed files with 35 additions and 19 deletions

View File

@ -2,7 +2,7 @@
##### PLL
锁相环(Phase Locked Loop)使电路上的时钟和某一外部时钟的相位同步。PLL的主要用途是作为频率合成器产生更宽范围的频率输出。也可以用作抖动滤波器或补充时钟网络的延迟。
锁相环(Phase Locked Loop)使电路上的时钟和某一外部时钟的相位同步。PLL的主要用途是作为频率合成器产生更宽范围的频率输出。也可以用作抖动滤波器或补充时钟网络的延迟。锁相环通过由PD(Phase Detector)、LF(Loop Filter)和VCO(Voltage Controlled Oscillator)三部分组成。
##### APB
@ -58,17 +58,24 @@
设备要取消使能只要将该设备的使能位置0即可。
- 时钟阈值的设置与获取`sysctl_clock_[set | get]_threshold`
- 对应时钟分频值的设置与获取`sysctl_clock_[set | get]_threshold`
不同的外设其值位宽是不一样的共有2、3、4、8、16五种情况。其中aclk_divider(2位)、apb0~2(各3位)由寄存器**clk_sel0**控制。其中sram0~1、ai、dvp、rom的阈值均为4位由寄存器**clk_th0**控制。其中spi0~3的阈值为8位由寄存器**clk_th1**控制。其中timer0~2的阈值为8位由寄存器**clk_th2**控制。其中i2s0~1的阈值为16位由寄存器**clk_th3**控制。其中i2s2的阈值为16位i2s0~1_mclk的阈值为8位由寄存器**clk_th4**控制。其中i2s2_mclki2c0~2的阈值为8位由寄存器**clk_th5**控制。其中wdt0~1的阈值为8位由寄存器**clk_th6**控制。
不同的外设其分频值位宽是不一样的共有2、3、4、8、16五种情况。其中aclk_divider(2位)、apb0~2(各3位)由寄存器**clk_sel0**控制。其中sram0~1、ai、dvp、rom的分频值均为4位由寄存器**clk_th0**控制。其中spi0~3的分频值为8位由寄存器**clk_th1**控制。其中timer0~2的分频值为8位由寄存器**clk_th2**控制。其中i2s0~1的分频值为16位由寄存器**clk_th3**控制。其中i2s2的分频值为16位i2s0~1_mclk的分频值为8位由寄存器**clk_th4**控制。其中i2s2_mclki2c0~2的分频值为8位由寄存器**clk_th5**控制。其中wdt0~1的分频值为8位由寄存器**clk_th6**控制。
设置外设的时钟阈值就是向相应的位写入数据,获取外设的时钟阈值就是从相应的位读取数据。
设置外设的时钟分频值就是向相应的位写入数据,获取外设的时钟分频值就是从相应的位读取数据。
- 时钟选择的设置与获取`sysctl_clock_[set | get]_clock_select`
- 时钟对应时钟源的设置与获取`sysctl_clock_[set | get]_clock_select`
可以从寄存器**pll0~2**相应的pll_bypass位置1来设置绕过相应的PLL。可以从寄存器**pll2**的pll_ckin_sel2置0x3(2位)来使能该时钟。可以从寄存器**clk_sel0**相应的位来使能相应的外设时钟可设置的外设有aclk, spi3, timer0~2。可以从寄存器**clk_sel1**的spi3_sample_clk_sel位来使能该时钟该寄存器仅此一个有效位。
| 时钟 | 时钟源 | 意义 |
| ------------------------------------ | ---------- | -------------------------------------------------------- |
| pll0~2->pll_bypass0~2 | 0, 1 | 1绕过对应pll0不绕过对应pll |
| pll2->pll_ckin_sel2 | 0, 1, 2, 3 | |
| clk_sel0寄存器的aclk, spi3, timer0~2 | 0, 1 | 1设置对应设备为时钟源0不设置对应设备为时钟源 |
| clk_sel1->spi3_sample_clk_sel | 0, 1 | 1设置spi3_sample为时钟源0不设置spi3_sample为时钟源 |
时钟选择的获取就是从如上寄存器中的相应位获取对应的值。
时钟源的设置就是为如上寄存器的相关位指定时钟源。
时钟源的获取就是从如上寄存器中的相应位获取对应的值。
- 获取PLL的频率`sysctl_pll_get_freq`
@ -80,8 +87,6 @@
# FIN : 如PLL0~1则为26000000UL如PLL2则从pll2.pll_ckin_sel2获取对应select(可能是SOURCE_IN0, SOURCE_PLL0, SOURCE_PLL1)如SOURCE_IN0则为26000000UL,如SOURCE_PLL0~1则按上述公式再算一遍。
```
- 获取各种设备的基本时钟频率`sysctl_clock_get_freq`
| clock | divider | 频率 |
@ -101,17 +106,15 @@
| under **APB1**时钟域(AES, OTP, RTC) | even | 如为AES或OTP则源频率是APB1的时钟频率如为RTC则源频率是IN0的时钟频率。结果频率与源频率相等 |
| under **APB2**时钟域 | even | Do nothing即源频率和结果频率均为0 |
- 设备重置与获取重置状态`sysctl_reset`, `sysctl_get_reset_status`
重置的过程就是将寄存器**soft_rest**或**peri_rest**中对应的位置1再置0。
获取重置状态就是从寄存器**reset_status**中依次读取相应的位如某一位为1则表明该位对应的外设被重置了。可以获取重置状态的外设有wdt1, wdt2, soft。最后应该是通过给reset_sts_clr位置1来清空外设的重置状态。
- PLL的使能与取消使能`sysctl_pll_[enable | disable]`
- PLL的使能与禁用`sysctl_pll_[enable | disable]`
寄存器**pll0~2**分别控制相应PLL的使能与取消全能
寄存器**pll0~2**分别控制相应PLL的使能与禁用
使能的过程:
@ -126,7 +129,7 @@
sysctl->pll.pll_reset = 0
```
取消使能的过程:
禁用的过程:
```
sysctl->pll.pll_bypass = 1 // 绕过pll
@ -141,20 +144,28 @@
寄存器**misc**的spi_dvp_data_enable位置1则使能置0则不使能。
- 设置io电源模式`sysctl_set_power_mode`
- 设置FPIOA电源模式`sysctl_set_power_mode`
电源模式共有两种3.3V和1.8V。寄存器**power_sel**共可选择8种power bank如电源模式选择1.8V则相应的power bank位置1如电源模式选择3.3V则相应的power bank位置0。
电源模式共有两种3.3V和1.8V。寄存器**power_sel**共可选择8种power bank(即IO电源域编号)如电源模式选择1.8V则相应的power bank位置1如电源模式选择3.3V则相应的power bank位置0。
- CPU频率的获取与设置`sysctl_cpu_[get | set]_freq`
获取CPU频率固定为390000000
获取CPU频率固定为390000000.
设置CPU的频率实际上就是设置PLL0的频率以IN0为源频率以`(clk_sel0->aclk_divider_sel + 1) * 2 * freq`为结果频率计算出对应的pll寄存器相关位的值并进行设置。
- 初始化PLL的频率`sysctl_pll_set_freq`
- 设置PLL的频率`sysctl_pll_set_freq`
1. 如为PLL0则设置寄存器clk_sel0的aclk_sel位为0目的是为了让CPU时钟变为XTAL
2. 设置对应pll寄存器的pll_out_en位为0目的是使对应pll输出失效
3. 设置对应pll寄存器的pll_pwrd位为0目的是关闭对应的pll
4. 设置pll的新值如为pll2则以pll2->pll_ckin_sel为源计算结果频率如为其它pll则以IN0为源计算结果频率
5. 设置对应pll寄存器的pll_pwrd位为1目的是开启对应的pll
6. 设置对应pll寄存器的pll_reset位为1目的是重置对应的pll
7. 设置寄存器pll_lock里与pll对应的pll_slip_clear位为1清空对应pll的slip
8. 设置对应pll寄存器的pll_out_en位为1目的是开启对应pll的输出
9. 如为PLL0则设置寄存器clk_sel0的aclk_sel位为1目的是为了让CPU时钟变为PLL
10. 最终return第4步算出的结果频率。
- 中断的使能与取消使能`sysctl_[enable | disable]_irq`
@ -167,6 +178,11 @@
##### 待解决的问题
- 不知道PLL的具体作用。
- 不知道时钟的threshold的具体作用。
threshold在kendryte的编程指南里翻译为分频值似乎不是词典里翻译的阈值的意思。
- 外设重置可以理解为重置外设的寄存器,那么软重置是什么意思呢?
- 为什么重置状态寄存器只记录wdt0~1和soft的重置呢其它外设为什么不记录呢