您的位置 首页 发布

3C2440A的中止控制器和定时器

看了开发板配套光盘中的非操作系统示例代码,试着进行简化,只留下最核心的启动代码,然后自己编写makefile进行编译,烧录到开发板中进行实…

看了开发板配套光盘中的非操作体系示例代码,试着进行简化,只留下最中心的发动代码,然后自己编写makefile进行编译,烧录到开发板中进行试验,总算成功了。第一个程序运转后仅仅简略地让4个LED轮番舱位封闭,尽管没有看懂是怎样做到操控LED的,但看懂了体系发动部分,并且把有点乱的代码整理得规整了些;第二个程序运转后能够从串口输出文本,这对今后的进一步学习很重要,我们串口输出是很重要的调试手法(从显示屏输出文本太杂乱,不是初学者能够简单搞定的)。此外,看了《根据ARM的嵌入式体系开发与实例》,尽管第4章,第5章看得很晕,我们存储器操控器比较杂乱,书中讲了很多硬件衔接以及操作时序的问题,曾经彻底没触摸过,根底不行,看不懂。但第6章和第7章讲的中止操控器和PWM守时器,看门狗守时器仍是比较好懂的,然后结合S3C2440A用户手册,了解了S3C2440A与书中讲的S3C44B0X的差异。把书中的比如改成能够在自己的开发板上运转的程序,烧录进去,运转得与预期效果共同。

0 阐明

我用的开发板是mini2440,它选用的处理器是根据ARM920T的S3C2440A;而看的教材《根据ARM的嵌入式体系开发与实例》是以根据ARM7TDMI的S3C44B0X为例进行解说的。

1 中止操控器

S3C2440A能够承受60个来自内部外设或许外部中止引脚的中止恳求,多个中止恳求经过仲裁判优后向ARM920T中心宣布IRQ或许FIQ恳求。S3C2440A与S3C44B0X有几处不同:

(1) 有些中止恳求是带子寄存器的。这些恳求先对子源中止恳求寄存器(SUBSRCPND)相应方位1,再经过子中止屏蔽寄存器(INTSUBMASK),然后才干进入到源中止寄存器(SRCPND)中,最终经过中止屏蔽寄存器(INTMASK),再进行形式(INTMOD)和优先级(PRIORITY)判别。在处理经过子中止寄存器的中止时,要记住铲除SUBSRCPND的相应位。

(2)从用户手册上看,S3C2440A是没有像S3C44B0X那样的中止操控寄存器的,不能挑选是运用向量中止仍对错向量中止。书中讲的IRQ向量形式寄存器应该是对应S3C2440A的中止优先级寄存器,S3C2440A的优先级轮转也比较好了解;至于中止恳求铲除寄存器,S3C2440A好像是没有对应的寄存器的。在这上面,S3C44B0X好像杂乱一些。

下面是来自S3C2440A用户手册的中止处理进程图:

2 PWM守时器

这方面S3C2440A与S3C44B0X没有太大的不同,书中讲的基本原理与守时器特性适用于S3C2440A。

3 看门狗守时器

除主时钟输入频率不同外,S3C2440A与S3C44B0X没有大的不同。

4 源代码

(1)PWM守时器处理代码

static int int_count;

static __irq void Timer0_Int(void)
{
Uart_Printf(“\nTimer 0 interrupt %d times”,++int_count);
rSRCPND = BIT_TIMER0;
rINTPND = BIT_TIMER0;
}

void Timer0_Start(void)
{
int i;

rTCFG0 = 0xFF;// 守时器0,1的预分频值为255
rTCFG1 = 0x2; // 守时器0的时钟分割器选用1/8分频
rTCNTB0 = 25600;
rTCON = 0x06;
for(i=0;i<1000;i++);
rTCON = 0x09;
pISR_TIMER0 = (unsigned int)Timer0_Int;
rINTMSK &= (~BIT_TIMER0);
}

(2)看门狗守时器处理代码

static int int_count;

#define SUB_BIT_WDT (0x01 << 13)

