我的学习总结有点乱,不怪。
1.锁相环频率检测器——pfd(相位频率检测器)
1.功率因数校正电路结构1.1传统功率因数校正
1.2无时钟功率因数校正
1.2预充电功率因数校正
1.3边沿触发式功率因数校正
1.1传统PFD
它由RS触发器组成。
优点:鉴相范围[2-2 \ Pi2,2 \ Pi]宽。
缺点:存在死区(可以通过增加复位延迟来消除死区),电路结构复杂,需要的晶体管数量大。由于多输入逻辑延迟大,电路工作频率不高。而且还有高频动态功耗。
1.2无时钟功率因数校正
参考文献:一种简单的预充电CMOS鉴频鉴相器——1998 JSSC,最早的数控鉴频鉴相器。
特点:电路结构简单,只需要18个mos管。无死区,电平敏感。
缺点:相位检测范围[-\,\],输出受占空比影响。
下图是分别分析优缺点的例子。
假设参考时钟(Fref)和反馈时钟(从机)具有相同的频率,Fref在相位之前。
当Fref=1时:两个nc级最底部的MOS管导通,当Slave信号为1时,DOWN变为1。up变成1。
之后,Fref先变为0,然后DOWN跟随Fref down。B点的高电阻保持不变,当从机变为0时,上行信号拉低。
因此,上升信号的脉冲宽度与从信号的脉冲宽度相同,下降信号的宽度等于Fref的下降沿减去从信号的上升沿。
请考虑以下问题:
1从上面的分析可以看出,NC-PFD是电平敏感的,因此如果输入信号的占空比发生变化,其输出UP和DOWN的脉冲宽度pages也会相应变化。
2.假设频率和从属信号具有相同的频率和相反的相位。频率和从属电平总是相反的,一个是0,另一个是1。此时UP和down始终为0,所以鉴相是不可能的。
当从属信号的滞后相位大于180时,同样,向下的脉冲宽度大于向上的脉冲宽度,导致鉴相误差。
(当从机信号滞后时,上行信号应大于下行信号。)
因此,NC-PFD的鉴相范围[-\,\]
3.假设频率和从属信号的频率和相位相同。按照前面的分析过程,上升和下降信号同时被拉高和拉低。脉冲宽度应等于输入信号的宽度。脉冲宽度足够开启电荷泵开关,没有死区。
1.2预充电功率因数校正
特点:电路结构简单,边沿灵敏,低电平先预充电,高电平信号传输。
缺点:死区,鉴相范围[-\,\]
用以下波形解释上述特征:
当Vref=0时:预充电节点1变为高电平,等待Vref变为高电平。
当Vref=1时:DN输出1。
以同样的方式;以类似的方式
当Vdiv=0时:预充电节点1变为高电平,等待Vref变为高电平。
当Vdiv=1时:UP输出1。
当Vref和Vdiv同时为1时,上下部分同时复位,UP=DOWN=0;由于复位Vref和Vdiv的反向传输,存在一定的传播延迟。
总结以下问题:
1.由于复位信号的传播延迟,当Vref和Vdiv的相位差足够小时,DN和UP的脉冲宽度会很小,这可能只是复位信号的传播延迟。无法打开电荷泵开关,导致死区。
2.从前面的分析可以看出,只有当Vref和Vdiv同时为1时,才会产生复位信号,所以当输入信号同频同相时,它们在任何时候都不是1。鉴相器坏了。
当Vdiv落后Vref超过180度时,与nc-PFD类似,会出现相反的鉴相结果和鉴相误差。
因此:鉴相范围[-\,\]
1.3边沿触发式功率因数校正
f6a5?from=pc”>
沿触发式PFD的电路结构。主体电路由两个带有复位端的D 触
发器和一个或非门组成。优点是线性度好,鉴相范围宽,理想鉴相范围达到(-2π,2π)。性能良好的
D 触发器的设计将是整个边沿式PFD 设计的关键。
由于存在复位时间,也会有死区存在。可以通过加大复位延迟消除死区,是短脉冲宽度足够打开电荷泵开关。
2、ARM 汇编指令 DCD
DCD:数据定义( Data Definition )伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。
语法格式:
标号 DCD(或 DCDU) 表达式
DCD(或 DCDU)伪指令用于分配一片连续的字存储单元并用指定的表达式初始化。其中表达式可以为程序标号或数字表达式。 DCD 也可用 “ &” 代替。用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。
3、中断向量表
中断向量表是一个表,这个表里面存放的是中断向量。中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的,当某个中断被触发以后就会自动跳转到中断向量表中对应的中断服务程序(函数)入口地址处。中断向量表在整个程序的最前面,
我们说 ARM 处理器都是从地址 0X00000000 开始运行的,但是我们学习 STM32 的时候代码是下载到 0X8000000 开始的存储区域中。因此中断向量表是存放到 0X8000000 地址处的,而不是 0X00000000,这样不是就出错了吗?为了解决这个问题,Cortex-M 架构引入了一个新的概念——中断向量表偏移,通过中断向量表偏移就可以将中断向量表存放到任意地址处,中断向量表偏移配置在函数 SystemInit 中完成,通过向 SCB_VTOR 寄存器写入新的中断向量表首地址即可,
第 8 行和第 10 行就是设置中断向量表偏移,第 8 行是将中断向量表设置到 RAM 中,第10 行是将中断向量表设置到 ROM 中,基本都是将中断向量表设置到 ROM 中,也就是地址0X8000000 处。第 10 行用到了 FALSH_BASE 和 VECT_TAB_OFFSET,这两个都是宏,定义如下所示:
因此第 10 行的代码就是:SCB->VTOR=0X080000000,中断向量表偏移设置完成。通过上面的讲解我们了解了两个跟 STM32 中断有关的概念:中断向量表和中断向量表偏移,那么这个跟 I.MX6U 有什么关系呢?因为 I.MX6U 所使用的 Cortex-A7 内核也有中断向量表和中断向量表偏移,而且其含义和 STM32 是一模一样的!只是用到的寄存器不同而已,概念完全相同!
4、NVIC(内嵌向量中断控制器)
中断系统得有个管理机构,对于 STM32 这种 Cortex-M 内核的单片机来说这个管理机构叫做 NVIC,全称叫做 Nested Vectored Interrupt Controller。关于 NVIC 本教程不作详细的讲解,既然 Cortex-M 内核有个中断系统的管理机构—NVIC,那么 I.MX6U 所使用的 Cortex-A7 内核是不是也有个中断系统管理机构?答案是肯定的,不过 Cortex-A 内核的中断管理机构不叫做NVIC,而是叫做 GIC,全称是 general interrupt controller,后面我们会详细的讲解 Cortex-A 内核的 GIC。
Cortex-A7 也有中断向量表,中断向量表也是在代码的最前面。CortexA7 内核有 8 个异常中断,这 8 个异常中断的中断向量表如表。
简单介绍一下这 7 个中断:
①、复位中断(Rest),CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化 SP 指针、DDR 等等。
②、未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。
③、软中断(Software Interrupt,SWI),由 SWI 指令引起的中断,Linux 的系统调用会用 SWI指令来引起软中断,通过软中断来陷入到内核空间。
④、指令预取中止中断(Prefetch Abort),预取指令的出错的时候会产生此中断。
⑤、数据访问中止中断(Data Abort),访问数据出错的时候会产生此中断。
⑥、IRQ 中断(IRQ Interrupt),外部中断,前面已经说了,芯片内部的外设中断都会引起此中断的发生。
⑦、FIQ 中断(FIQ Interrupt),快速中断,如果需要快速处理中断的话就可以使用此中断。
5、GIC 控制器
STM32(Cortex-M)的中断控制器叫做 NVIC,I.MX6U(Cortex-A)的中断控制器叫做 GIC,
GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核中的NVIC。目前 GIC 有 4 个版本:V1~V4,V1 是最老的版本,已经被废弃了。V2~V4 目前正在大量的使用。GIC V2 是给 ARMv7-A 架构使用的,比如 Cortex-A7、Cortex-A9、Cortex-A15 等,V3 和 V4 是给 ARMv8-A/R 架构使用的,也就是 64 位芯片使用的。I.MX6U 是 Cortex-A 内核的,因此我们主要讲解 GIC V2。GIC V2 最多支持 8 个核。ARM 会根据 GIC 版本的不同研发出不同的 IP 核,那些半导体厂商直接购买对应的 IP 核即可,比如 ARM 针对 GIC V2 就开发出了 GIC400 这个中断控制器 IP 核。当 GIC 接收到外部中断信号以后就会报给 ARM 内核,但是ARM 内核只提供了四个信号给 GIC 来汇报中断情况:VFIQ、VIRQ、FIQ 和 IRQ
GIC接收众多的外部中断,然后对其进行处理,最终就只通过四个信号报给 ARM 内核,这四个信号的含义如下:
VFIQ:虚拟快速 FIQ。
VIRQ:虚拟外部 IRQ。
FIQ:快速中断 IRQ。
IRQ:外部中断 IRQ。
VFIQ 和 VIRQ 是针对虚拟化的。