当前位置:首页 > 电源 > 数字电源
[导读]之前已经设置中断向量表了,下面就要进行设置处理器的模式。对于ARM11,有8种模式,不同的模式,权限是不一样的。在bootloader开发的时候,我们需要将处理器的模式设置为Su

之前已经设置中断向量表了,下面就要进行设置处理器的模式。

对于ARM11,有8种模式,不同的模式,权限是不一样的。在bootloader开发的时候,我们需要将处理器的模式设置为Supervisor模式,即SVC模式。这样,权限就高了,可以访问ARM的所有资源。用户模式的权限是最低的,而且要从用户模式切换到其他模式的话,只能通过异常的方式。

 

 

用户模式(User): ARM处理器正常的程序执行状态

快速中断模式(FIQ): 高速数据传输或通道处理

外部中断模式(IRQ): 通用的中断处理

管理模式(Supervisor): 操作系统使用保护模式

数据访问终止模式(Abort): 当数据或指令预取终止时进入该模式

系统模式(System):运行具有特权的操作系统任务。

这些模式是在CPSR寄存器中设置的。

如下是CPSR寄存器。在最低5位设置处理器的模式。

 

 

以下是5位值对应的模式。

 

 

图中表的后面有跟着寄存器,这是代表在这个模式下,可以访问的寄存器。

我们知道ARM11是有16个寄存器,R0-R15。但是,在不同的模式下,这16个寄存器有的不一样的。即每个模式有自己的寄存器。

 

 

上图,是各个模式下,寄存器的表。

其中R0-R7、R15寄存器和CPSR寄存器,是所有模式都共有的。但是R8-R14就不一样了,有的模式有自己对应的R8-R14寄存器。比如FIQ模式,就有自己的R8-R14,和其他模式的R8-R14不共用。所以这才叫快中断,因为跳转到快中断后,不用备份原来的R8-R14寄存器,因为用的是自己的寄存器。还可以看到,其他模式都是自己的R13寄存器,也就是堆栈寄存器,所以在这些模式下,使用C语言的话,是要重新定义R13的值的。

除了用户模式和系统模式外,其他模式都有SPSR寄存器。这个寄存器就是用来备份跳转模式切换之前那个模式的CPSR的值。这样之前模式的CPSR的值才不会丢失。这样,在切回原模式时,再将SPSR的值给CPSR,就把原模式的CPSR的值也恢复了。因为CPSR的值是很重要的,所以要保证不能丢失。

 

 

下面,就是代码的编写了。

设置SVC模式,其实就是写CPSR寄存器的后5位。将值设置为5’b10011.

代码也比较简单了:

set_svc:

# set CPU mode is SVC and disbale irq fiq

# cpsr[4:0] = 0b10011

mrs r0, cpsr

bic r0, r0, #0x1f

orr r0, r0, #0xd3

msr cpsr, r0

mov pc, lr

先通过mrs指令将CPSR的值读到r0中。

使用bic指令对r0的后5位清零,0x1f = ‘b00011111。

使用orr指令对r0的后8位值设置为’b11010011。后面5位是10011,设置为SVC模式了。前面7位和6位也给设置1了。

 

 

从上图,看出7位和6位是普通控制中断和快中断的。

 

 

从手册中得到,当置1,表示disable对应的中断,这里就是关闭所有中断。

这样,就完成了处理器的模式SVC设置。

对比STM32,因为没有用汇编写过这些代码,所以没有了解STM32的CPU的模式。如果有对这方面了解的,麻烦告知一下。自己以前写STM32代码的时候,根本就没有考虑过这些。现在学ARM11了,对比才去了解了一些STM32的底层的东西。

另外,有谁知道CPSR在上电时候的初始化的值是多少的话,也麻烦告知下。我试了下,不设置处理器的SVC模式,并且不关中断,程序也是可以执行的,后面的点灯也是可以点亮,我猜测的话,默认为芯片上电的时候,处理器是工作在SVC模式下的,并且中断也都是关闭的。

如果是这样的话,那就意味着设置处理器的模式SVC,我们是可以省略这部分代码的,因为默认为就是这样。

但是,这也只是考虑了上电复位的情况,但是如果是复位有效呢?当我们按下复位键的时候,这里的代码还是需要的,因为这个时候,需要将处理器模式转化为SVC,因为有可能程序执行的时候是在User模式下的,这样的话就会有权限的限制,有些地址处理器就访问不了。并且要关闭中断,因为也有可能中断是开启的,不然会跳转到中断去。以上两种情况,复位的代码就不会正常的执行了。所以就需要这两步操作,保证复位的程序是可以正常按照我们写的顺序执行。

所以,我总结,这里的代码是需要的。为什么呢?因为uboot中也有这代码,要是不需要的话,那么uboot中肯定也不会有。Uboot可是行业的老大啊。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