简单外中断实验(最近又要搞arm相关的东西,复习一下中断)

发布者:EtherealLight最新更新时间:2022-10-17 来源: csdn关键字:norflash  arm  中断 手机看文章 扫描二维码
随时随地手机看文章

程序烧写在norflash上面


Makefile


mem_controler.bin : start.s function.c

arm-linux-gcc -g -c -o start.o start.s

arm-linux-gcc -g -c -o function.o function.c

arm-linux-ld -Ttext 0x30000000 -g start.o function.o -o interrupt.elf

arm-linux-objcopy -O binary -S interrupt.elf interrupt.bin

arm-linux-objdump -D -m arm interrupt.elf > interrupt.dis

clean : 

rm -f *.o *.bin *.dis



start.s


.text

.global _start

_start:

b reset

b .

b .

b .

b .

b .

b handle_irq

b .

 

reset:

@shut down the watchdog

ldr r0, =0x53000000

ldr r1, =0x00000000

str r1, [r0]

 

@init the stack address

ldr r1, =4096

ldr r0, =0x40000000

add sp, r1, r0

 

bl init_led

bl init_sdram

 

@reset the stack pointer

ldr sp, =0x34000000 @change stack to the end of sdram

msr cpsr_c, #0xd2

ldr sp, =0x33F00000 @change the stack pointer of irq mode

msr cpsr_c, #0xd3 @change cpu back to svc mode

 

 

bl copy_code2sdram @copy 8KB data from norflash to sdram

ldr pc, =on_sdram

on_sdram:

bl init_interrupt

msr cpsr_c, #0x53 @clear the irq disable bit in cpsr

 

bl main

halt_loop:

b halt_loop

 

 

handle_irq:

sub lr, lr, #4 @set the address(int main function) to return when handle_irq ends

stmdb sp!, {r0-r12, lr} @save the universal registers and lr_irq to the stack of irq mode

bl handle_irq_func @branch to the irq handleing function achieved in function.c 

ldmia sp!, {r0-r12, pc}^ @resume the universal registers and save lr to pc while copying spsr to cpsr



function.c

//gpb registers

#define GPBCON (*((volatile unsigned long *)0x56000010))

#define GPBDAT (*((volatile unsigned long *)0x56000014))

 

//mem controler registers

#define BWSCON (*((volatile unsigned long *)0x48000000))

#define BANKCON0 (*((volatile unsigned long *)0x48000004))

#define BANKCON1 (*((volatile unsigned long *)0x48000008))

#define BANKCON2 (*((volatile unsigned long *)0x4800000C))

#define BANKCON3 (*((volatile unsigned long *)0x48000010))

#define BANKCON4 (*((volatile unsigned long *)0x48000014))

#define BANKCON5 (*((volatile unsigned long *)0x48000018))

#define BANKCON6 (*((volatile unsigned long *)0x4800001C))

#define BANKCON7 (*((volatile unsigned long *)0x48000020))

#define REFRESH (*((volatile unsigned long *)0x48000024))

#define BANKSIZE (*((volatile unsigned long *)0x48000028))

#define MRSRB6 (*((volatile unsigned long *)0x4800002C))

#define MRSRB7 (*((volatile unsigned long *)0x48000030))

 

//gpg registers

#define GPGCON (*((volatile unsigned long *)0x56000060))

 

//interrupt related registers

#define EINTMASK (*((volatile unsigned long *)0x560000A4))

#define INTMSK (*((volatile unsigned long *)0x4A000008))

#define INTMOD (*((volatile unsigned long *)0x4A000004))

#define INTOFFSET (*((volatile unsigned long *)0x4A000014))

#define SRCPND (*((volatile unsigned long *)0x4A000000))

#define INTPND (*((volatile unsigned long *)0x4A000010))

#define EINTPEND (*((volatile unsigned long *)0x560000A8))

#define EXTINT1 (*((volatile unsigned long*)(0x5600008c)))

#define EXTINT2 (*((volatile unsigned long*)(0x56000090)))

 

 

 

 

void init_sdram(){

BWSCON = 0x22011110;

BANKCON0 = 0x00000700;

BANKCON1 = 0x00000700;

BANKCON2 = 0x00000700;

BANKCON3 = 0x00000700;

BANKCON4 = 0x00000700;

BANKCON5 = 0x00000700;

BANKCON6 = 0x00018005;

BANKCON7 = 0x00018005;

REFRESH = 0x008C07A3;

BANKSIZE = 0x000000B1;

MRSRB6 = 0x00000030;

MRSRB7 = 0x00000030;

}

 

 

void init_interrupt(){

//set the gpio pins of the six keys to interrupt mode 

GPGCON = (1<<(0*2+1) | 1<<(3*2+1) | 1<<(5*2+1) | 1<<(6*2+1) | 1<<(7*2+1) | 1<<(11*2+1));

 

//set EINTMASK register to enable external interrupt

EINTMASK &= (~(1<<8 | 1<<11 | 1<<13 | 1<<14 | 1<<15 | 1<<19));

 

//set INTMSK register to inable eint8_23

INTMSK &= (~(1<<5));

 

//set INTMOD register to set int8_23 to irq mode

INTMOD &= (~(1<<5));

}

 

 

