总目标:
从启动代码开始写出一套代码让芯片能够跑起来,并且能够实现简单的功能部件编程。
学习目标:
1.复习ARM基础
2.重新对功能部件编程
3.开始着手启动代码
1.嵌入式系统的分类
Embedded Microprocessor Unit——EMPU——单板机——嵌入式微处理器(通用)
Microcontroller Unit——MCU——单片机——微控制器(通用)
Digital Signal Processor ——DSP——DSP处理器(专用)
System On Chip——SoC——片上系统
2.ARM7体系结构
ARM处理器直接支持1字节,2字节,4字节的数据类型。
1字=4字节
分为字方式存储和半字方式存储
1字节=8个二进制位 1Byte=8bit
采用3级流水线,即PC总指向当前指令后面第二条(执行-译码-取值),ARM状态下:PC值=当前程序执行位置+8字节。Thumb状态下:PC值=当前程序执行位置+4字节
ARM处理模式用户模式1种,特权模式6种.
usr用户,sys系统
特权模式下的异常模式:svc管理,abt中止,und未定义,irq中断,fiq快速中断
只有在特权模式下才允许对当前程序状态寄存器CPSR的所有控制位直接进行读写访问,而在非特权模式下只允许对CPSR的控制位进行间接访问。
CPSR和SPSR相互之间的关系:
当一个特定的异常中断发生时,将CPSR的当前值保存到相应的异常模式下的SPSR,然后设置CPSR为相应的异常模式.
从异常中断程序退出返回时,可通过保存在SPSR中的值来恢复CPSR.(利用这一点来切换模式)
3.功能部件编程
流程:对各个引脚以及功能部件进行初始化——>编写中断服务程序——>设置中断向量控制器(中断控制的中心)——>CPU响应中断
引脚连接模块PINSELx(引脚配置功能都需要用到这个寄存器)
32位宽度每2位代表一个引脚,因此每个引脚有4种不同的功能选择
通用输入输出GPIO
包含4个寄存器可以配置,均为32位宽度,每一位代表一个引脚
IOxPIN:读取引脚当前电平状态寄存器
IOxSET:GPIO引脚高电平输出寄存器
IOxDIR:GPIO引脚输入/输出方向控制寄存器
IOxCLR:GPIO引脚低电平输出寄存器
实验实例:
#include "config.h"
#define LED 0X04 //P0.2引脚控制LED,高电平LED亮
#define PIN_P005 0X00000020 //定义P0.05屏蔽字
int main (void)
{
PINSEL0=PINSEL0&0XFFFFF3CF;//设置引脚P0.2和P0.5连接GPIO
IO0DIR|=LED;//设置LED控制口为输出,其他I/O为输入
while(1)
{
if((IO0PIN&PIN_P005)!=0) IO0SET=LED;//如果按下按钮则LED控制口输出高电平
else IO0CLR=LED;//否则LED控制口输出低电平
}
return 0;
}
用ADS1.2开发环境编译和PROTETUES仿真软件仿真通过
中断向量控制器(ARM称作VIC)Vector Interrupt Controller
用于管理所有的中断信号再通过该控制器传入开中断的CPU中(I或F位置0开中断,可通过模式切换指令来实现,具体利用:SPSR->CPSR)
中断向量控制器的所有寄存器均为32位宽度,每一位代表一个中断源通道,中断源的通道通过查表得知.
中断选择寄存器(VICIntSelect,0xFFFF F00C):置1选择为FIQ中断,置0选择为IRQ中断,默认为IRQ中断
中断使能寄存器(VICIntEnable,0xFFFF F010):置1中断使能,置0无效.
当中断执行后切入异常向量表中对应的中断代码,FIQ直接切到一个中断服务程序(ISR)中,IRQ因为有优先级的区别,所以一般做法是切到向量地址寄存器(VICVectAddr,0xFFFF F030)中.中断服务程序不能直接将地址写入该寄存器因为当该寄存器内的值不为0则判断中断服务程序未执行完毕,该寄存器的值从VICDefVectAddr或者VICVectAddr0~15中复制而得到的
IRQ中断分为:非向量IRQ中断和向量IRQ中断.
*设置非向量IRQ中断服务程序(ISR)只需要将ISR的地址赋值到VICDefVectAddr这个寄存器中
设置向量IRQ中断服务程序(ISR)需要2个步骤:1.分配优先级 2.设置向量地址寄存器
向量控制寄存器0~15(VICVectCntl0~15,0xFFFF F200~23C)