中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。在Pc/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、CPU自动形成等),即在中断响应期间8259A产生的是当前请求中断的最高优先级的中断源的中断类型号。中断类型号和中断向量之间有下面的关系: 中断类型号×4=存放中断向量的首地址 有了存放中断向量的首地址,从该地址开始的4个存储单元中取出的就是中断服务程序的入口。
extern cregister volatile unsigned int IFR的解释
The compiler extends the C/C++ language by adding the cregister keyword to allow high level language access to control registers.When you use the cregister keyword on an object, the compiler compares the name of the object to a list of standard control registers for the C28x (see Table 6-2 ). If the name matches, the compiler generates the code to reference the control register. If the name does not match, the compiler issues an error.
Table 6-2. Valid Control Registers
Register Description
IER Interrupt enable register
IFR Interrupt flag register
大概意思就是:cregister是编译器扩展的C的关键字,用于高级语言C来直接控制寄存器。
当你使用这个关键字定义一个变量时,编译器会把它和表6-2的IER,IFR比较,如果名字相同则把这个变量当做是IER或IFR寄存器的引用,意思就是说编译器内部好像已经定义了IER,IFR的变量,你只需要extern声明一下就可以使用这个变量,编译器就会自动帮你实现它的定义。
当然一般我们操作寄存器都会在前面加上一个volatile关键字。
然后就是告诉你用法,如或与操作来直接操作这个寄存器。
*(*(volatile unsigned int ))详解
使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义
#define RAM_ADDR (*(volatile unsigned long *)0x00000000)
然后就可以用C语言对这个内存地址进行读写操作了
读:tmp = RAM_ADDR;
写:RAM_ADDR = 0x55;
volatile的意思是说明这个变量是可能被别的程序或者本程序的其他线程修改的,这样编译器就不能优化它,每次读取都从地址中获取。如果不这样声明的话编译器可以把它缓冲在寄存器中的,这样别的程序修改了它,而寄存器里面的值却是原先的,会发生你不想要的结果。而上面三种情况都是这种可能在本程序或者本线程外被修改的情况,所以要加它。
注意几点:
1.(volatile unsigned long *)0x00000000 说明是一个指针类型,地址在0x00000000
2.在前面加上个*,表示指向这个地址的内容。
3.养成在整体外面再加个括号的习惯。
中断控制器允许将多达128个系统事件编程到12个CPU中断输入(CPUINT4-CPUINT15)、CPU异常输入(EXEP)或高级仿真逻辑中的任何一个。
-c
-heap 0x001000
-stack 0x010000
MEMORY
{
vectors: o = 0x0c000000 l = 0x00000200
SRAM1: o = 0x0c000200 l = 0x00032000
}
SECTIONS
{
vector > vectors
.text > SRAM1
.stack > SRAM1
.bss > SRAM1
.cio > SRAM1
.const > SRAM1
.data > SRAM1
.switch > SRAM1
.sysmem > SRAM1
.far > SRAM1
.cinit > SRAM1
.fardata > SRAM1
.rodata > SRAM1
.neardata > SRAM1
}
MEMORY 中
vectors 中 o是中断服务表中的基地址部分,l是中断服务表的基地址长度。
同理,SRAM中的o,l表示也是一样的。
SECTIONS中
表示代码中的各个部分是分别存储在vectors中还是存储在SRAM1中。
/******************Timer中断配置***************************************************/
Interrupt_Service_Table(0x0c000000);
C6678_Int_GlobalEnable(4);
C6678_Int_GlobalEnable(5);
C6678_Int_GlobalEnable(6);
C6678_Int_GlobalEnable(7);
C6678_CoreInt_Set(64,4);
C6678_CoreInt_Set(66,5);
C6678_CoreInt_Set(68,6);
C6678_CoreInt_Set(70,7);
Interrupt_Service_Table函数是中断向量表函数,其功能就是对中断向量表进行设置,将基地址传给ISTP寄存器。
C6678_Int_GlobalEnable (7) 使能中断寄存器
C6678_CoreInt_Set(64,4); 将中断寄存器与相应的中断事件进行绑定,中断事件号需要根据手册来进行查看,本次经过查看手册得到的,本次事件号64正好对应一个计时器
(2)
Timer_Config(DNUM,(long long)TIMER_1MS_CLK,1,0);
Timer_Out_Config(DNUM,1);
Timer_Start(DNUM);
定时器设置程序
Timer_Config程序用于对计时器进行设置,包括选择对应的计时器,定时器周期,计数模式:循环计数或单次计数,计时器模式:64位定时器还是32位定时器。
Timer_Out_Config(DNUM,1);定时器输出模式:时钟输出还是脉冲输出。
Timer_Start(DNUM);启动计时器,开始计时。