void blink(void);

void handle_key(){

int eint_v;

 

eint_v = EINTPEND;

 

if(eint_v & (1<<8)){

display_led(1);

EINTPEND = 1<<8;

return;

}

 

if(eint_v & (1<<11)){

display_led(2);

EINTPEND = 1<<11;

return;

}

 

if(eint_v & (1<<13)){

display_led(3);

EINTPEND = 1<<13;

return;

}

 

if(eint_v & (1<<14)){

display_led(4);

EINTPEND = 1<<14;

return;

}

 

if(eint_v & (1<<15)){

display_led(5);

EINTPEND = 1<<15;

return;

}

 

if(eint_v & (1<<19)){

display_led(6);

EINTPEND = 1<<19;

return;

}

}

 

 

void handle_irq_func(){

int offset_v;

offset_v = INTOFFSET;

 

switch(offset_v){

case 5:

handle_key();

break;

default:

break;

}

 

//clear the interrupt

SRCPND = 1< INTPND = 1<}

 

void delay(int n){

int i, j;

for(i=0; i for(j=0; j<1000; j++){}

}

}

 

void blink(){

GPBDAT = 0xffffffff;

GPBDAT = 0x00000000;

delay(10);

GPBDAT = 0xffffffff;

delay(10);

}

 

void display_led1(){

GPBDAT = ~(1<<5);

delay(1);

}

 

void display_led2(){

GPBDAT = ~(3<<5);

delay(1);

}

 

void display_led3(){

GPBDAT = ~(7<<5);

delay(1);

}

 

void display_led4(){

GPBDAT = ~(15<<5);

delay(1);

}

 

void display_led(int n){

GPBDAT = ~(n<<5);

}

 

 

void copy_code2sdram(){

int size, i;

unsigned char *src, *des;

size = 8*1024;

 

des = (unsigned char*)(0x30000000);

src = (unsigned char *)(0x00000000);

for(i=0; i *(des++) = *(src++);

}

}

 

void init_led(){

GPBCON = 0x00015400;

GPBDAT &= ~(0x0f<<5);

}

 

/*

int main(void){

int i;

GPBCON = 0x00015400;

i = 0;

while(1){

GPBDAT = ~(1<<(i+5));

delay(1);

i = (i+1)%4;

}

return 0;

}

*/

 

int main(void){

while(1){

//wait for external interrupt

}

return 0;

}

关键字:norflash  arm  中断 引用地址:简单外中断实验(最近又要搞arm相关的东西,复习一下中断)

上一篇:mini2440 简单的dma工作原理实验
下一篇:mini2440串口轮询实验

推荐阅读最新更新时间:2024-11-11 15:02

