嵌入式实训14Word文档下载推荐.docx

上传人:b****6 文档编号:21934394 上传时间:2023-02-01 格式:DOCX 页数:10 大小:28.78KB
下载 相关 举报
嵌入式实训14Word文档下载推荐.docx_第1页
第1页 / 共10页
嵌入式实训14Word文档下载推荐.docx_第2页
第2页 / 共10页
嵌入式实训14Word文档下载推荐.docx_第3页
第3页 / 共10页
嵌入式实训14Word文档下载推荐.docx_第4页
第4页 / 共10页
嵌入式实训14Word文档下载推荐.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

嵌入式实训14Word文档下载推荐.docx

《嵌入式实训14Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《嵌入式实训14Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。

嵌入式实训14Word文档下载推荐.docx

TCMPBn的值用于PWM或产生波形。

当减法计数器的值和比较寄存器的值匹配时,定时器控制逻辑将改变输出电平。

这样可以控制定时器输出的波形占空比。

图3-1是定时器2和3的结构图,其中没有死区发生器。

图3-1定时器电路结构

由于自动重装发生在计数器到达0时,所以最开始计数器值是未知的。

此时,初始值必须由人工刷新位装载,启动定时器的步骤如下:

1)将初始值写入TCNTBn和TCMPBn。

2)将该定时器的人工刷新位(manualupdatebit)置1,建议同时配置反转开关位(inverteron/offbit)。

3)将该定时器的启动位置1,启动定时器,同时清除人工刷新位。

定时器时钟频率和比例因子(维信科技,太原最好的IT培训)、分频系数以及系统主频的关系如下:

TimerinputclockFrequency=MCLK/{prescalervalue+1}/{dividervalue}

{prescalervalue}=0-255

{dividervalue}=2,4,8,16,32

关于TCFG0、TCFG1和TCON等寄存器的说明请参考“电机驱动实验”或阅读44B0芯片手册。

在此不再重述。

2、中断控制器

S3C44B0的中断控制器接受来自于30个中断源的请求。

这些中断源包括DMA控制器,UART和SIO等等(维信科技,太原最好的IT培训)。

其中外部中断EINT4/5/6/7是相或的。

中断控制器的任务是经过仲裁过程(当有多个中断源同时发出中断请求时)将FIQ或IRQ中断请求递交给ARM7TDMI核。

S3C44B0支持基于软件优先级算法的仲裁过程,也支持向量中断模式。

前者在有多个中断请求产生时,将读取中断挂起寄存器来决定中断服务的优先级。

44B0的中断控制器硬件直接提供了中断服务向量表,当有多个中断请求时硬件优先级逻辑决定响应哪个中断。

向量中断模式较之软件方法减少了中断响应时间。

要使能IRQ或FIQ中断响应必须清除程序状态字PSR中的I-bit或F-bit并且必须清除INTMSK中的相关位。

如果PSR中的I-bit或F-bit置1,CPU将不接受中断控制器的IRQ或FIQ。

ARM7TDMI具有两种中断类型:

IRQ中断请求,FIQ快速中断请求。

所有的中断源都可以决定在中断请求时采用那种中断模式。

中断挂起寄存器表明是否有中断请求被挂起。

当某挂起位被置1,如果中断使能则启动中断服务例程(维信科技,太原最好的IT培训)。

它是只读寄存器,必须通过对I_ISPC或F_ISPC置1来清除。

当中断掩码寄存器的某位置1后表明对应中断被关闭。

如果某掩码位被置1而相应中断请求产生后,对应挂起位将被置1,但该中断不被响应。

由于本实验没有采用硬件向量中断模式,所以与此相关的优先级逻辑和响应过程在此从略,读者可以参考44B0数据手册。

和中断设置相关的寄存器如下:

1)INTCON:

使能IRQ向量模式、使能IRQ和FIQ到CPU的中断请求线。

其设置和位描述如表3-1和表3-2所示。

表3-1INTCON寄存器的设置

寄存器

地址

R/W

描述

复位值

INTCON

0x01E00000

中断控制寄存器

0x7

表3-2INTCON寄存器的位描述

INTCON

描述

初始化状态

