update k210.md

This commit is contained in:
shzhxh 2019-06-07 16:19:24 +08:00
parent 321114b75f
commit b7d839dc89
1 changed files with 37 additions and 25 deletions

View File

@ -48,7 +48,7 @@
##### 系统控制器的功能
- 外设时钟的使能或取消使能
- 外设时钟的使能或取消使能`sysctl_clock_[enable | disable]`
共有三条总线(apb0, apb1, apb2),所有外设都分配在这三条总线上。在**clk_en_cent**寄存器上有3位分别控制这三条总线时钟的使能或取消使能。
@ -58,19 +58,19 @@
设备要取消使能只要将该设备的使能位置0即可。
- 时钟阈值的设置与获取
- 时钟阈值的设置与获取`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**控制。
设置外设的时钟阈值就是向相应的位写入数据,获取外设的时钟阈值就是从相应的位读取数据。
- 时钟选择的设置与获取
- 时钟选择的设置与获取`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位来使能该时钟该寄存器仅此一个有效位。
时钟选择的获取就是从如上寄存器中的相应位获取对应的值。
- 获取PLL的频率
- 获取PLL的频率`sysctl_pll_get_freq`
```
FOUT = FIN / NR * NF /OD # 输出频率 = 输入频率 / R分频器 * N计数器 / od
@ -82,29 +82,34 @@
- 获取各种设备的基本时钟频率
- 获取各种设备的基本时钟频率`sysctl_clock_get_freq`
| clock | divider | 频率 |
| -------------------------------- | ------- | ------------- |
| IN0 | | 26000000UL |
| directly under PLL时钟域(PLL0~2) | gated | 对应PLL的频率 |
| directly under ACLK时钟域 | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| clock | divider | 频率 |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------ |
| **IN0** | | 源频率是26000000UL结果频率与源频率相等 |
| directly under **PLL**时钟域(PLL0~2) | gated | 源频率是对应PLL的频率结果频率与源频率相等 |
| directly under **ACLK**时钟域(CPU, DMA, FFT, ACLK, HCLK) | | 从寄存器clk_sel0的aclk位取对应的值如为0表示没有选择aclk则源频率为IN0的频率如为1表示选择了aclk则源频率的算法为(PLL0的频率)/(2ULL << ACLK的时钟阈值)结果频率与源频率相等 |
| under **ACLK**时钟域(SRAM0~1, ROM, DVP) | gated | 源频率是ACLK的时钟频率结果频率的算法为(源频率)/(设备对应的阈值 + 1) |
| under **ACLK**时钟域(ABP0~2) | even | 源频率是ACLK的时钟频率结果频率的算法为(源频率)/(设备对应的阈值 + 1) |
| under **AI**时钟域 | gated | 源频率是PLL1的时钟频率结果频率的算法为(源频率)/(AI的阈值 + 1) |
| under **I2S**时钟域(I2S0~2) | even | 源频率是PLL2的时钟频率结果频率的算法为(源频率)/(对应设备的阈值 + 1)/2 |
| under **WDT**时钟域(WDT0~1) | even | 源频率是IN0的时钟频率结果频率的算法为(源频率)/(对应设备的阈值 + 1)/2 |
| under **PLL0**时钟域(SPI0~2, I2C0~2) | even | 源频率是PLL0的时钟频率结果频率的算法为(源频率)/(对应设备的阈值 + 1)/2 |
| under **PLL0_SEL**时钟域(SPI3, TIMER0~2) | even | 从寄存器clk_sel0相应的位获取对应的值如为0表示没有选择对应设备的时钟则源频率为IN0的频率如为1表示选择了对应设备的时钟其源频率为PLL0的频率。对于SPI3结果频率的算法是(源频率)/(SPI3的阈值 + 1)/2对于TIMER0~2结果频率的算法是(源频率)/(TIMER2的阈值 + 1)/2 |
| under **MISC**时钟域 | even | 无代码,仅注释,目前无任何意义 |
| under **APB0**时钟域(GPIO, UART1~3, FPIOA, SHA) | even | 源频率为APB0的时钟频率结果频率与源频率相等 |
| 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的使能与取消使能
- PLL的使能与取消使能`sysctl_pll_[enable | disable]`
寄存器**pll0~2**分别控制相应PLL的使能与取消全能。
@ -128,27 +133,34 @@
sysctl->pll.pll_pwrd = 0 // 关闭pll
```
- 选择外设DMA通道握手信号
- 选择外设DMA通道握手信号`sysctl_dma_select`
DMA一共有6个通道每个通道占6位。前5个通道在寄存器**dma_sel0**第6个通道在寄存器**dma_sel1**。每个通道可选择的外设有SSI, I2C, UART, AES, SHA, AI, FFT, I2S。
- 设置spi0和dvp数据
- 设置spi0和dvp数据`sysctl_set_spi0_dvp_data`
寄存器**misc**的spi_dvp_data_enable位置1则使能置0则不使能。
- 设置io电源模式
- 设置io电源模式`sysctl_set_power_mode`
电源模式共有两种3.3V和1.8V。寄存器**power_sel**共可选择8种power bank如电源模式选择1.8V则相应的power bank位置1如电源模式选择3.3V则相应的power bank位置0。
- CPU频率的获取与设置
- CPU频率的获取与设置`sysctl_cpu_[get | set]_freq`
- 初始化PLL的频率
获取CPU频率固定为390000000
- 中断的使能与取消使能
- 初始化PLL的频率`sysctl_pll_set_freq`
1. 如为PLL0则设置寄存器clk_sel0的aclk_sel位为0目的是为了让CPU时钟变为XTAL
2. 设置对应pll寄存器的pll_out_en位为0目的是使对应pll输出失效
- 中断的使能与取消使能`sysctl_[enable | disable]_irq`
通过设置**mie**和**mstatus**相应的位实现。
- 获取从启动到现在所用的时间
- 获取从启动到现在所用的时间`sysctl_get_time_us`
从**mcycle**获取CPU周期数从`sysctl_clock_get_freq()`获取CPU频率两者相除即为启动到现在所过的时间。