LM3s8962学习笔记

来源:互联网 发布:洛阳农村淘宝招聘 编辑:程序博客网 时间:2024/05/01 04:27

1、  LM3S存储空间分配

  

 

其中0~0.5G映射为flash空间,0.5G~1G映射为SRAM空间。

 

2、  Cortex-M3启动机制

       Flash空间起始地址处必须存放向量表(在程序代码开始运行后,向量表的基址可以改变)。硬件复位时,NVIC_VTABLE复位为0,向量表位于Flash空间起始地址0x00000000处。

    向量表是异常产生时获取异常处理函数入口的一块连续内存,每一个异常都在向量表固定的地址偏移处(偏移地址以字对齐),通过该偏移地址可以获取异常处理函数的入口指针。向量表中前4个字如下:

       dcd     g_pulStack + (STACK_SIZE * 4)   // Offset 00: Initial stack pointer

    dcd     ResetISR - 0x20000000           // Offset 04: Reset handler

    dcd     NmiSR                           // Offset 08: NMI handler

dcd     FaultISR                        // Offset 0C: Hard fault handler

分别为:主堆栈栈顶地址、复位处理函数、NMI (不可屏蔽中断)ISR地址、故障ISR地址。其中,dcd 是一个伪指令,分配连续的一字节为单位的存储单元

 

 

3Cortex-M3的另一个创新在于 嵌套向量中断控制器 NVIC Nested Vector Interrupt Controller)。相对于ARM7使用的外部中断控制器,Cortex-M3内核中集成了中断控制器,芯片制造厂商可以对其进行配置,提供基本的32个物理中断,具有8层优先级,最高可达到240个物理中断和256个中断优先级。此类设计是确定的且具有低延迟性,特别适用于汽车应用。

       CM3 的所有中断机制都由 NVIC 实现。除了支持 240 条中断之外,NVIC 还支持 1641=11 个内部异常源,可以实现 fault 管理机制。结果,CM3 就有了 256 个预定义的异常类型。  

  NVIC使用的是基于堆栈的异常模型。在处理中断时,将程序计数器,程序状态寄存器,链接寄存器和通用寄存器压入堆栈,中断处理完成后,在恢复这些寄存器。堆栈处理是由硬件完成的,无需用汇编语言创建中断服务程序的堆栈操作

 

4CortexM3 处理器拥有 R0R15 的寄存器组。其中 R13 作为堆栈指针 SPSP 有两个,但在同一刻只能有一个可以看到,这也就是所谓的“banked”寄存器。 

 

 

 

 

5R0R1232 位通用寄存器,用于数据操作。但是注意:绝大多数 16 Thumb 指令只能访问 R0R7,而 32 Thumb2 指令可以访问所有寄存器。Thumb2允许 32 位指令和 16 位指令水乳交融,代码密度与处理性能两手抓,两手都硬,不需要在两种模式下来回切换。

 

6CortexM3 拥有两个堆栈指针,它们是 banked,因此任一时刻只能使用其中的一个。 

主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程) 

进程堆栈指针(PSP):由用户的应用程序代码使用。 

 

7CortexM3 处理器支持两种处理器的操作模式,还支持两级特权操作。

 

状态转换图

 

 

8、通过把片上外设的寄存器映射到外设区,就可以简单地以访问内存的方式来访问这些外设的寄存器,从而控制外设的工作,从而使片上外设可以使用 C 语言来操作。

 

9Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果。

在STM32F10x里,外设寄存器和SRAM都被映射到一个位段区里,这允许执行单一的位段的写和读操作。

下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
其中:
- bit_word_addr 是别名存储器区中字的地址,它映射到某个目标位。
- bit_band_base 是别名区的起始地址。
- byte_offset 是包含目标位的字节在位段里的序号
- bit_number 是目标位所在位置(0-31)
下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位2:
0x22006008 = 0x22000000 + (0x300*32) + (2*4).
对0x22006008地址的写操作和对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。

读0x22006008地址返回SRAM中地址0x20000300字节的位2的值(0x01 or 0x00)。