当前位置:首页 > > 充电吧
[导读]经过几天的努力,期间遇到很多的麻烦,终于搞定了S3C6410裸机中断,测试使用的是外部中断0组的PN0,定时器使用的是定时器0. 之前一直很郁闷的是网上的一些S3C6410使用的中断都是像51单片机那

经过几天的努力,期间遇到很多的麻烦,终于搞定了S3C6410裸机中断,测试使用的是外部中断0组的PN0,定时器使用的是定时器0.

 

之前一直很郁闷的是网上的一些S3C6410使用的中断都是像51单片机那样的固定中断向量入口,这种方式不仅需要汇编支持,而且效率相当的低下,既然S3C6410自带有中断处理协处理器VIC,那么我还是建议使用VIC来管理中断.

 

下面这段话摘自网上,不知道是谁写的,但是要谢谢他,让我搞清楚了如何使用裸机中断.

///////////////////////////////////////////////////////////////////////////////

为了向下兼容,6410保留了2410的软件中断跳转方式,在三星的文档里被称为SystemBUS模式,默认的,而其特有的VIC Port模式则要手动开启,启动代码:

 

mrc p15,0,r0,c1,c0,0

orrr0,r0,#(1<<24)

mcr p15,0,r0,c1,c0,0

 

将其加到启动文件的main函数入口点之前即可开始VICPort模式,在这个模式下,中断的使用简单了不少,比如说我要用某个按键来实现外部中断,则相应的过程如下:

 

初始化中断向量控制器:

 

      填充 rVICxINTENCLEAR ,清空VICxINTSELECT和VICxADDR,这步嘛没什么可说的,就是一个简单的重置工作。

 

配置按键对应的GPIO脚为中断模式:

 

     GPxxCON 每一个脚的配置占此寄存器的2位,其中中断配置为10b,将对应的两位位设为10b即可使用中断功能。

 

开启中断:

 

  将VICxINTENABLE对应位置一即可开启对应的中断,比如要开启11号中断,就将此寄存器第11位置一,注意此寄存器是32位的,x=0的时候开启0-31号中断,x=1时开启剩下的中断。

 

设置外部中断类型:

 

   操作EINxCONy,中断分组对应的寄存器可以在三星的手册里查到,每两个中断占用寄存器的三位,换句话说,寄存器每三位控制两个中断的触发方式,其中中断号小的偶数的两倍对应起始位,中断号大的奇数的两倍对应结束位,例如EINT11、10,对应寄存器的[22:20]三位,这三位怎么配手册上有详细描述,不废话。

 

装载中断伺服程序:

 

/////////////////////////////////////////////////////////////////////////

void led_init(void)

{

GPIOM->CON        =0x1111;

GPIOM->DAT        =0;

}

 

void Delay(u32 n)

{

u32i;

while(n--)

{

for(i= 0;i < 2000000;i ++);

}

}

 

void __irqIRQ_Exception(void)

{

EINT0PEND= 1;//写1清除中断标志

GPIOM->DAT^= BIT2;

ClearInterrupt(INT_EINT0);//中断结束

}

 

void Key_Init(void)

{

//PN0

GPION->CON= 2;//外部中断模式

EINT0CON0= 0x2;

EINT0PEND= 0xffffffff;

EINT0MASK&= ~(BIT0);//取消中断屏蔽

Set_IsrAddr(INT_EINT0,(u32)IRQ_Exception);        //设置中断矢量入口

Set_IntEnable(INT_EINT0,Enable);

}

 

 

void __irqIsr_Timer0(void)

{

TINT_CSTAT|= BIT5;//清除中断标志

GPIOM->DAT^= 1 << 3;

ClearInterrupt(INT_TIMER0);//中断结束

}

 

 

voidTIMER0_Init(void)

{

TCFG0=65;        //定时器0预分频65+1,由PCLK=66提供时钟,66分频产生1MHz的定时器时钟

TCON= BIT3;//定时器0自动更新使能

TCNTB0 = 200000;//重装值,200ms

TINT_CSTAT|= BIT5;//清除中断标志

TINT_CSTAT= 1;//使能定时器0中断

Set_IsrAddr(INT_TIMER0,(u32)Isr_Timer0);        //设置中断矢量入口

Set_IntEnable(INT_TIMER0,Enable);//使能定时器0全局中断

//以下操作启动定时器0

TCON|= BIT1;//手动更新

TCON&= ~BIT1;//结束手动更新

TCON|= BIT0;//启动定时器0

 

}

 

 

 

