ARM9S3C2440的寄存器特别多,这也是它和单片机不同处之一,对ARM的编程首要也是对寄存器的操作,可是寄存器多了今后,就很简单忘掉对某个寄存器的设置,假如能够总结一下寄存器装备的过程,使得其有章可循,那么运用的时分就能够对号入座了。假如长期不去运用ARM的话,再次运用的时分从头翻看烦人的芯片用户手册,显得就浪费时刻了,这样,趁着了解的时分记录下这些关键,今后稍加翻看就能引发回忆,这也是自己写这些博客的缘由。
定时器初始化装备过程首要有:
1、rTCFG0和rTCFG1的设置
首先要设置定时器的时钟频率,
TimerinputclockFrequency=PCLK/{prescalervalue+1}/{dividervalue}
TCFG0的[7:0]保存的是定时器0和定时器1的prescalervalue,[15:8]保存的是定时器2和定时器3以及定时器4的prescalervalue。
TCFG1从低位开端每四位表明dividervalue。
0000=1/2
0001=1/4
0010=1/8
0011=1/16
01xx=ExternalTCLK0
比方:rTCFG0=49;//pclk/(49+1)
rTCFG1=0x03;//16分频=62500HZ
2、rTCNTBx和rTCMPBx的设置
设置TCON发动定时器x(x表明0-4,2440有5个16位的定时器,定时器0-3有PWM功用,有输出引脚,定时器4没有输出引脚),这时TCNTBx→TCNTx,TCMPBx→TCMPx,在定时器的作业频率下,TCNTx开端减1,其值能够读取TCNTOx获取。当TCNTx=TCMPx时,定时器x的输出管脚TOUTx回转,TCNTx持续减1计数,当TCNTx=0时,其输出管脚TOUTx再次回转,并触发定时器x的中止。所以作为中止用的计时值由rTCNTBx确认,用作PWM功用时,PWM的频率由rTCNTBx确认,占空比由rTCMPBx确认,占空比等于rTCMPBx/rTCNTBx。TOUTx(x=0~3)外接蜂鸣器操控蜂鸣器的频率或许外接LED灯操控LED灯的亮度,占空比越大,蜂鸣器频率越大,LED灯越亮。假如不作为PWM用途时,一般将rTCMPB0设置为0。
比方:rTCNTB0=62500/2;//TCNTB0[15:0]=计数值
rTCMPB0=0;
3、rTCON的设置
TCON寄存器操控着定时器的发动(1表明发动)、是否主动装载初值(TCNTBx和TCMPBx,1表明主动装载)、PWM死区是否发动(,1表明启用死区)、TOUTx回转发动(1表明答应回转)。
如:rTCON=0x09;//,发动定时器,并答应重载TCNTB0、TCMPB0
4、清IRQ或FIQ中止,如调用ClearPending(BIT_TIMER0)函数。
关于子中止运用ClearSubPending(intbit)。
BIT_TIMER0在2440addr.h中的宏界说是
#defineBIT_TIMER0(0x1<<10)
ClearPending函数的在头文件2440addr.h中的界说为:
__inlinevoidClearPending(intbit)
{
registeri;
rSRCPND=bit;
rINTPND=bit;
i=rINTPND;
}
__inlinevoidClearSubPending(intbit)
{
registeri;
rSUBSRCPND=bit;
i=rINTPND;
ClearPending和ClearSubPending是内联函数,编译时,相似宏替换,运用函数体替换调用途的函数名而不是去调用这两个函数,用添加程序代码巨细的价值交换程序运转的功率,由于函数调用需求维护现场,入栈和出栈耗用CPU时刻。
SRCPND、SUBSRCPND、INTPND相应位为1表明有相应的中止产生,SRCPND、SUBSRCPND能够有多位一起置1,表明有多个中止产生,可是INTPND寄存器是通过优先级判决后的,所以同一时刻只能有一位为1。
别的值得留意的是SRCPND、INTPND、SUBSRCPND三个挂起寄存器的清零不是直接写入0,而是将对应的方位1,这个必定要留意,当然了,编程的时分直接调用这两个函数就行,它现已包含在头文件中,可是了解这个特别之处仍是很有意思的。
5、rEXTINTx(P301)、rEINTPEND(P306)、rEINTMASK(P305)的设置
这三种寄存器是对外部中止而言的,定时器是内部中止,定时器初始化无需对这些寄存器装备,当用到按键、开关等外部中止就要对这几个寄存器装备。
EXTINTx寄存器用于设置25个外部中止的中止触发方法,000=低电平,001高电平,01x=下降沿,0x上升沿,11x边缘触发Bothedgetriggered。比方设置外部中止11,13-15中止触发方法为下降沿触发。
rEXTINT1&=~(7<<12|7<<20|7<<24|7<<28);
rEXTINT1|=(2<<12|2<<20|2<<24|2<<28);
EINTPEND寄存器相应位为1表明相应的外部中止产生,0表明没有相应中止产生,初始化中要对该寄存器清零,避免原有中止搅扰,清零的方法和SRCPND、SUBSRCPND、INTPND三个寄存器的清零方法相同,向相应位写入1,可是没有相似ClearPending的函数调用,有必要自己写。比方外部中止11,13-15中止挂起寄存器清零:
rEINTPEND|=(1<<11)|(1<<13)|(1<<14)|(1<<15);
EINTMASK寄存器0表明答应对应位中止,1表明制止对应位中止,默许是制止的,如外部中止11,13-15中止答应,相应位写入0
rEINTMASK&=~((1<<11)|(1<<13)|(1<<14)|(1<<15));
别的也要运用ClearPending(BIT_EINT1|BIT_EINT2|BIT_EINT8_23)清中止挂起寄存器,留意,方才EINTPEND是清次中止,EXTINT8-23都递归于IRQ的中止号5,所以这儿清的是主IRQ中止。
6、rINTMOD(P386)的设置,可选
一般能够不设置,由于默许为IRQ形式中止,除非要设置成FIQ形式,INT相应位为1,中止源为FIQ形式,0表明IRQ形式,FIQ一般用于处理特别紧迫的中止。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/255771.html