Reserved

[3]

0

V

[2]

这个位使能/禁止IRQ的向量模式

0=向量中断模式

1=非向量中断模式

1

I

[1]

这个位使能IRQ中断请求线路到CPU。

0=IRQ中断使能

1=保留

注意:

在使用IRQ中断前,这个位清零。

F

[0]

这个位使能FIQ中断请求线路到CPU。

0=FIQ中断使能(不允许向量中断模式)

1=保留

在使用FIQ中断前自己必须清零。

2)INTPND:

其设置如表3-3所示。

表3-3INTPND寄存器的设置

寄存器

地址

R/W

INTPND

0x01E00004

R

说明中断请求状态。

0=没有请求中断

1=中断源提出中断请求。

0x0000000

3)INTMOD:

设置每个中断的类型,在本系统中全部选为IRQ,其设置如表3-4所示。

表3-4INTMOD寄存器的设置

INTMOD

0x01E00008

中断模式寄存器

0=IRQmode1=FIQmode

4)INTMSK:

每个中断源在各寄存器内的偏移位址都是一样的。

其设置及位描述如表3-5,表3-6所示(维信科技,太原最好的IT培训)。

表3-5INTMSK寄存器的设置

INTMSK

0x01E0000C

决定哪个中断源是屏蔽的。

对屏蔽的中断源没有服务。

0x07ffffff

0=中断服务使能

1=中断服务屏蔽

表3-6INTMSK寄存器的位描述

初始化状态

[27]

Global

[26]

0=服务使能

1=屏蔽

EINT0

[25]

0=服务使能

1=屏蔽

EINT1

[24]

EINT2

[23]

EINT3

[22]

EINT4/5/6/7

[21]

INT_TICK

[20]

INT_ZDMA0

[19]

INT_ZDMA1

[18]

INT_BDMA0

[17]

INT_BDMA1

[16]

INT_WDT

[15]

INT_UERR0/1

[14]

INT_TIMER0

[13]

INT_TIMER1

[12]

INT_TIMER2

[11]

INT_TIMER3

[10]

INT_TIMER4

[9]

INT_TIMER5

[8]

INT_URXD0

[7]

INT_URXD1

[6]

INT_IIC

[5]

INT_SIO

[4]

INT_UTXD0

INT_UTXD1

INT_RTC

INT_ADC

5)I_ISPR:

0=不服务1=现在服务,其设置如表3-7所示。

表3-7I_ISPR寄存器的设置

I_ISPR

0x01E00020

IRQ中断服务待处理寄存器

0x00000000

6)I_ISPC/F_ISPC:

清除中断挂起位,在中断服务程序结束前必须清除对应的中断挂起位。

其设置如表3-8所示。

表3-8I_ISPC/F_ISPC寄存器的设置

复位值

I_ISPC

0x01E00024

W

IRQ中断服务挂起清除寄存器

Undef.

F_ISPC

0x01E0003C

FIQ中断服务挂起清除寄存器

3、IRQ非向量中断模式的中断响应过程

在本系统中所有的中断均被分配为IRQ类型,采用软件优先级算法。

当有中断请求并且PSR、INTCON、INTMSK等寄存器允许中断响应时(维信科技,太原最好的IT培训),CPU会执行位于地址0x00000018的指令。

在44BINIT.S文件中可以看到该处的指令是bHandlerIRQ。

执行该指令程序跳转到:

HandlerIRQHANDLERHandleIRQ

其中HANDLER是一个宏,定义如下:

MACRO

$HandlerLabelHANDLER$HandleLabel

$HandlerLabel

subsp,sp,#4

stmfdsp!

{r0}

ldrr0,=$HandleLabel

ldrr0,[r0]

