ARM处理器和51单片机的区别

ARM处理器和51单片机的区别,第1张

51单片机是比较古老的但是很实用的单片机,他的CPU是8位的,也就是说他的指令是8位的。单片机的处理速度也不快,多数指令是多周期指令,适用于简单的嵌入式应用。

ARM处理器是近些年出现的32位的处理器。他的CPU是32位的,也就是说他的指令是32位的。可以支持复杂的 *** 作系统的运行,并且有着较高的运行速度。例如目前很多手机都是采用ARM处理器,CPU的主频高达1GHz,而51单片机只有33MHz。

特定的板子我不太了解,抽象的说一说吧,相信可以帮到你。一般而言定时器硬件的作用是为了避免忙等待loop类的delay(就是一个循环利用cpu执行指令需要时间来达到逻辑上的延时),使用同步运作的硬件(定时器硬件计时,超时后通过中断通知cpu),辅以中断来达到延时效果,这种延时是异步的(必须将原本的逻辑以delay作为一个断面,将断面以后放到超时函数处理),如果像你代码这种不存在 *** 作系统,无多任务的情况下,其实配置了中断并使用中断处理的异步方式,主程序还得忙循环等待(loop1: b loop1)

说下你的程序程序为何没用。不是频率问题,我们看下你的程序,进入loop循环前,灭灯,然后调用delay,接着进入循环,循环体中的代码始终在开灯,这里存在两个问题:

1、delay函数实际不管用。这点后续再说

2、循环中的代码始终再开灯,而不是根据当前灯的状态开灯或灭灯

说下delay

1、刚刚提到过,不用定时器,可以忙循环等待,for (i = K; i > 0; --i);,这个循环delay的时间大体上等于K乘以一个循环所使用的时间(算算几条指令,乘以arm时钟周期)

2、使用定时器的话,中断方式,之前也提到了,你必须将loop函数分解,每次根据当前状态执行一个开/灭灯动作,然后将这个函数挂接在超时中断处理函数能运行到的流程上,主程序在配置完超时寄存器和中断服务后,忙循环等待loop1: b loop1

3、使用定时器,但不用中断方式,则逻辑上,delay函数包含两个过程:a、配置定时器,开定时器(这是你目前delay函数所做的),b、循环读取CNT寄存器,直到计数为0(也许定时器会自动复位,这时要留有余地,比如判断小于20类似的)。也即,你需要循环的判断是不是已经“运行了需要的时间”了这一点。虽说这样体现不出定时器的好处了,但从用法考虑,就是这么做的

声明这里改一下void __irq timer0_ISR (void);

这里也对应改一下

void __irq timer0_ISR (void) {

timer0Times++;

if(timer0Times == 10){

i=IO0SET; //读出当前LED2控制值

if((i&LED)==0){

IO0SET=LED;

}else{

IO0CLR=LED;

}

timer0Times = 0;

}

T0IR = 1;

VICVectAddr = 0;

}

定时器中断是设定定时时间,到了该时间,就进行处理一次。

可以处理按键扫描,动态显示,时钟累加等。

外部中断,是与外接接触,当中断引脚为低电平时,进入中断。

如果单片机没有专门的键盘中断,可以使用外部中断来做键盘中断。

/

File: Mainc

功能: 使用定时器0实现1s定时,并打开IRQ中断,控制LED闪烁

同时使用定时器1实现比较匹配输出

/

#include "configh"

#define LEDCON 0x00002000 /P013引脚控制LED,低电平点亮/

/

名称: main()

功能: 控制LED闪烁

/

int main(void)

{ PINSEL0=0x02000000; //设置MAT10连接到P012

PINSEL1=0x00000000;

IODIR=LEDCON; //设置LED控制口为输出

TargetInit(); //定时器0初始化(Targetc文件)

while(1); //等待定时器0中断或定时器1匹配输出

return(0);

}

以上是主函数

接下来是targetc这个文件中的初始化函数(targetc是模板中的一个文件)

void TargetInit(void)

{

/初始化定时器0,实现05s定时;定时器1实现01s定时

Fclk=Fosc4=110592MHz4=MHz

Fpclk=Fcclk/4=MHz/4=110592MHz

/

T0PR=99; //设置定时器分频为100分频,得147450Hz

T0MCR=0x03; //匹配通道0匹配中断并复位T0TC

T0MR0=110592/2; //比较值

T0TCR=0x03; //启动并复位T0TC

T0TCR=0x01;

T1PR=99; //设置定时器分频为100分频,得147450Hz

T1MCR=0x02; //匹配通道0匹配中断并复位T1TC

T1MR0=110592/10; //比较值

T1EMR=0x30; //设置定时器1的T1MR0匹配输出,输出方式为翻转

T1TCR=0x03; //启动并复位T1TC

T1TCR=0x01;

/设置定时器0中断IRQ/

VICIntSelect=0x00; //所有中断通道设置为IRQ中断

VICVectCntl0=0x24; //定时器0中断通道分配最高优先级(向量控制器0)

VICVectAddr0=(uint32)IRQ_Exception; //设置中断服务程序地址向量

VICIntEnable=0x00000010; //使能定时器0中断

}

对于这个,要这么看:

假设中断A是优先级高的中断,中断B是优先级低的中断

如果在正常执行的过程中,发生中断A,那么,中断A执行完成后,会返回正常程序;

如果在正常执行过程中,发生中断B,又在中断B处理过程中发生中断A,那么,中断A执行完成后,一定要返回的是中断B,这是由硬件决定的,不是软件决定的,所以,软件没有任何指令可以让中断A执行完成后直接跳过还没有执行完的中断B而直接回到主程序,因为这是硬件决定的,软件做不到,即便你在高级中断A中关闭了中断B,但是因为你原来的中断B还没有执行完,所以,仍然要把没执行完的部分执行下去,才能返回到正常程序

对于ARM系列的可以,对于51来说,是不行的,因为51软件指令不允许修改PC寄存器的值

在arm嵌入式中,用定时器设置延迟函数的程序实现方法如下:

#include<reg51h>晶振110592STC89C51

sbit RELAY = P1^4;  //定义继电器使用的IO口

sbit K1    = P0^0;  //定义按键使用的IO口

void main()

{

while(1)//大循环

{

if(K1 == 0)    //如果按键按下

{   a=2000;/这里/时间怎样设定一个小时

RELAY = 0; //继电器闭合

while(a--);

a=2000;这里/时间怎样设定一个小时

RELAY = 1;

while(a--);

}

else

{

RELAY = 1;

}

}

}    

利用定时器延时的优缺点:

1、因为定时器累加与CPU无关,即使中断,仍然会保持计数。不受上述问题影响。

2、缺点需要占用定时器资源。

3、功耗也会高一些。

arm嵌入式简介:

ARM是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。

以上就是关于ARM处理器和51单片机的区别全部的内容,包括:ARM处理器和51单片机的区别、有熟悉ARM9 s3c2440A 的大虾来我为指点下,是定时器的汇编,我是新手,求教!、为什么我的arm7定时器0进不了中断等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9294631.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存