static __irq void Watchdog_Int(void)
{
Uart_Printf(“\nWatchdog interrupt %d times”,++int_count);
rSUBSRCPND = SUB_BIT_WDT;
rSRCPND = BIT_WDT_AC97;
rINTPND = BIT_WDT_AC97;
}

void Watchdog_Start(void)
{

rWTCNT = 16000;
rWTDAT = 16000;
pISR_WDT_AC97 = (unsigned int)Watchdog_Int;
rINTMSK &= (~BIT_WDT_AC97);
rINTSUBMSK &= (~SUB_BIT_WDT);
// 0xFF3C=不产生复位信号 0xFF3D=产生复位信号,约10秒后体系复位
rWTCON = 0xFF3C;
}

(3)阐明

主函数中碑文下列代码:

Timer0_Start();
Watchdog_Start();
while(1);

会看到串口约1秒输出一次守时器中止处理音讯,约10秒输出一次看门狗中止处理音讯。假如设置看门狗守时器操控寄存器的值为0xFF3D,则看门狗守时器超不时,会宣布复位信号,即大约每隔10秒,体系会复位一次。

主程序在运转死循环,但串口输出仍是能够进行的,这便是中止的功用了:中止程序的碑文,处理其他业务。曾经学微机原理的时分,讲中止仅仅笼统的概念,欠好了解,这儿就看得比较清楚了。

中止处理函数中,应该铲除相应的中止恳求位。关于看门狗中止,由所以经过子中止寄存器的,所以还要铲除子中止源恳求寄存器。假如不进行铲除动作,则中止恳求一向坚持,相当于不停地产生中止,无法返回到主程序中。

armcc扩展了C言语,供给__irq关键字用以界说中止处理函数。曾试着不运用__irq,但无论是用C言语仍是汇编言语编程,都无法正确完成中止处理,仍是对中止处理中应该进行的保存康复寄存器,以及返回到主程序的操作不了解,等今后了解了再试着不必这个关键字吧。

5 两个术语

PWM:Pulse Width Modulation,脉宽调制。

脉宽调制(PWM:(Pulse Width Modulation)是运用微处理器的数字输出来对模仿电路进行操控的一种十分有用的技能,广泛使用在从丈量、通信到功率操控与改换的许多领域中。

  简而言之,PWM是一种对模仿信号电平进行数字编码的办法。经过高分辨率计数器的运用,方波的占空比被调制用来对一个详细模仿信号的电平进行编码。PWM信号仍然是数字的,我们在给定的任何时刻,满幅值的直流供电要么彻底有(ON),要么彻底无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模仿负载上去的。通的时分便是直流供电被加到负载上的时分,断的时分便是供电被断开的时分。只需带宽满足,任何模仿值都能够运用PWM进行编码。

看门狗:Watchdog

在由单片机构成的微型计算机体系中,我们单片机的作业常常会受到来自外界电磁场的搅扰,形成程序的跑飞,而堕入死循环,程序的正常运转被打断,由单片机操控的体系无法持续作业,会形成整个体系的堕入阻滞状况,产生不行意料的结果,所以出于对单片机运转状况进行实时监测的考虑,便产生了一种专门用于监测单片机程序运转状况的芯片,俗称“看门狗”。

  看门狗电路电路的使用,使单片机能够在无人状况下完成接连作业,其作业原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚经进程序操控它守时地往看门狗的这个引脚上送入高电平(或低电平),这一程序查办是分散地放在单片机其他操控查办中心的,一旦单片机我们搅扰形成程序跑飞后而堕入某一程序段进入死循环状况时,写看门狗引脚的程序便不能被碑文,这个时分,看门狗电路就会我们得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机产生复位,即程序从程序存储器的开端方位开端碑文,这样便完成了单片机的主动复位。

  看门狗,又名 watchdog timer,是一个守时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常作业的时分,每隔一端时刻输出一个信号到喂狗端,给 WDT 清零,假如超越规则的时刻不喂狗,(一般在程序跑飞时),WDT 守时超越,就回给出一个复位信号到MCU,是MCU复位. 避免MCU死机. 看门狗的效果便是避免程序产生死循环,或许说程序跑飞。(

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/264277.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部