微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 学习STM32打好了基础,你需要知道这些

学习STM32打好了基础,你需要知道这些

时间:07-31 来源:贸泽电子设计圈 点击:

就能改变程序的执行流(这里有很多高级技巧)

 

e、Cortex-M3还在内核水平上搭载了若干特殊功能寄存器,包括:

  • 程序状态字寄存器组(PSRs)

  • 中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI) 

  • 控制寄存器(CONTROL)

Cortex-M3处理器支持两种处理器的操作模式,还支持两级特权操作。

 

两种操作模式分别为:处理者模式和线程模式(thread mode)。引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码——包括中断服务例程的代码。

 

Cortex-M3 的另一个侧面则是特权的分级——特权级和用户级。这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。

 

 

在 CM3 运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序可以访问所有范围的存储器(如果有 MPU,还要 在MPU规定的禁地之外),并且可以执行所有指令。

 

在特权级下的程序可以为所欲为,但也可能会把自己给玩进去——切换到用户级。一旦进入用户级,再想回来就得走"法律程序"了——用户级的程序不能简简单单地试图改写 CONTROL寄存器就回到特权级,它必须先"申诉":执行一条系统调用指令(SVC)。这会触发SVC异常,然后由异常服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改 CONTROL寄存器,才能在用户级的线程模式下重新进入特权级。

 

事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态。

 

 

通过引入特权级和用户级,就能够在硬件水平上限制某些不受信任的或者还没有调试好的程序,不让它们随便地配置涉及要害的寄存器,因而系统的可靠性得到了提高。进一步地,如果配了 MPU,它还可以作为特权机制的补充——保护关键的存储区域不被破坏,这些区域通常是操作系统的区域。

 

(4)内建的嵌套向量中断控制器


Cortex-M3 在内核水平上搭载了一颗中断控制器——嵌套向量中断控制器 NVIC(Nested Vectored Interrupt Controller)。它与内核有很深的"亲密接触"——与内核是紧耦合的。

 

NVIC提供如下的功能:

  • 可嵌套中断支持 

  •  向量中断支持 

  •  动态优先级调整支持 

  •  中断延迟大大缩短 

  •   中断可屏蔽

可嵌套中断支持: 可嵌套中断支持的作用范围很广,覆盖了所有的外部中断和绝大多数系统异常。外在表现是,这些异常都可以被赋予不同的优先级。当前优先级被存储在 xPSR 的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常,处理器就会中断当前的中断服务例程(或者是普通程序),而服务新来的异常——即立即抢占。

 

向量中断支持: 当开始响应一个中断后,CM3会自动定位一张向量表,并且根据中断号从表中找出 ISR的入口地址,然后跳转过去执行。不需要像以前的 ARM那样,由软件来分辨到底是哪个中断发生了,也无需半导体厂商提供私有的中断控制器来完成这种工作。这么一来,中断延迟时间大为缩短。

 

(5)存储器映射
Cortex-M3支持4G存储空间,具体分配如下图:

 

(6)总线接口


Cortex-M3内部有若干个总线接口,以使 CM3能同时取址和访内(访问内存),它们是:

  • 指令存储区总线(两条) 

  • 系统总线 

  • 私有外设总线 

有两条代码存储区总线负责对代码存储区的访问,分别是 I-Code 总线和 D-Code 总线。前者用于取指,后者用于查表等操作,它们按最佳执行速度进行优化。

 

系统总线用于访问内存和外设,覆盖的区域包括 SRAM,片上外设,片外 RAM,片外扩展设备,以及系统级存储区的部分空间。

私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。它们也在系统级存储区。

 

(7)存储器保护单元(MPU) 


Cortex-M3有一个可选的存储器保护单元。配上它之后,就可以对特权级访问和用户级访问分别施加不同的访问限制。当检测到犯规(violated)时,MPU 就会产生一个 fault 异常,可以由fault异常的服务例程来分析该错误,并且在可能时改正它。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top