update k210.md
This commit is contained in:
parent
321114b75f
commit
b7d839dc89
|
@ -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_mclk,i2c0~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频率,两者相除即为启动到现在所过的时间。
|
||||
|
||||
|
|
Loading…
Reference in New Issue