mv k210.md k210/系统控制器.md
This commit is contained in:
parent
b7d839dc89
commit
e7b6dde91c
|
@ -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_mclk,i2c0~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_mclk,i2c0~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,绕过对应pll;0,不绕过对应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的重置呢?其它外设为什么不记录呢?
|
Loading…
Reference in New Issue