ARM与FPGA区别
在嵌入式开发领域,arm是一款非常受欢迎的微处理器,其市场覆盖率极高,DSP和FPGA则是作为嵌入式开发的协处理器,协助微处理器更好的实现产品功能。那三者的技术特点以及区别是什么呢?下文就此问题略做了总结。 arm(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。 ARM架构是面向低预算市场设计的第一款RISC微处理器,基本是32位单片机的行业标准,它提供一系列内核、体系扩展、微处理器和系统芯片方案,四个功能模块可供生产厂商根据不同用户的要求来配置生产。由于所有产品均采用一个通用的软件体系,所以相同的软件可在所有
[单片机]
ARM+LINUX嵌入式系统的终端显示中文乱码解决
前一段时间解决的一个问题,看起来是个小问题,实际解决这个问题却花了一个星期的晚上休息时间,记录分享一下。 问题描述: linux内核配置中NLS(native language support)已经选择了默认语言配置为utf8,并包含一些其他常用语言的编码,但是在secureCRT的telnet和串口终端显示中文文件名均为乱码。 解决过程: 1.刚开始以为是简单的编码不匹配的问题,修改secureCRT中的传输编码方式从默认变为utf8,中文不再乱码,但变成了问号,“??????”; 2.因为中文目录是在挂载的SD卡中的(居然没有尝试一下网络挂载或者其他的方式下中文是否乱码,汗),怀疑是挂载SD卡方式不对。网上解答全部
[单片机]
ARM的SWI异常中断处理程序设计
本节主要介绍编写SWI处理程序时需要注意的几个问题,包括判断SWI中断号,使用汇编语言编写SWI异常处理函数,使用C语言编写SWI异常处理函数,在特权模式下使用SWI异常中断处理,从应用程序中调用SWI。 1.判断SWI中断号 当发生SWI异常,进入异常处理程序时,异常处理程序必须提取SWI中断号,从而得到用户请求的特定SWI功能。 在SWI指令的编码格式中,后24位称为指令的 comment field 。该域保存的24位数,即为SWI指令的中断号,如图7-4所示。 第一级的SWI处理函数通过LR寄存器内容得到SWI指令地址,并从存储器中得到SWI指令编码。通常这些工作通过汇编语言、内嵌汇编来完成。下面的例子显示了
[单片机]
<font color='red'>ARM</font>的SWI异常<font color='red'>中断</font>处理程序设计
ARM系列之分散加载描述符(scatte)文件的应用
在上一篇中,提到了分散加载描述符的应用场景。一般对于简单的代码分布,不需要使用这样的文件,直接借助于编译器中的simple选项,配置入口地址,RW和RO地址就可以运行了。如下图所示: 但是对于一些复杂的场景,就需要分散家在描述符文件,比如: 1 . 定位目标外设   使用分散加载,可以将用户定义的结构体或代码定位到指定物理地址上的外设,这种外设可以是定时器、实时时钟、静态SRAM或者是两个处理器间用于数据和指令通信的双端口存储器等。在程序中不必直接访问相应外设,只需访问相应的内存变量即可实现对指定外设的操作,因为相应的内存变量定位在指定的外设上。这样,对外设的访问看不到相应的指针操作,对结构体成员的访问即
[单片机]
<font color='red'>ARM</font>系列之分散加载描述符(scatte)文件的应用
ARM架构入门
Arm架构构成了每个Arm处理器的基础。 ARM架构基于RISC(精简指令集计算机)原则,同时也包含: 统一的寄存器文件加载/存储(load/store)结构,其中数据处理仅对寄存器内容进行操作,而不直接对存储器内容进行操作。 简单寻址模式,所有的加载/存储地址只能由寄存器内容和指令字段确定。 基于增强的RISC 架构,使ARM处理器能够在高性能,小代码尺寸,低功耗和小硅片面积之间有着良好的平衡。 Arm架构随着时间的推移而不断进化,在整个进化历史中引入了几个扩展的架构,包括: 安全扩展(TrustZone技术) 先进的SIMD(NEON技术) 虚拟化扩展,在Armv7-A中引入 加密扩展,在Armv8-A中引入
[单片机]
STM8S_009_ EXTI外部中断
有人问 我使用EXIT唤醒芯片,没什么没有触发中断,芯片却唤醒了? Ⅰ写在前面 使用STM8S开发过上面类似功能的朋友应该会知道,STM8S的稳定性不如STM32,特别是在低功耗时,使用EXTI外部中断唤醒,很容易受到干扰信号而唤醒。因此,这种情况需在硬件电路上多加考虑抗干扰的电路。 其次,就是注意软件的上下拉配置,如果外部加了上拉或下拉电阻,不建议再配置成上拉或下拉;如果没有,建议加上。要使其软件稳定,还得深入EXTI的功能。 ⅡEXTI基础知识 STM8S的EXTI外部中断归属于GPIO一类,只需要将其IO配置成外部中断、使能全局中断、在中断入口函数添加相关的代码即可。 开启中断功能 在EXTI_CR 寄存
[单片机]
ARM入门最好的文章
开始学ARM一团雾水,不知道如何入手.这个介绍的比较全面.本人认为aRM入门最好的文章抓住51开发ARM  这几个月来我一直都爬在51的问题,自己都有一点笑自己了,用了4个月的时间,来巩固51的原理和程序, 还好我自己算是走过来了,自己笨,身边的高才生又看不上51的原理,他们都比较 牛 ,说51过时了,你问那个做什么???我比较郁闷!过时吗?我有一点怀疑?   他们不愿意说有他们自己的理由,没有人强求,靠自己好了。   我自己个人的观点:51是一个基础,而且还很重要,这是再我看了ARM之后感觉到的。它可以加速你的ARM学习速度,真得!不相信你试一试好了。   凡是要求一个速度、效率,不要做一些无用功,抓紧身边的每一个
[单片机]
ARM嵌入式开发板汽车节能控制系统
引言   由于各种原因,公交车总是不断重复加速—减速或停车—再加速的过程。通过加装本节能装置,当汽车需要制动时,在主控单元的控制下,可将汽车行驶时具有的巨大动能通过空气压缩机转化成高压气体的势能并储存起来,从而实现汽车减速或停车。当汽车需要启动或加速时,用储存起来的高压气体势能代替燃油来驱动汽车,从而实现汽车能量的回收再利用,达到节能的效果。同时由于汽车在起动或加速时能耗最大,如果汽车是用燃油驱动,则此时油料燃烧不充分,燃烧效果最差,而且产生的噪音最大。    系统工作原理   本系统主要由三部分组成,即检测部分,控制部分和执行机构。检测部分包括踏板位置传感器、曲轴位置传感器、压缩机活塞位置传感器、汽车运行速度传感器、储气罐
[模拟电子]
<font color='red'>ARM</font>嵌入式开发板汽车节能控制系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved