文档库 最新最全的文档下载
当前位置:文档库 › DSP2812启动过程

DSP2812启动过程

DSP2812启动过程
DSP2812启动过程

2812的内部Flash启动过程

2812的内部flash启动过程

2812从内部flash启动的详细流程说明:

a)程序硬件复位或者软件复位

b)判断mp/mc是否为0

c)为0则从boot rom启动,否则从外部启动

d)到boot rom的0x3F FFC0处取出复位向量,跳到boot函数

e)采集IO管脚状态,

f)根据IO状态选择boot方式

g)如果是flash,程序退出boot函数,跳转到0x3F 7FF6

h)取出跳转指令,跳转到自己的指定地址或者C初始化的入口_C_INT00处

i)在C初始化的入口_C_INT00对一些变量,堆栈和寄存器进行必要的设置,

该函数在c的库函数内

j)进入main函数

从上电到我们的主函数运行之间这段时间里2812到底做了些什么?2812是怎样引导程序运行的?下面叙述其启动过程。

在2812中引脚XMP/~MC,当该引脚的为高电平时表示是微处理器模式(microprocessor),为低电平时表示微机算计模式(microcomputer),当为微处理器模式时,2812内部的bootrom被禁止,通过zone7(0x3F C000)从外部调引导程序启动。2812复位以后,其复位向量是固定的0x3FFFC0,如果为微处理器模式,那么复位后的复位向量指向的外部的地址,即0x3FFFC0是zone7处的地址,若为微机算计模式,那么0x3FFFC0指向的是2812的片内FLASH的地址。下面就以微机算计模式加以说明其过程。

上电复位后,复位向量是指向片内Flash的0x3F FFC0,2812有一块flash地址从0x3F F000-0x3F FFFF在出厂时已经固化好了引导程序。在0x3F FFC0处是一条跳转指令,跳到iniboot(地址0x3F FC00)函数处执行iniboot代码,该iniboot代码就是TI在dsp出厂时固化在flash中的。InitBoot assembly Routine将选择SelectBootMode function 启动模式函数。这个函数由GPIO 引脚的状态决定启动类型。

引导模式选择

GPIOF4 GPIOF12 GPIOF3 GPIOF2

(SCITXD

A)

(MDXA) (SPISTEA) (SPICLK)

PU No PU No PU No PU Mode Selected

1 X X X

跳转到地址为0x3F7FF6的Flash,用户必须在这里编写分支语句优先于复位,以按需要重新

定位代码的执行.

0 1 X X 调用SPI_Boot 以从外部的EEPROM载入

0 0 1 1 调用SCI_Boot 以从SCI-A载入

0 0 1 0 J跳转到 H0 SARAM 0x3F 8000

0 0 0 1 跳转到OTP地址 0x3D 7800

0 0 0 0 调用Parallel_Boot从GPIO 端口B载入

一旦启动结束,选择启动模式函数返回一入口地址给InitBoot函数。入口地址是退出bootloader之后代码开始执行的起始点。InitBoot接着将会调用ExitBoot子程序,把CPU 寄存器的状态恢复到复位状态。比如flash boot模式,那么initboot执行完后跳转到0x3F 7FF6处(codestart处),此位置刚好在128位(CSM)密码位置之前,你要在0x3F 7FF6处放置跳转指令,以跳转到你要去的地方,比如是boot loader或应用代码,通常的跳转去处是_c_int00。在0x3F 7FF6 处放置跳转指令的方法如下

(DSP281x_CodeStartBranch.asm中):

.sect "codestart"

code_start:

.if WD_DISABLE == 1

LB wd_disable ;Branch to watchdog disable code

.else

LB _c_int00 ;Branch to start of boot.asm in RTS library

.endif

.if WD_DISABLE == 1

.text

wd_disable:

SETC OBJMODE

EALLOW

MOVZ DP, #7029h>>6

MOV @7029h, #0068h

EDIS

LB _c_int00

.endif

.end

MEMERY

{

Page 0:

………..

RAML0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */ OTP : origin = 0x3D7800, length = 0x000400 /* on-chip OTP */

FLASHD : origin = 0x3F0000, length = 0x002000 /* on-chip FLASH */

FLASHC : origin = 0x3F2000, length = 0x002000 /* on-chip FLASH */

FLASHA : origin = 0x3F6000, length = 0x001F80 /* on-chip FLASH */

CSM_RSVD : origin = 0x3F7F80, length = 0x000076

BEGIN : origin = 0x3F7FF6, length = 0x000002

………..

}

SECTIONS

{ ……….

/* Allocate program areas: */

.cinit : > FLASHA PAGE = 0

.pinit : > FLASHA, PAGE = 0

.text : > FLASHC PAGE = 0

codestart: > BEGIN PAGE = 0

ramfuncs : LOAD = FLASHD,

RUN = RAML0,

LOAD_START(_RamfuncsLoadStart),

LOAD_END(_RamfuncsLoadEnd),

RUN_START(_RamfuncsRunStart),

PAGE = 0

csmpasswds : > CSM_PWL PAGE = 0

csm_rsvd : > CSM_RSVD PAGE = 0

/* Allocate uninitalized data sections: */

.stack : > RAMM0 PAGE = 1

.ebss : > RAML1 PAGE = 1

.esysmem : > RAML1 PAGE = 1

/* For SDFlash to program these, they must be allocated to page 0 */

.econst : > FLASHA PAGE = 0

.switch : > FLASHA PAGE = 0

……….

}

上面代码执行后跳到C初始化的入口_c_int00(0x3F6000) ,在C初始化的入口,_c_int00对一些变量,堆栈和寄存器进行必要的设置,这个函数在运行支持库(rts.lib)中,_c_int00函数为建立C运行环境,需完成以下工作:

a.为系统堆栈产生.stack块,并初始化堆栈指针;

b.从.cinit块将初始化数据拷贝到.bss块中相应的变量;

c.对寄存器进行必要的配置,调用main函数开始运行C程序;

没有过多的资料介绍_c_int00这块,无法知道它的具体功能实现以及怎样跳转到主函数的,用户可以对c_int00函数进行修改,但修改后的函数必须完成以上任务。

TMS320F2812 flash运行时的启动过程

2812启动过程与2407所用的传统单片机的Vectors启动模式不同,且仿真运行与脱离仿真器运行时差别较大,所以一开始比较难理解。其启动过程可以分为Flash启动、SPI_Boot、SCI_Boot、H0_Boot、Parallel_Boot等几种模式,而最常用的就是内部Flash 运行,也就是将程序编译好后通过JTAG口将程序xx.out文件下载到芯片内部falsh中运行,所以此处就这种运行方式的启动过程作一说明。

图1 2812内部地址图

首先要搞清楚的就是2812的内部地址,如图1所示,(1)为放中断向量表的RAM,中断向量表在初始化中由用户完成设置;(2)为放程序的Flash,其中最底的128Bits (8Words)存放Password用;(3)为BootRom,即专门为DSP启动所设立的一块ROM,

其中内容为厂家固化。由图2可以更清晰地看到BootRom的内容,其中0x3F F000~0x3F

FC00 放置的是IQmath库中用到的函数表,0x3F FC00~0x3F FFC0放置的是Bootloader functions,最底部分放置的是VectorTable。内部Flash运行的启动过程如图3所示:

A

B

图2 2812内部BootRom地址图

The state of DSP when Poweron or warm reset:ENPIE=0;VMAP=1;OBJMODE=0;AMODE=0;M0M1MAP=1.

对于应用来讲,B 区中的VectorTable 中的中断向量只有Reset Vector 有用,其位于0x3F FFC0,其中内容为:0x3F FC00,即指向InitBoot function 地址。MP/MC=0

电平此状态在Boot 间保持

条件流程说明

InitBoot Function 对系统所做工作:

1、Do not change PLL;

2、WTG does not be touched;

3、ENPIE=0;

4、0x400~0x450作为stack;即跳至用户Flash 的最后2 Words 处;

(注意:图1中(2)区的最后8个Words 不能用作程序区);

0x3F 7FFF6~0x3F 7FFF7 处的2 Words 中放跳转到主程序的指令,如:LB _c_int00 或 LB main 。(注意:这需要用户设置);

图3 2812内部Flash 启动过程

a)程序硬件复位或者软件复位

b)判断mp/mc是否为0,微计算机模式(为1,当为微处理器模式时,2812内部的bootrom被禁止,通过zone7从外部调引导程序启动。)

c)为0则从boot rom启动,否则从外部启动(0x3F FC00)

d)到boot rom的0x3F FC00处取出复位向量,跳到boot函数:2812有一块flash地址从0x3F F000-0x3F FFFF在出厂时ti已经固化好了引导程序iniboot:Iniboot函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flash boot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flash boot模式,那么initboot执行完后跳转到0x3F 7FF6处)

e)采集io管脚状态,确定启动模式。2812提供几种启动模式:

SCITXDA(GPIOF4) MDXA(GPIOF12) SPISTEA(GPIOF3) SPICLK(GPIOF2)

1 x x x FLASH启动

0 1 x x SPI启动

0 0 1

1 SCI启动

0 0 0 0 PARALLEL启动

f)根据io状态选择boot方式

g)如果是flash,程序退出boot函数,跳转到0x3F 7FF6(codestart)

h)取出跳转指令,跳转到自己的指定地址或者C初始化的入口_C_INT00(0x3F6000)处(DSP281x_CodeStartBranch.asm中)

i)在C初始化的入口_C_INT00对一些变量,堆栈和寄存器进行必要的设置,该函数在c的库函数内(RTS Library)

j)进入main函数(0x3F658E)

注:1》根据INTER NET上别人的资料,以及针对程序的推敲,总结如上。

2》地址均为我程序实际观测到的值,和网上别人所言有出入。如:有言boot rom地址为0x3F FFC0,iniboot(起始地址0x3F FB50)。

dsp2812烧写经验总结收藏

1、一般不用你换GEL.LIB文件,用原来的就可以.

2、换完FLASH的CMD后,不要烧写,看下.MAP文件,主要是看0X3F 7FF8处有没有烧内容.如果有别烧,改,直到这处没有烧入内容.

一般网上的都可以用,只要没有在此出烧入内容

3、如果没有烧入其他的内容,则可以烧了.烧完后,RESET CPU 看是不是到0X3F FFC0处,如果不是,看是不是你的MP/MC=0了,并且是不是FLASH启动模式,即所有4个脚都是高(只要第一个脚是高就可以,即1XXX)

4、如果RESET CPU 是到0X3F FFC0处,即可以断电,并且拔掉与板子相连的仿真器接口(注意拔电脑上的USB不好使),然后上电,自动运行.

注意:其中遇到的问题:

烧写\时说初始化RAM,和寻找BOOT.ASM都不用管_

如果说是NOT AN execuTivefile ,则在PROJECT_BULIT OPTION_LINK_OUT MODLE _absolute file

最重要是可以断电,并且拔掉与板子相连的仿真器接口(注意拔电脑上的USB不好使),然后上电,自动运行.我遇到的是这些,我用以上方法解决了,但不知道为什么,所以大家都说说经验,让新手烧走弯路,少LOCK2812

2812从内部flash启动的过程

a)程序硬件复位或者软件复位

b)判断mp/mc是否为0,微计算机模式(为1,当为微处理器模式时,2812内部的bootrom被禁止,通过zone7从外部调引导程序启动。)

c)为0则从boot rom启动,否则从外部启动(0x3F FC00)

d) 到boot rom的0x3F FC00处取出复位向量,跳到boot函数:2812有一块flash地址从0x3F F000-0x3F FFFF在出厂时ti已经固化好了引导程序iniboot:Iniboot函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flash boot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flash boot模式,那么initboot执行完后跳转到0x3F 7FF6处)

e)采集io管脚状态,确定启动模式。2812提供几种启动模式

SCITXDA(GPIOF4) MDXA(GPIOF12) SPISTEA(GPIOF3) SPICLK(GPIOF2)

1 x x x FLASH启动

0 1 x x SPI启动

0 0 1 1 SCI启动

0 0 0 0 PARALLEL启动

f)根据io状态选择boot方式

g)如果是flash,程序退出boot函数,跳转到0x3F 7FF6(codestart)

h)取出跳转指令,跳转到自己的指定地址或者C初始化的入口_C_INT00(0x3F6000)处(DSP281x_CodeStartBranch.asm中)

i)在C初始化的入口_C_INT00对一些变量,堆栈和寄存器进行必要的设置,该函数在c的库函数内(RTS Library)

j)进入main函数(0x3F658E)

2812上电引导过程

从上电到我们的主函数运行之间这段时间里2812到底做了些什么?2812是怎样引导程序运行的?下面叙述其启动过程。

在2812中引脚XMP/~MC,当该引脚的为高电平时表示是微处理器模式(microprocessor),为低电平时表示微机算计模式(microcomputer),当为微处理器模式时,2812内部的bootrom背禁止,通过zone7从外部调引导程序启动。2812复位以后,其复位向量是固定的0x3F FFC0,如果为为处理器模式,那么复位后的复位向量指向的外部的地址,即0x3F FFC0是zone7处的地址,若为微机算计模式,那么0x3F FFC0指向的是2812的片内FLASH的地址。下面就以微机算计模式加以说明其过程。

上电复位后,复位向量是指向片内Flash的0x3F FFC0,2812有一块flash地址从0x3F F000-0x3F FFFF在出厂时已经固化好了引导程序。在0x3F FFC0处是一条跳转指令,跳到iniboot (地址0x3F FB50)函数处执行iniboot代码,该iniboot代码就是ti在dsp出厂时固化在flash中的。Iniboot函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flash boot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flash boot模式,那么initboot执行完后跳转到0x3F 7FF6处,此位置刚好在128位(CSM)密码位置之前,你要在0x3F 7FF6处纺织跳转指令,以跳转到你要去的地方,比如是boot loader或应用代码。在0x3F 7FF6 处放置跳转指令的方法如下:

.sect "codestart"

code_start:

.if WD_DISABLE == 1

LB wd_disable ;Branch to watchdog disable code .else

LB _c_int00 ;Branch to start of boot.asm in RTS library .endif

.if WD_DISABLE == 1

.text

wd_disable:

SETC OBJMODE

EALLOW

MOVZ DP, #7029h>>6

MOV @7029h, #0068h

EDIS

LB _c_int00

.endif

.end

MEMERY

{

Page 0:

………..

Start:origin = 0x3F 7FF6,length = 0x000002

………..

}

SECTIONS

{

……….

Codestart :> Start page 0

……….

}

上面的代码执行后跳到_c_int00处执行,_c_int00执行结束时调用用户的主程序main,则后续就是你自己的程序的执行了。

本文来自CSDN博客,转载请标明出处:https://www.wendangku.net/doc/bf13664197.html,/yantaoliu/archive/2010/04/02/5445091.aspx

新手小记:F2812烧写问题的解决过程

说在前面的话:由于是新手,今天解决的这个问题对于高手可能简单得有点可笑,但这个解决过程我想还是值得分享一下的,谢谢进入该帖子的朋友。

---------------------------------------

问题描述:

我用的是DEC2812,ccs3.3

将仿真调试好的程序换了网上提供的标准flash.cmd和.lib文件后,重新编译生成烧写用的.out

文件。但是在烧写过程中提示:

Warning: This program contains initialized RAM data.

It may run successfully under Code Composer Studio

but not as a standalone system because of this. If

your Flash program requires initialized data in RAM,

you will need to write Flash code to initialize RAM memory.

Erase/Program/Verify Operation succeeded

----------------------------------------------

解决过程:

1. 首先在论坛里找了半天,碰到这个问题的人还真不少,都说是.cmd文件的问题:“这个问题是

cmd中有程序写在了RAM中,看看改到Flash就可以了”。但是没有具体的方法。

我用的FLASH.cmd是网上下载的TI标准版,看了半天没发现什么异常,只好查自己的程序,了解自己把一些变量初始化是放在main()之外,作为全局变量处理的。未必这些就是所谓“写在RAM”

的数据?因此我把这些变量初始化统统移到main()里面了。

这下更惨,编译都报错了:

declaration may not appear after executable statement in block

第1步失败!

2. 由于在编译期间还有如下报警,但是并不影响.out文件的生成,我就认为是这个报警导致烧写

过程中的问题。

>> C:\CCStudio_v3.3\MyProjects\sci_testflash\FLASH.cmd, line 82: warning:

(.const) not found

>> warning: load address of uninitialized section .const ignored

于是自己写了个很短的串口通信程序,仿真通过后,用FLASH.cmd编译,还是出现上述报警。不管了烧下去再说,发现一切正常,板子复位后可独立运行。看来这个编译报警似乎并不影响程序运行。

3. 在google上用initialize RAM memory搜索,发现有个哥们的blog记载了同样错误,他没搭理,直接复位运行,说是没有问题。于是大喜,不管那么多,有报警也l烧写进去再说。结果发现断电复位让程序单独运行,通信根本不通。未必板子没有跑起来?由于手上无示波器,立即在程序里加了定时器中断,反复点亮目标板上的小灯,用来表征程序运行。再编译,烧写,期间报警照旧。断电复位后,发现灯在闪烁,大喜,立即建立通信,结果灯不闪了,通信不通,程序显然死掉了。反复进行了几次,都是一样的现象。很郁闷,只好又上网到处问,碰到同样烧写报警的人是多,但

都说是.cmd文件的问题,又没有具体的方法。

4.看来还是.cmd文件的问题,在坛子里面搜索“.cmd”关键字的帖子,一篇篇翻看。突然发现一篇有关.switch定义的帖子,突然想起我的通信程序就是switch语句构成。进去一看发现里面贴出的.cmd文件和我的不同。多了好几项定义,其中就包括.switch。另外.const的定义也不一样,直接定义到FLASHA中,不像我的标准版,又是load=FLASHA又是run=RAML0L1,还有一堆_const_run,(.const)什么的。于是照着帖子修改我的FLASH.cmd,该加的加,.const的一堆语句都删掉,直接

定义到FLASHA。一编译,居然又报错了:说是我的rts2800_fl040914.lib里面的_const_run之类没有定义。晕,刚刚才在.cmd中删掉的,换了个.lib还是同样报错。晕了。真是越改麻烦越多了。

5.好了,直奔主题。最后又重新加载标准的FLASH.cmd,毕竟这个版本还是能生成.out文件的。想了半天,可能问题还是.switch定义上。第2.节中,我编的串口通信小程序的确也用了switch语句,但是数量很少,所以在.cmd中没有.switch的定义,也能正常烧写。正式的程序switch语句多,里面还有常量。于是硬着头皮只在标准的FLASH.cmd中加了.switch定义。编译, (.const) not found报警依旧;烧写,居然顺利通过!!!!!于是断电复位,板子独立运行,指示灯闪烁。现在关键看通信,随着串口调试助手上发送键的按下,我紧张到极点,瞬间,数据接收区显示到接收

到数据!成功!!

首先说下,我接触2812也不久,遇到的问题只知道弄好了,但不知道原因,但我想把我说遇到的,清楚的说下,对新手有帮助。

下面是正题:

先说我遇到的

一:正常的烧写

不用你换GEL.LIB文件,用原来的就可以.

二:换完FLASH的CMD后,不要烧写,看下.MAP文件,主要是看0X3F 7FF8处有没有烧内容.如果有别烧,改,直到这处没有烧入内容.

一般网上的都可以用,只要没有在此出烧入内容

三:如果没有烧入其他的内容,则可以烧了.烧完后,RESET CPU 看是不是到0X3F FFC0处,如果不是,看是不是你的MP/MC=0了,并且是不是FLASH启动模式,即所有4个脚都是高(只要第一个脚是高就可以,即1XXX)

四:如果RESET CPU 是到0X3F FFC0处,即可以断电,并且拔掉与板子相连的仿真器接口(注意拔电脑上的USB不好使),然后上电,自动运行.

注意:其中遇到的问题:

烧写\时说初始化RAM,和寻找BOOT.ASM都不用管_

如果说是NOT AN execuTivefile ,则在PROJECT_BULIT OPTION_LINK_OUT MODLE _absolute file

最重要是可以断电,并且拔掉与板子相连的仿真器接口(注意拔电脑上的USB 不好使),然后上电,自动运行.我遇到的是这些,我用以上方法解决了,但不知道为什么,所以大家都说说经验,让新手烧走弯路,少LOCK2812

2812从内部flash启动的过程

a)程序硬件复位或者软件复位

b)判断mp/mc是否为0,微计算机模式(为1,当为微处理器模式时,2812内部的bootrom被禁止,通过zone7从外部调引导程序启动。)

c)为0则从boot rom启动,否则从外部启动(0x3F FC00)

d) 到boot rom的0x3F FC00处取出复位向量,跳到boot函数:2812有一块flash地址从0x3F F000-0x3F FFFF在出厂时ti已经固化好了引导程序iniboot:Iniboot函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flash boot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flash boot模式,那么initboot执行完后跳转到0x3F 7FF6处) e)采集io管脚状态,确定启动模式。2812提供几种启动模式

SCITXDA(GPIOF4) MDXA(GPIOF12) SPISTEA(GPIOF3) SPICLK(GPIOF2)

1 x x x FLASH启动

0 1 x x SPI启动

0 0 1 1 SCI启动

0 0 0 0 PARALLEL启动

f)根据io状态选择boot方式

g)如果是flash,程序退出boot函数,跳转到0x3F 7FF6(codestart)

h)取出跳转指令,跳转到自己的指定地址或者C初始化的入口_C_INT00(0x3F6000)处(DSP281x_CodeStartBranch.asm中)

i)在C初始化的入口_C_INT00对一些变量,堆栈和寄存器进行必要的设置,该函数在c的库函数内(RTS Library)

j)进入main函数(0x3F658E)

2812上电引导过程

从上电到我们的主函数运行之间这段时间里2812到底做了些什么?2812是怎样引导程序运行的?下面叙述其启动过程。

在2812中引脚XMP/~MC,当该引脚的为高电平时表示是微处理器模式(microprocessor),为低电平时表示微机算计模式(microcomputer),当为微处理器模式时,2812内部的bootrom背禁止,通过zone7从外部调引导程序启动。2812复位以后,其复位向量是固定的0x3F FFC0,如果为为处理器模式,那么复位后的复位向量指向的外部的地址,即0x3F FFC0是zone7处的地址,若为微机算计模式,那么0x3F FFC0指向的是2812的片内FLASH 的地址。下面就以微机算计模式加以说明其过程。

上电复位后,复位向量是指向片内Flash的0x3F FFC0,2812有一块flash地址从0x3F F000-0x3F FFFF在出厂时已经固化好了引导程序。在0x3F FFC0处是一条跳转指令,跳到iniboot(地址0x3F FB50)函数处执行iniboot代码,该iniboot代码就是ti在dsp出厂时固化在flash中的。Iniboot 函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flash boot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flash boot模式,那么initboot执行完后跳转到0x3F 7FF6处,此位置刚好在128位(CSM)密码位置之前,你要在0x3F 7FF6处纺织跳转指令,以跳转到你要去的地方,比如是boot loader或应用代码。在0x3F 7FF6 处放置跳转指令的方法如下:

.sect "codestart"

code_start:

.if WD_DISABLE == 1

LB wd_disable ;Branch to watchdog disable code

.else

LB _c_int00 ;Branch to start of boot.asm in RTS library

.endif

.if WD_DISABLE == 1

.text

wd_disable:

SETC OBJMODE

EALLOW

MOVZ DP, #7029h>>6

MOV @7029h, #0068h

EDIS

LB _c_int00

.endif

.end

MEMERY

{

Page 0:

………..

Start:origin = 0x3F 7FF6,length = 0x000002

………..

}

SECTIONS

{

……….

Codestart :> Start page 0

……….

}

上面的代码执行后跳到_c_int00处执行,我对_c_int00的形成及具体情况不清楚,请知道的补充,_c_int00执行结束时调用用户的主程序main,则后续就是你自己的程序的执行了。

以下是具体编程要做的准备工作:

一、准备工作(一劳永逸,模块化编程!)

1. 注册为TI 成员

TI公司提供的技术资料都需要会员的身份才可以下载,为了你工作的方便,建议你如果需要TI器件的技术资料,就赶快注册为TI的成员吧!

2. 获得TMS320F2812的所有技术资料

为了快速的获得某个器件相关的技术资料,你可以在上图的“Enter Part Number”中输入具体的器件型号,比如我们输入“TMS320F2812”,点击“GO”后,就可以获得TMS320F2812的所有技术资料,包括数据手册、产品信息、价格/封装/样片、质量与无铅数据报告、技术文档、用户指南、参考设计、开发工具与软件、相关产品等等。应有尽有,你想得到的TI都有,你没有想到的TI也为你准备好了!

建议将上面能够下载下来的资料统统下载下来!有空的时候拿来研究一下,保证有好处!在“Tools &Software”这一栏里TI给出了与TMS320F2812相关的算法,大部分是免费的!除了电机算法只给出了库函数,其他基本上给出了库函数和底层程序代码,并且TI给出的底层程序大部分是汇编编写的,所

以代码运行效率是非常高的!

3. 安装TI的算法

在“Tools & Software”这一栏里将下载到的TI头文件和外设使用例子C281x C/C++ Header Files and Peripheral Examples解压缩并且按照默认路径安装后,我们可以在C:\tidcs\c28\dsp281x\v100找到TMS320F2812头文件。对于TI给出的大部分关于28x的算法,都可以在C:\tidcs找到。在C:\tidcs\c28\dsp281x\v100中包含4个文件夹和一个readme。

在具体编程前需要了解各个文件夹中的每个文件的具体用途,要知道“什么时候用哪个文件,为什么要用这个文件!

接下来将对编程时使用较多的文件做一个说明:

1)C:\tidcs\c28\dsp281x\v100\doc中包含一个PDF文档,此文档是有关头文件使用的说明,建议有空多看一下!

2)C:\tidcs\c28\dsp281x\v100\DSP281x_common\cmd中包含4个CMD 文件,用来定义片上和片外空间,每个CMD用途不一样,在后面的编程中具体讨论。

3)C:\tidcs\c28\dsp281x\v100\DSP281x_common\include中包含4个头文件,其中

DSP281x_DefaultIsr声明了所有281x的中断服务函数,比如声明定时器0中断函数:interrupt void TINT0_ISR(void);DSP281x_Examples.h调用了一个软件延时函数,一般用得较少;DSP281x_GlobalPrototypes.h为全局函

数原型,例如:extern void InitAdc(void)为初始化ADC函数原型;DSP281x_SWPrioritizedIsrLevels.h给出了一个中断优先级定义的示范。

4)C:\tidcs\c28\dsp281x\v100\DSP281x_common\source中包含了系统和片上外设的初始化代码,这个在我们编程的时候使用较多的文件。

5)C:\tidcs\c28\dsp281x\v100\DSP281x_headers\cmd中包含2个CMD,用来分配外设寄存器空间,其中DSP281x_Headers_nonBIOS在不使用DSP/BIOS情况下使用,DSP281x_Headers_nonBIOS在使用DSP/BIOS情况下使用。

6)C:\tidcs\c28\dsp281x\v100\DSP281x_headers\include用结构体和共用体定义了所有的281x的寄存器,只要使用281x就需要这些文件。

7)C:\tidcs\c28\dsp281x\v100\DSP281x_headers\source用#pragma DATA_SECTION定义数据段,例如用#pragma DATA_SECTION(AdcRegs,"AdcRegsFile")给ADC寄存器分配空间。

4. 建立几个专用的文件夹

为了更好的使用TI提供的算法,真正做到模块化编程,提高我们的工作效率,我们需要在PC机上建立一个专用的工作文件夹,如E:\jacky281x,然后在jacky281x文件夹下建立几个专用的文件夹,如下图所示:

1)cmd中存放各种链接命令文件

PIC——MCC18中断写法

PIC——MCC18中断写法 MPLABC18 不自动把中断服务程序放在中断向量处。通常将GOTO 指令 放在中断向量处,从而把控制权转交给相应的中断服务程序。PIC18 系列的低 优先级中断入口地址在0x0018 地址,下面的代码是在入口地址处放置一个向 量函数,这个向量函数里就是一个内嵌汇编的GOTO 指令,GOTO 到低优先级 的中断服务函数InterruptHandlerLow。//----------------------------低优先级中断入 口-----------------------------------1#pragmacodeInterruptVectorLow=0x18//用#pragma 伪指令定义一个名字叫InterruptVectorLow 的段,并把这个段放到0x18 地址起 始的代码空间2voidInterruptVectorLow(void)//低优先级中断向量函数3{4 _asm5gotoInterruptHandlerLow//内嵌汇编指令6_endasm7} 8#pragmacode//这里不是多余的,它是告诉连接器回到默认的代码段,如果不 加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。而 LKR 文件里定义了向量区最多到0x29 地址,所以如果没加此行通常会报错 910#pragmainterruptlowInterruptHandlerLow//这里使用interruptlow 这个关键词 来声明InterruptHandlerLow 这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使 用RETFIE 返回的。111213voidInterruptHandlerLow(void)14{15/*低优先级服务 函数的代码写在这里*/16}PIC18 系列的高优先级中断入口地址在0x0008 地址, 下面的代码是在这个入口地址处放置一个向量函数,这个向量函数里就是一个 内嵌汇编的GOTO 指令,GOTO 到高优先级的中断服务函数InterruptHandlerHigh。 //----------------------------高优先级中断入口----------------------------------- 1#pragmacodeInterruptVectorHigh=0x08//用#pragma 伪指令定义一个名字叫

在编写单片机的程序中中断服务程序中可以定义变量如果

在编写单片机的程序中,中断服务程序中可以定义变量,如果希望下一次再进入中断的时候还可以保留变量原来的值,就需要把它设置为static型的。比如,定义一个bit型变量作为某种判断的标志。关于好不好的问题,以我现有的知识,好像是解决不了的,很抱歉 一个中断的处理过程大概是这样的: 1、现行指令结束,且没有更紧急的服务请求。 2、关CPU中断,CPU不能再响应其他任何中断源的中断请求。 3、保存中断点,通常是指保存程序计数器PC中的内容,把它压入到系统堆栈中,以便在终端服务完成后返回到原来的程序中去。 4、撤销设备的中断服务请求,如果这个中断源的中断请求不撤销的话,那么在开CPU中断后,它必然将再次请求终端服务。 5、保存硬件现场。 6、识别中断源。 7、改变设备的屏蔽状态。 8、转向中断服务程序入口,一般还要在中断服务程序中通过软件才能找到具体中断源的中断服务程序入口。 9、保存软件现场,主要指保存将要被中断服务程序破坏的通用寄存器中的内容等。 10、开CPU中断,CPU可以响应其他更高级中断源的终端服务请求,中断源之间可以实现中断嵌套。 11、执行中断服务程序。 12、关CPU中断,CPU不响应任何中断源的中断服务请求。在下一次开CPU中断之前,正在运行的程序不允许被中断。 13、恢复软件现场,恢复被中断服务程序破坏的通用寄存器中的内容等。 14、恢复屏蔽状态。 15、恢复硬件现场,主要指恢复处理机状态字PSW及堆栈指针SP等中的内容,准备返回中断点。 16、开CPU中断。 17、返回到中断点。 其中红字的部分一般用硬件实现,蓝字的部分一般用软件实现,其他可以用硬件也可以用软件实现。 从上面这个过程似乎可以得到,在执行中断服务程序之前,很多东西都被保护起来了,所以执行中断程序的时候不必担心破坏什么东西。我们可以对全局变量进行操作,也可以定义一个新的变量,这只是占用了一定的存储空间和时间的问题。 恩,我也不知道自己理解的对不对,毕竟计算机系统结构是很复杂的哈,还希望大家帮忙理解一哈

中断服务程序流程图

第一讲: 第六章I/O接口原理-接口、端口、编址 回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。 重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。 讲授内容: 6. 1 输入/输出数据的传输控制方式 一、输入/输出的一般概念 1.引言 输入/输出是微机系统与外部设备进行信息交换的过程。输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。因此,CPU与外部设备之间的信息交换技术比较复杂。 CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。 2.输入/输出端口的寻址方式 微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。

根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式 这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。 方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。优点: ①CPU对I/O端口的读/写操作可以使用全部存储器的读/写操作指令,也可 以用对存储器的不同寻址方式来对I/O端口中的信息,直接进行算术、逻辑运算及循环、移位等操作。 ②内存与外设地址的分配,可以用统一的分布图。 ③不需要专门的输入、输出操作指令。 缺点: ①内存与I/O端口统一编址时,在地址总线根数一定的情况下,使系统中 实际可以直 接寻址的内存单元数减少。 ②一般情况下,系统中I/O端口数远小于内存单元数,所以在用直接寻址方 式来寻址这些端口时,要表示一个端口地址,必须用与表示内存单元地址相同的字节数,使得指令代码较长,相应地读/写执行时间也较长,这对提高系统的运行速度是不利的。 Mortorola公司的M6800CPU等均采用这种寻址I/O端口的方式。 3. CPU与外设之间所传送的信息类型 CPU与I/O端口之间所交换的信息,可以有下列几种类型: ①数据信息:包括数字量、模拟量、开关量等,可以输入、也可以输出 ②状态信息:这是I/O端口送给CPU的有关本端口所对应的外设当前状态 的信息。供CPU进行分析、判断、决策。 ③控制信息:这是CPU送给I/O端口的控制命令,使相应的外部设备完成 特定的操作。 数据信息、状态信息和控制信息是不同类型的信息,它们所起的作用也不一样。但在8086/8088微机系统中,这三种不同类型的信息的输入、输出过程是相同的。为了加以区分,可以使它们具有不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入/输出的数据中设置特征位。

单片机_C语言函数_中断函数(中断服务程序)