//主函数

void main(void)

{

u8i;

 

led_init();

Key_Init();

TIMER0_Init();

while(1)

{

for(i= 0;i < 2;i ++)

{

GPIOM->DAT^= 1 << i;

Delay(10);

}

}

}


//把下面的汇编加入到启动文件中,主要用来打开CPU中断和初始化VIC

;VIC Port模式,开启后就可以不用汇编使用中断,使用VIC控制中断
mrc p15,0,r0,c1,c0,0
orr r0,r0,#(1<<24)
mcr p15,0,r0,c1,c0,0

;允许中断,开启CPU总中断
MRS R0, CPSR         ;将CPSR保存至R0寄存器中
BIC R0, R0, #0x80    ;R0 = R0 & ~0x80,清除中断位
MSR CPSR_c, R0       ;将R0写回CPSR状态寄存

 

 

以上就是相关的代码,因为大家的寄存器宏定义不同,因此名字可能不同,因为我写了注释的,大家可以对着文档,设置相应的寄存器就可以了,如果需要可以找我,邮箱:cp1300@139.com

 

由于我也是刚学裸机操作,希望大家多多指导.

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

如果读者朋友已经有过汇编相关基础,能够够好理解本文内容。汇编语言是比C语言更接近机器底层的编程语言,能让我们更好的理解和操纵硬件底层。

关键字: 汇编 C语言

从汇编角度来说,如果“test %al, %al”能改成“test %0x1, %al”就没有匪夷所思的问题了,如此一来应该会降低CPU的效率,毕竟执行指令还需要一个立即数,我没搞过编译器也没设计过CPU,纯属瞎猜,能搞...

关键字: 汇编 CPU 编译器

【说在前面的话】其实我很久之前就想写这篇文章了,但彼时总觉得这是一个伪命题:既然已经用了MDK,编译出来的代码,无论是体积还是性能都甩下armgcc好几条街,谁还会想用gcc来进行Cortex-M开发呢?对那些只能使用a...

关键字: GCC MDK 汇编

1.背景群里有个小伙伴学习设计加密方法,如同某商用软件输入注册码后就能使用扩展功能。设计时他很自然的想着所写的加密措施是否足够健壮安全,是否有什么方法可以绕过加密检查,也就是破解。权限管理仅在启动后检查一次注册码是否有效...

关键字: 指令 汇编 软件

最近很多伙计问我现在搞嵌入式还有没有必要学习汇编?

关键字: 嵌入式 汇编

针对传统类人机器人在控制系统实时性和视觉识别方面的不足,以S3C6410作为主控芯片,设计了具有视觉识别功能的类人机器人控制系统,通过改进和简化视频识别算法取得了良好的目标识别效果。实验表明,基

关键字: s3c6410 机器人 机器视觉

来源 :智能软件研究中心,作者:罗宇哲,直接来源:华为开发者社区 声明:本公众号转发仅为传播相关技术知识,不作任何商业用途,如有疑义请联系删除。 01 ARM汇编指令 操作系统中硬件相关的部分集中体现在汇编指令和对寄存器...

关键字: ARM 汇编

Part 1. 机器指令 上一次 我们已经了解了 二进制和 CPU 的基本原理,知道了程序运行时,CPU 每秒数以亿次、十亿次、百亿次地震荡着时钟,同步执行着微小的 「电子操作」,例如:从内存读取一个字节的数据到 CPU...

关键字: 高级编程 编程语言 汇编

来源 :智能软件研究中心,作者:罗宇哲,直接来源:华为开发者社区 声明:本公众号转发仅为传播相关技术知识,不作任何商业用途,如有疑义请联系删除。 01 ARM汇编指令 操作系统中硬件相关的部分集中体现在汇编指令和对寄存器...

关键字: ARM 汇编

北京时间4月30日早间消息,据外媒报道,Facebook首席执行官扎克伯格周三警告称,过早重新开放公共空间“几乎可以肯定”将会导致新冠病毒的继续爆发,并带来不良的经济后果。 扎克伯格在公司第一季度财报

关键字: 扎克伯格 FACEBOOK LTE 汇编
关闭