DSP6678 中断程序

DSP6678 中断程序

中断向量表

中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。在Pc/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、CPU自动形成等),即在中断响应期间8259A产生的是当前请求中断的最高优先级的中断源的中断类型号。中断类型号和中断向量之间有下面的关系: 中断类型号×4=存放中断向量的首地址 有了存放中断向量的首地址,从该地址开始的4个存储单元中取出的就是中断服务程序的入口。

IER与IFR定义与解释

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)或高级仿真逻辑中的任何一个。

中断服务序列

在这里插入图片描述

中断程序简单梳理

  1. .cmd 文件说明
-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中。

  1. main.c文件中
    (1)
/******************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);启动计时器,开始计时。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值