strr0,[sp,#4]

ldmfdsp!

{r0,pc}

MEND

该宏的意思是程序跳转到$HandlerLabel之后再跳转到$HandleLabel。

这意味着程序又跳转到了HandleIRQ处(维信科技,太原最好的IT培训),也就从0Bank的ROM空间跳到6Bank的SDRAM空间了,因为HandleIRQ实际上是一个RAM地址,从ADS环境下的工程路径的Init目录下isr_address.s文件和scat_ram.scf文件即可看出,其值是0xc7fff00+0x18。

另外,在44b.h文件中有如此定义:

#definepISR_IRQ(*(unsigned*)(_ISR_STARTADDRESS+0x18))

其中的宏_ISR_STARTADDRESS的定义在option.h文件中:

#define_ISR_STARTADDRESS0xc7fff00

这就意味着HandleIRQ和pISR_IRQ有着特殊的关系,前者是地址,后者是这个地址上的内容,也就是说pISR_IRQ就可认为是中断服务程序的地址了。

在UHAL.C中有这个函数voiduHALr_InterruptRequestInit()用来初始化中断(维信科技,太原最好的IT培训)。

其中有:

pISR_IRQ=(unsigned)IRQ_Handler;

而IRQ_Handler又回到了0Bank的ROM中,在44BINIT.S中有:

IRQ_Handler

IMPORTISR_IrqHandler

STMFDsp!

{r0-r12,lr}

BLISR_IrqHandler

LDMFDsp!

SUBSpc,lr,#4

EXPORTIRQ_Handler

从这段汇编程序看出,控制又转移到了ISR_IrqHandler上,这是IRQ的中断服务程序,定义在ISR.C中:

voidISR_IrqHandler()

{intIntOffset;

IntOffset=GetISROffsetClr();

//得到中断向量的偏移地址

(*InterruptHandlers[IntOffset])();

//运行中断服务程序

}

其中GetISROffsetClr()定义如下:

intGetISROffsetClr()//计算中断的偏移地址,高位优先

{inti,ispr=rI_ISPR,tmp=1<

<

(MAXHNDLRS-1);

//tempbit

for(i=MAXHNDLRS;

i>

0;

i--){

if(ispr&

tmp){

rI_ISPC=tmp;

returni-1;

tmp>

>

=1;

}

return-1;

实际上这段程序就是软件优先级算法,通过查看I_ISPR寄存器,决定应该执行的真正的对应于具体中断的中断服务程序。

并使用rI_ISPC寄存器清除中断挂起位。

而(*InterruptHandlers[IntOffset])();

则是把控制最终转移到了ISR上。

然而,实际的ISR是如何和这套极其复杂的中断响应过程发生关系的呢?

这里用SetISR_Interrupt()函数把用户编写的ISR设置在中断系统上,也就是把ISR的函数指针存放到数组InterruptHandlers[]里,(维信科技,太原最好的IT培训)有中断请求时GetISROffsetClr()会在该数组里找到它的。

六、实训步骤

1.编写定时器的初始化等控制函数,因为平台上定时器0、1、2都分配给了电机控制,这里选择定时器3,编程主要针对Timer3。

2.编写定时器中断服务程序,完成对中断次数的计数。

3.编写LED显示多位整数的函数,测试该程序能否正确显示9999以下整数。

有关ZLG7289芯片的编程请参考“LED和键盘驱动实验”。

这里所谓的驱动程序,指的是针对具体硬件编写的若干函数及定义(维信科技,太原最好的IT培训)。

即使在后面的UCOS-II操作系统下,对硬件驱动程序也没有任何组织和管理,所谓的驱动函数和其他函数没有什么差别。

UCOS-II系统和硬件驱动函数之间没有二次映射关系。

4.编写中断初始化等函数,这里打开或关闭中断分为两个层面,其一是针对程序状态字PSR的,用汇编语言编写如下:

INTS_OFF

mrsr0,cpsr;

当前CSR寄存器

movr1,r0;

拷贝CSR寄存器到r1中

orrr1,r1,#0xC0;

屏蔽中断位

msrCPSR_cxsf,r1;

关闭ints(IRQ和FIQ)

andr0,r0,#0x80;

从原csr寄存器返回FIQ位

movpc,lr;

返回

INTS_ON

当前CSR寄存器

bicr0,r0,#0xC0;

开启中断位

msrCPSR_cxsf,r0;

使能中断(IRQ和FIQ)

movpc,lr;

另一个层面就是对INTCON和INTMSK寄存器的操作了(维信科技,太原最好的IT培训)。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1