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