单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。 (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。 80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。 80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制 (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1 (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP 具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。 在这里我们讲下注意的事项 (1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。 (2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。 (3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。 (4)单片机复位后,TCON,SCON给位清零。 C51语言允许用户自己写中断服务子程序(中断函数) 首先来了解程序的格式: void 函数名() interrupt m [using n] {} 关键字 interrupt m [using n] 表示这是一个中断函数 m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。 n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3 中断号中断源 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1中断 4 串行口中断 (在上一篇文章中讲到的ROM前43个存储单元就是他们,这5个中断源的中断入口地址为: 这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不

计算机组成原理中断实验报告

北京建筑大学 2015/2016 学年第二学期 课程设计 课程名称计算机组成原理综合实验 设计题目微程序控制器设计与实现 系别电信学院计算机系 班级计141 学生姓名艾尼瓦尔·阿布力米提 学号 完成日期二〇一六年七月八日星期五 成绩 指导教师 (签名) 计算机组成综合实验任务书

指令执行流程图; ?5、利用上端软件,把所编写的微程序控制器内容写入实验台中控制器中。 ?6、利用单拍测试控制器与编程的要求是否一致。如果有错误重新修改后再写入控制器中。 7、编写一段测试程序,测试控制器运行是否正确。 实验目的 1.融合贯通计算机组成原理课程,加深对计算机系统各模块的工作原理及相互联系(寄存器堆、运算器、存储器、控制台、微程序控制器)。 2.理解并掌握微程序控制器的设计方法和实现原理,具备初步的独立设计能力;3.掌握较复杂微程序控制器的设计、调试等基本技能;提高综合运用所学理论知识独立分析和解决问题的能力。 实验电路 1. 微指令格式与微程序控制器电路 2.微程序控制器组成 仍然使用前面的CPU组成与机器指令执行实验的电路图,但本次实验加入中断系统。这是一个简单的中断系统模型,只支持单级中断、单个中断请求,有中断屏蔽功能,旨在说明最基本的原理。

中断屏蔽控制逻辑分别集成在2片GAL22V10(TIMER1 和TIMER2)中。其ABEL语言表达式如下: INTR1 := INTR; INTR1.CLK = CLK1; IE := CLR & INTS # CLR & IE & !INTC; IE.CLK= MF; INTQ = IE & INTR1; 其中,CLK1是TIMER1产生的时钟信号,它主要是作为W1—W4的时钟脉冲,这里作为INTR1的时钟信号,INTE的时钟信号是晶振产生的MF。INTS微指令位是INTS机器指令执行过程中从控制存储器读出的,INTC微指令位是INTC机器指令执行过程中从控制存储器读出的。INTE是中断允许标志,控制台有一个指示灯IE显示其状态,它为1时,允许中断,为0 时,禁止中断。当INTS = 1时,在下一个MF的上升沿IE变1,当INTC = 1时,在下一个MF的上升沿IE变0。CLR信号实际是控制台产生的复位信号CLR#。当CLR = 0时,在下一个CLK1的上升沿IE变0。当 CLR=1 且INTS = 0 且 INTC = 0时,IE保持不变。 INTR是外部中断源,接控制台按钮INTR。按一次INTR按钮,产生一个中断请求正脉冲INTR。INTR1是INTR经时钟CLK1同步后产生的,目的是保持INTR1与实验台的时序信号同步。INTR脉冲信号的上升沿代表有外部中断请求到达中断控制器。INTQ是中断屏蔽控制逻辑传递给CPU的中断信号,接到微程序控制器上。当收到INTR脉冲信号时,若中断允许位INTE=0,则中断被屏蔽,INTQ仍然为0;若INTE =1,则INTQ =1。

单片机外部中断详解及程序

单片机外部中断详解及程序 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。 实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。 #include ;

unsigned int t=500; //定义一个全局变量t,并设定初始值为500次 //===========延时子函数,在8MHz晶振时约 1ms============= void delay_ms(unsigned int k) { unsigned int i,j; for(i=0;i

定时中断T0服务程序参考框图

软件程序: ORG 0000H LJMP MAIN ORG 000BH LJMP PIT0 ORG 001BH LJMP PIT1 ORG 0100H MAIN: MOV SP,#FH ;设堆栈指针 MOV SCON,#00H ;设置串行口为方式0 MOV TMOD,#11H ;T0和T1初始化为方式1 MOV TH0, #3CH ;置时间常数,T0和T1定时100ms MOV TL0, #OB0H MOV TH1, #3CH MOV TL1, #0B0H MOV 50H, #96H ;T0中断次数计数单元 MOV 51H,#14H ;T1中断次数计数单元 MOV R1, #00H MOV R2, #00H MOV R0, #40H ;显示缓冲单元起始地址 DISP0:MOV @R0, #00H ;显示缓冲单元清零 INC R0 CJNE R0, #4CH,DISP0 MOV 44H,#01H ;设置通道号的显示缓冲单元 MOV 48H,#02H MOV R7,#40H ;置当前通道显示缓冲单元首址 MOV 53H,#40H SETB ETO ;开中断 SETB ET1 SETB EA SETB TR0 ;启动定时器 SETB TR1 LP: MOV R7, 53H ;调显示子程序 ACALL DISP AJMP JP 定时器TO中断服务程序 PIT0: MOV TH0, #3CH ;重置时间常数 MOV TL0, #OBOH DJNZ 50H,#96H PUSH ACC PUSH 03H ACALL WDXJ ;调温度巡检子程序 POP 03H POP ACC

DH0: RET1 定时器T1中断服务程序 PIT1: MOV TH1,#3CH ;重置时间常数 MOV TL0, #OBOH DJNZ 51H,DH1 ;计数20次即定时2S MOV 51H,#14H INC R2 CJNE R2,#03H,CNL0 ;根据R2中的内容确定显示缓冲区首址 MOV R2,#00H CNL0: CJNE R2,#00H,CNL1 MOV 53H,#40H SJMP DH1 CNL1: CJNE R2,#01H,CNL2 MOV 53H,#40H SJMP DH1 CNL2: MOV 53H,#48H DH1: RETI 显示子程序 DISP: CLR P3.7 ;输出锁存 MOV R3,#01H ;置显示字位码 MOV DPTR,#TAB DISP1:MOV A,R3 MOV SBUF,A ;字位码送串行口 JNB T1,$ ;等待串行转送结束 CLR T1 ;清串行中断标志 MOV A,R7 MOV R0,A MOV A,@RO ;取代显示的数据 MOVC A,@R0 ;查表求字段码 MOV SBUF, A ;字段码送串行口, JNB T1,$ ;等待串行中断标志 SETB P3.7 ;允许输出显示 ACALL DEL ;调延时子程序 MOV A,R3 JB ACC.3,DISP2 ;4位显示完否 RL A MOV R3,A INC R7 CLR P3.7 ;输出锁存 AJNP DISP1 DISP2:RET TAB : DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH DEL: PUSH 07H ;延时子程序

第5章 中断服务程序设计

第5章中断服务程序设计 中断服务程序(ISR)是嵌入式应用系统获取各种事件的基本手段,而“事件”是实时性问题的讨论基础和时间计算的起点。ISR的设计质量直接影响到系统的实时性指标和操作系统的工作效率。 只要没有关中断,中断服务程序可以中断任何任务的运行,可将中断服务程序可成比最高优先级(0级)还高的“任务”。 5.1中断优先级安排原则 中断源是系统及时获取异步事件的主要手段,其优先级安排原则如下: ●紧迫性:触发中断的事件允许耽误的时间越短,设定的中断优先级就越高。 ●关键性:触发中断的事件越关键(重要),设定的中断优先级就越高。 ●频繁性:触发中断的事件发生越频繁,设定的中断优先级就越高。 ●快捷性:ISR处理越快捷(耗时短),设定的中断优先级就越高。 中断服务程的功能应尽量简单,只要将获取的异步事件通信给关联任务,后续处理由关联任务完成。 5.2不受操作系统管理的中断服务程序 正常情况下,ISR应受操作系统的管理,因很多任务是靠ISR触发的。 但在两种情况下ISR不受操作系统管理:①没有必要;②操作系统没有对该ISR进行管理。 实时操作系统uC/OS-Ⅱ移植到ARM7体系的CPU上时,没有对FIQ进行处理,即FIQ 是不受操作系统管理的。 选用FIQ来响应实时性要求最高的高速采样操作是一个有效措施,保护现场的工作量很小(FIQ专有的8个寄存器不需要保护)。 在工程模板的系统启动文件Startup.s中,已经把汇编代码部分处理好,用户只需要用C 语言编写快速中断服务函数FIQ_Exception()即可,不需考虑保护现场和恢复现场的问题。 程序:Startup.s中队FIQ的处理 Reset ;异常向量表 LDR PC,ResetAddr ;跳转到复位入口地址 LDR PC,UndefinedAddr LDR PC,SWI_Addr ;跳转到软件中断入口地址 LDR PC,PrefetchAddr LDR PC,DataAbortAddr DCD 0xb9205f80 LDR PC,[PC,#-0xff0] ;跳转到向量中断入口地址(向量中断控制器) LDR PC,FIQ_Addr ;跳转到快速中断入口地址 ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_Addr DCD SoftwareInterrupt PrefetchAddr DCD PrefetchAbort Nouse DCD 0

定时器中断c语言程序

定时器中断c语言解析interrupt x using y interrupt 表示中断优先级,using表示所用工作寄存器组。 interrupt x using y 跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1 4 串行中断 其它的根据相应得单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址 using y 这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个r0 -- r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来节省代码和时间 外部中断INT0 void intsvr0(void) interrupt 0 using 1 定时/计数器T0 void timer0(void) interrupt 1 using 1 外部中断INT1 void intsvr1(void) interrupt 2 using 1 定时/计数器T1 void timer1(void) interrupt 3 using 1 串口中断 void serial0(void) interrupt4 using 1 单片机的C语言 HNBCC培训 电话:137******** 一,中断的概念 中断:当计算机执行正常程序时,系统中出现某些急需处理的异常情况和特殊请求. 中断的执行:当CPU正在执行某一程序时,若有中断响应,则CPU转而执行中断服务程序,当中断服务程序执行完毕后,CPU自动返回原来的程序继续执行. 中断服务程序的语句写法与函数的写法完全相同,所以,中断服务程序也是函数,只在函数头部有不同(后续). 中断服务程序的执行与函数的执行不同:函数的执行是有固定位置的,是通过函数的调用来完成的;而中断服务程序的执行是不固定位置的,只要有中断响应,在一定条件下都会去响应中断,即执行中断服务程序. 二,中断源 中断源:任何引起计算机中断的事件,一般一台机器允许有许多个中断源. 8051系列单片机至少有5个可能的中断(8052有6个,其它系列成员最多可达15个).下面以5个中断源为例.

uCOSii中断处理过程详解

一. UCOSII的中断过程简介 系统接收到中断请求后,如果CPU处于开中断状态,系统就会中止正在运行的当前任务,而按中断向量的指向去运行中断服务子程序,当中断服务子程序运行完成后,系统会根据具体情况返回到被中止的任务继续运行,或转向另一个中断优先级别更高的就绪任务。 由于UCOS II是可剥夺型的内核,所以中断服务程序结束后,系统会根据实际情况进行一次任务调度,如果有优先级更高的任务,就去执行优先级更高的任务,而不一定要返回被中断了的任务。 二.UCOSII的中断过程的示意图 三.具体中断过程 1.中断到来,如果被CPU识别,CPU将查中断向量表,根据中断向量表,获得中断服务子程序的入口地址。 2.将CPU寄存器的内容压入当前任务的任务堆栈中(依处理器的而定,也可能压入被压入被中断了的任务堆栈中。

3.通知操作系统将进入中断服务子程序。即:调用OSIntEnter()或OSIntNesting直接 加1。 4.If(OSIntNesting==1){OSTCBCur->OSTCBStrPtr=SP;} //如果是第一层中断,则将堆栈指针保存到被中断任务的任务控制块中 5.清中断源,否则在开中断后,这类中断将反复的打入,导致系统崩贵 6.执行用户ISR 7.中断服务完成后,调用OSIntExit().如果没有高优先级的任务被中断服务子程序激活而进入就绪态,那么就执行被中断了的任务,且只占用很短的时间. 8.恢复所有CPU寄存器的值. 9.执行中断返回指令.

四.相关代码 与编译器相关的数据类型: typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef unsigned int OS_STK; //堆栈入口宽度为16 位(一) void OSIntEnter (void)的理解 uCOS_II.H中定义:

中断概述和中断处理过程

第23课中断概述可屏蔽中断处理过程 教学目的:了解中断的相关概念,掌握可屏蔽中断的处理过程。 教学重点:中断响应过程、中断向量和中断服务过程。 教学难点:中断向量。 授课内容: 一、中断概念 1.中断源 2.中断响应 3.中断向量表 4.中断优先级 5.中断屏蔽 二、中断分类 8086/8088有一个强有力的中断系统,可以处理256种不同的中断,256种中断可以分为两大类:外部中断和内部中断。 1.外部中断 也称为硬件中断,是由外部的硬件产生的。分成不可屏蔽中断请求和可屏蔽中断请求。 2.内部中断 又称为软件中断。通常有三种情况引起:由中断指令INT引起的中断;由CPU 的某些运算错误引起的中断;由调试程序debug设置的中断。 三、CPU响应中断过程 可屏蔽中断处理的过程一般分成几步:中断请求;中断响应;保护现场;转入执行中断服务子程序;恢复现场和中断返回。 CPU响应中断要有三个条件: 外设提出中断申请 本中断位未被屏蔽 中断允许 CPU在响应外部中断,并转入相应中断服务子程序的过程中,自动依次做以

下工作: (1)从数据总线上读取中断类型号,将其存入内部暂存器。 (2)将标志寄存器PSW的值入栈。 (3)将PSW中的中断允许标志IF和单步标志TF清0,以屏蔽外部其它中断请求,及避免CPU以单步方式执行中断处理子程序。 (4)保护断点。 (5)根据中断类型号到中断向量表中找到中断向量,转入相应中断服务子程序。 (6)中断处理程序结束以后,从堆栈中依次弹出IP、CS和PSW,然后返回主程序断点处,继续执行原来的程序。 四、中断向量表 寻找中断源可以用查询中断及矢量中断两种方法。 1.中断向量表 又称中断服务程序入口地址表。8086允许处理256种类型中断,对应类型号为0~FFH。 2.中断向量的设置 供用户使用的中断类型号,它可由用户定义为软中断,由INT n指令引用;也可通过1NTR端直接接入,或通过中断控制器8259A引入可屏蔽硬件中断。有两种方法可将中断服务程序的入口地址置入中断类型号n所对应的中断向量表中。一种方法用指令来设置,另一种方法利用DOS功能调用来设置。 设置中断向量:预置AL=中断类型号 DS:DX=中断服务程序入口地址 AH=25H 执行: INT 21H 取中断向量:预置AL=中断类型号 AH=35H 执行: INT 21H 返回: ES:BX=中断服务程序人口地址 3.中断类型号的获取

stm32 EXTI 中断系统 编程步骤

中断系统编程步骤: 以“按K1(按键K1接到PB7管脚)产生一次EXTI中断, L3 (L3接到PC13管脚) 将闪烁一次。”为例。 第一部分配置中断系统 步骤一加入以下头文件: #include "stm32f10x_lib.h" //若使用RCC_Configuration( ); 使能外设对应的时钟,还必须加入以下头文件。//若使用具体的使能外设时钟命令(例如,RCC_APB2PeriphClockCmd( )等),则不需要加入以下头文件。 #include "HelloRobot.h"//(包含RCC_Configuration、GPIO_Configuration、USART_Configuration、NVIC_Configuration这3个函数的HelloRobot.h文件)步骤二GPIO 配置: ①定义用于初始化GPIOx 端口参数的结构体变量 GPIO_InitTypeDef GPIO_InitStructure; ②使能GPIO端口外设对应的时钟(或RCC_Configuration( ); ) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); ③定义GPIOx端口管脚、响应速度、工作模式,即定义GPIO端口的初始化参数(通过为结构体变量GPIO_InitStructure 的成员赋值实现): GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); ④(调用函数GPIO_Init()来)初始化GPIOx端口,(完成对端口中的寄存器的设置。) GPIO_Init(GPIOx , &GPIO_InitStructure); 步骤三EXTI 的配置: ①定义用于初始化EXTI(外部中断/事件)参数的结构体变量: EXTI_InitTypeDef EXTI_InitStructure; ②使能EXTI外设对应的时钟----注意:当使用EXTI外设时,使能的是AFIO时钟,而不是EXTI外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

8051单片机的中断响应过程解析

8051单片机的中断响应过程解析 8051的CPU在每个机器周期期间,顺序采样每个中断源,CPU在下一个机器周期按优先级顺序查询中断标志,如查询到某个中断标志为1,将在下一个机器周期期间按优先级来进行中断处理。在下列任一种情况存在时,中断申请将被封锁。 1、CPU正在执一个同级或高级的中断服务程序 2、当前机器周期不是当前指令周期的最后一个机器周期,即要保证把当前指令执行完。 CPU响应中断,由硬件自动将相应的中断矢量地址装入程序程序计数器PC,转入该中断服务程序进行处理。 对于有些中断源,CPU在响应中断后会自动清除中断标志,如定时器溢出标志TF0,TF1,以及部中断标志IE0,IE1。 而有些中断标志,不会自动清除,只能由用户用户软件清除,如串行口接收发送中断标志RI,T1。CPU执行中断服务程序之前,自动将程序计数器PC内容压入堆栈保护,然后将对应的中断矢量装入程序计数器PC,使程序转向该中断矢量地址单元中,以执行中断服务程序,中断服务程序从矢量地址开始执行,一直到返回指令“RETI”为止。“RETI”指令的操作,一方面告诉中断系统中断服务程序以执行完毕,另一方面把原来压入堆栈保护的断电地址从栈顶弹出,装入程序计数器PC,使程序返回被中断的程序断点处,以便继续执行。 外部中断响应时间外部中断INT0和INT1的电平在每个机器周期,经反向后锁存到IE0和IE1的标志位,CPU在下一个机器周期才会查询到新置入的IE0和IE1,这时如果满足响应条件,CPU响应中断时,要用二个机器周期执行一条硬件长调用指令“LCALL”。所以,从产生外部中断到开始执行中断程序至少需要三个完整的机器周期。如果在中断申请时,CPU正在长指令,如乘法和除法指令等四周期指令,则额外等待时间增加三个周期;若正在执行“RETI”指令或访问IE,IP的指令,则额外等待时间又增加两个周期。综上估计,在单一中断系统里,外部中断响应时间约在3-8个机器周期之间。 下面我们仍以打印机为例来说明外中断源的使用方法。硬件连接和查询方式基本一致,

中断程序写法

第三部分定时器中断培训(09.17) 关于定时器中断,我们简单介绍一下原理就可以了,因为具体介绍已经有很多资料都已经提供了。 80C51单片机内部设有两个16位的可编程定时器/计数器。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1 构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式; TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0 (P3.4)和T1(P3.5)输入。定时计数器的原理: 当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。显然,定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。如果晶振为12MHz,则计数周期为: T=1/(12×106)Hz×1/12=1μs 这是最短的定时周期。若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长度(如8位、13位、16位等)。 当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平。若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的计数值装入计数器。所以检测一个由1至0的跳变需要两个机器周期,故外部事年的最高计数频率为振荡频率的1/24。例如,如果选用12MHz晶振,则最高计数频率为0.5MHz。虽然

中断异常处理流程

计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。 微 于处于未知状态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。 2.异常处理程序设计 2.1 异常响应流程

由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的异常处理函数都位于32MB范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给PC。异常处理调用关系如图1所示。 三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码: HandlerXXX sub sp,sp,#4 ;减少sp,保存跳转地址 stmfd sp!,{r0} ;将工作寄存器压入堆栈 通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。该代码主要实现跳转功能,把异常处理程序地址HandleXXX送到PC中。例如产生IRQ中断时,PC会被强制设置为0x18,执行指令:b HandlerIRQ 在HandlerIRQ程序段内,处理器做一些必要的处理,就会将_ISR_STARTADDRESS 表中存放的IRQ入口地址送入PC,然后开始执行相关中断程序。由于_ISR_STARTADDRESS 表存放在RAM中,后面的C语言程序可以方便地更改相关中断服务程序的内容。

微机原理与接口-中断服务程序编写作业

8086 Demo Board AD7 AD6AD5AD4AD3AD2AD1AD0D7 D6D5D4D3D2D1D0A5A6A7 A8A9AD0A0AD1A1AD2A2AD3A3A4AD5A5AD6A6AD7 A7 AD4A9A15 AD8AD9AD10AD11AD12AD13AD14AD15A8A10A11A12A13A14A19 AD16AD17AD18AD19 A16A17A18D15 D14D13D12D11D10D9D8AD15 AD14AD13AD12AD11AD10AD9AD8D7D0D6D5D4D3D2D1A10A11A12A14A15 A13AD[0..15] AB[0..19] RD WR AD[16..19]AD[16..19] BHE +5V AD[0..15]READY 22INTR 18NMI 17RESET 21CLK 19 MN/MX 33HOLD/GT131HLDA/GT030A[16..19]M/IO/S028 ALE/QS025DT/R/S127INTA/QS124TEST 23BHE 34DEN/S226RD 32WR/LOCK 29U1 8086 LOAD_SEG=0x0800 IO0IO1IO2IO3IO4IO5IO6IO7 M/IO M/IO NMI A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B7 11 CE 19AB/BA 1 U12 74LS245 AD[0..15] D[0..7] A 1 B 2 C 3E16E24E35 Y015Y114Y213Y312Y411Y510Y69Y7 7 U14 74LS138 D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q7 19 OE 1CLK 11 U6 74LS374 D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718 Q7 19 OE 1CLK 11 U7 74LS374 D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q7 19 OE 1CLK 11 U10 74LS374 A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B7 11 CE 19AB/BA 1 U18 74LS245 D[8..15] AD[0..15] D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q7 19 OE 1LE 11 U4 74LS373 D[0..7] RD WR A1INTA IO1INTR INTA INTR WR IO7 D[0..7]1 2 U2:A 74LS04IR018 IR119IR220IR321IR422IR523IR6 24IR7 25 INT 17INTA 26CS 1 WR 2RD 3A027SP/EN 16D[0..7]CAS[0..2]U5 8259 A 1 B 2 C 3 E16E24E35 Y015Y114Y213Y312Y411Y510Y69Y7 7 U9 74LS138 3 4 U2:B 74LS04 56 4 U3:B 74LS02 23 1 U3:A 74LS02 作业:8259在系统中的连接如图所示,已知8259中断类型号为:08h-0fh,8259的端口地址和发光二极管输出端口地址可从图中分析得出,现要求实现如下功能:用按键模仿外设发出中断请求信号,用8只发光二级管显示所发出的中断请求次数。请编写主程序和中断服务程序。

中断服务程序

目录 摘要 (1) 中断服务程序 (2) 1设计任务与分析 (2) 1.1 设计任务 (2) 1.2 任务分析 (2) 2 总体方案设计 (3) 2.1 设计思路 (3) 2.2 鼠标操作简介 (3) 2.2.1 鼠标简介 (3) 2.2.2 鼠标驱动程序的主要功能 (3) 2.3 本设计调用的中断服务程序 (4) 3 程序设计流程图及程序设计 (6) 3.1程序流程图 (6) 3.2 主程序的设计与分析 (7) 3.3 小车显示子程序的设计与分析 (9) 3.4 清屏子程序的设计 (12) 4 调试过程 (13) 5 程序运行结果 (14) 小结与体会 (16) 附录: (16) 参考文献 (23)

摘要 微机原理和接口技术是一门实践性强的学科,其中很多的原量、规则、现象等仅仅靠学习教科书是无法完全掌握的,必须通过实践才能比较直观和深刻的理解。所以做好课程设计能够对本课程有更深刻的认识。 本设计是一个中断服务程序,要求捕获鼠标的状态并用小车图形做出相应的表示。首先检测鼠标的状态,再通过读取小车字符来显示不同状态下的字符组合,从而画出小车图形。当按鼠标左键时,小车左边显示出一个L;当按鼠标右键时,小车右边显示一个R;当鼠标移动时,小车也跟着移动。通过一个循环体使得鼠标状态可以一直得到检测,从而实现所需的功能。 在进行课程设计的过程中,通过分析问题、提出解决方案、通过编程等手段实现解决方案、不断调试最终达到设计要求的全过程,帮助了我系统地掌握微机原理的接口技术的相关知识,达到了将知识融会贯通的目的。 关键词:中断服务程序,鼠标状态,小车

中断服务程序 1设计任务与分析 1.1 设计任务 设计一个程序,可以捕获鼠标左键,右键以及移动,并利用小车图形做出相应的表示。 1.2 任务分析 计算机在执行正常程序的过程中,出现异常事件(或事先安排好的事件),迫使CPU 暂时中止现行程序的执行,转去执行事件处理程序。当处理完毕后,CPU再返回到被暂时中止的程序继续执行,这个过程称为中断。 固化在ROM中的基本输入输出系统BIOS包含了主要I/O设备的处理程序和许多常用例行程序,他们一般以中断处理程序的形式存在。如显示输出的10H号中断处理程序,答应输出的17H号中断处理程序,键盘输入的16H号中断处理程序。BIOS直接建立在硬件的基础上。 本设计要求设计的中断程序可以捕获鼠标左键右键及其移动,因此程序肯定涉及到与鼠标功能有关的设计技巧,另外,还要通过小车图形做出相应的表示,所以还要有屏幕设置和坐标计算等过程。

相关文档
相关文档 最新文档