嵌入式实训14.docx
- 文档编号:8798219
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:28.78KB
嵌入式实训14.docx
《嵌入式实训14.docx》由会员分享,可在线阅读,更多相关《嵌入式实训14.docx(10页珍藏版)》请在冰豆网上搜索。
嵌入式实训14
嵌入式实训14——维信科技
一、实训目的
1.了解44B0处理器的定时器应用。
2.学习在44B0处理器上中断的应用。
3.进一步熟悉平台外围硬件及其驱动程序的编写。
二、实训内容(维信科技,太原最好的IT培训)
1.设置并启动定时器。
2.设置中断,编写定时器中断服务程序,对中断次数进行计数并用LED显示结果(维信科技,太原最好的IT培训)。
三、预备知识
1.掌握在ARMSDT2.5或ADS1.2集成开发环境中编写和调试程序的基本过程。
2.了解ARM7处理器的结构,阅读定时器和中断控制器相关文档。
四、设备及工具
硬件:
ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上。
软件:
PC机操作系统win98、Win2000或WinXP、ARMSDT2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
五、原理及说明
1、定时器原理
S3C44B0X具有6个16bit定时器,每个定时器可以基于中断模式或DMA模式运行。
定时器0、1、2、3具有PWM功能,定时器0还具有死区发生器可用于大电流设备。
关于PWM功能的应用请参考“电机驱动实验”部分。
定时器0和1,2和3,4和5分别共享3个8bit预比例因子寄存器。
每个定时器都各有一个4或5级的分频器,用TCFG0和TCFG1可以设置这些比例因子或分频系数。
计数值缓存寄存器TCNTBn的值在定时器启动后装载到减法计数器中。
比较缓存寄存器TCMPBn的值将装载到比较寄存器中以和计数器中的值进行比较。
TCNTBn和TCMPBn的这种双缓存技术使得当频率和占空比改变时定时器能有一个稳定的输出(维信科技,太原最好的IT培训)。
即使设置了一个新的计数值,当前定时器操作继续完成。
当减法计数器到达0时将产生定时器中断请求,通知CPU定时器操作已经完成。
此时,如果自动重装控制位使能,TCNTBn的值会自动装载到计数器并开始下一操作周期。
当通过清除定时器使能位等方法使定时器停止后,计数值将不会自动重装。
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
R/W
中断控制寄存器
0x7
表3-2INTCON寄存器的位描述
INTCON
位
描述
初始化状态
Reserved
[3]
0
0
V
[2]
这个位使能/禁止IRQ的向量模式
0=向量中断模式
1=非向量中断模式
1
I
[1]
这个位使能IRQ中断请求线路到CPU。
0=IRQ中断使能
1=保留
注意:
在使用IRQ中断前,这个位清零。
1
F
[0]
这个位使能FIQ中断请求线路到CPU。
0=FIQ中断使能(不允许向量中断模式)
1=保留
注意:
在使用FIQ中断前自己必须清零。
1
2)INTPND:
其设置如表3-3所示。
表3-3INTPND寄存器的设置
寄存器
地址
R/W
描述
复位值
INTPND
0x01E00004
R
说明中断请求状态。
0=没有请求中断
1=中断源提出中断请求。
0x0000000
3)INTMOD:
设置每个中断的类型,在本系统中全部选为IRQ,其设置如表3-4所示。
表3-4INTMOD寄存器的设置
寄存器
地址
R/W
描述
复位值
INTMOD
0x01E00008
R/W
中断模式寄存器
0x0000000
0=IRQmode1=FIQmode
4)INTMSK:
每个中断源在各寄存器内的偏移位址都是一样的。
其设置及位描述如表3-5,表3-6所示(维信科技,太原最好的IT培训)。
表3-5INTMSK寄存器的设置
寄存器
地址
R/W
描述
复位值
INTMSK
0x01E0000C
R/W
决定哪个中断源是屏蔽的。
对屏蔽的中断源没有服务。
0x07ffffff
0=中断服务使能
1=中断服务屏蔽
表3-6INTMSK寄存器的位描述
INTMSK
位
描述
初始化状态
Reserved
[27]
0
Global
[26]
0=服务使能
1=屏蔽
1
EINT0
[25]
0=服务使能
1=屏蔽
1
EINT1
[24]
0=服务使能
1=屏蔽
1
EINT2
[23]
0=服务使能
1=屏蔽
1
EINT3
[22]
0=服务使能
1=屏蔽
1
EINT4/5/6/7
[21]
0=服务使能
1=屏蔽
1
INT_TICK
[20]
0=服务使能
1=屏蔽
1
INT_ZDMA0
[19]
0=服务使能
1=屏蔽
1
INT_ZDMA1
[18]
0=服务使能
1=屏蔽
1
INT_BDMA0
[17]
0=服务使能
1=屏蔽
1
INT_BDMA1
[16]
0=服务使能
1=屏蔽
1
INT_WDT
[15]
0=服务使能
1=屏蔽
1
INT_UERR0/1
[14]
0=服务使能
1=屏蔽
1
INT_TIMER0
[13]
0=服务使能
1=屏蔽
1
INT_TIMER1
[12]
0=服务使能
1=屏蔽
1
INT_TIMER2
[11]
0=服务使能
1=屏蔽
1
INT_TIMER3
[10]
0=服务使能
1=屏蔽
1
INT_TIMER4
[9]
0=服务使能
1=屏蔽
1
INT_TIMER5
[8]
0=服务使能
1=屏蔽
1
INT_URXD0
[7]
0=服务使能
1=屏蔽
1
INT_URXD1
[6]
0=服务使能
1=屏蔽
1
INT_IIC
[5]
0=服务使能
1=屏蔽
1
INT_SIO
[4]
0=服务使能
1=屏蔽
1
INT_UTXD0
[3]
0=服务使能
1=屏蔽
1
INT_UTXD1
[2]
0=服务使能
1=屏蔽
1
INT_RTC
[1]
0=服务使能
1=屏蔽
1
INT_ADC
[0]
0=服务使能
1=屏蔽
1
5)I_ISPR:
0=不服务1=现在服务,其设置如表3-7所示。
表3-7I_ISPR寄存器的设置
寄存器
地址
R/W
描述
复位值
I_ISPR
0x01E00020
R
IRQ中断服务待处理寄存器
0x00000000
6)I_ISPC/F_ISPC:
清除中断挂起位,在中断服务程序结束前必须清除对应的中断挂起位。
其设置如表3-8所示。
表3-8I_ISPC/F_ISPC寄存器的设置
寄存器
地址
R/W
描述
复位值
I_ISPC
0x01E00024
W
IRQ中断服务挂起清除寄存器
Undef.
F_ISPC
0x01E0003C
W
FIQ中断服务挂起清除寄存器
Undef.
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!
{r0-r12,lr}
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
mrsr0,cpsr;当前CSR寄存器
bicr0,r0,#0xC0;开启中断位
msrCPSR_cxsf,r0;使能中断(IRQ和FIQ)
movpc,lr;返回
另一个层面就是对INTCON和INTMSK寄存器的操作了(维信科技,太原最好的IT培训)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 14