JZ2440 中断学习
来源:互联网 发布:淘宝一元包邮的店 编辑:程序博客网 时间:2024/05/21 06:48
目的:通过外部按键实现点灯
1. head.s
@******************************************************************************@ File:head.S@ 功能:初始化,设置中断模式、管理模式的栈,设置好中断处理函数@****************************************************************************** .extern main.text .global _start _start:@****************************************************************************** @ 异常向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用@****************************************************************************** b Reset@ 0x04: 未定义指令中止模式的向量地址HandleUndef: b HandleUndef @ 0x08: 管理模式的向量地址,通过SWI指令进入此模式HandleSWI: b HandleSWI@ 0x0c: 指令预取终止导致的异常的向量地址HandlePrefetchAbort: b HandlePrefetchAbort@ 0x10: 数据访问终止导致的异常的向量地址HandleDataAbort: b HandleDataAbort@ 0x14: 保留HandleNotUsed: b HandleNotUsed@ 0x18: 中断模式的向量地址 b HandleIRQ@ 0x1c: 快中断模式的向量地址HandleFIQ: b HandleFIQReset: ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈 bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启 msr cpsr_c, #0xd2 @ 进入中断模式 1101 0010 禁止IRQ FIQ ARM IRQ模式 ldr sp, =3072 @ 设置中断模式栈指针 片内SRAM,设置栈指针 msr cpsr_c, #0xd3 @ 进入管理模式 1101 0011 禁止IRQ FIQ ARM SVC模式 ldr sp, =4096 @ 设置管理模式栈指针, @ 其实复位之后,CPU就处于管理模式, @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略 bl init_led @ 初始化LED的GPIO管脚 bl init_irq @ 调用中断初始化函数,在init.c中 msr cpsr_c, #0x53 @ 设置I-bit=0,开IRQ中断 0101 0011 使能IRQ 失能FIQ ARM SVC模式 ldr lr, =halt_loop @ 设置返回地址 ldr pc, =main @ 调用main函数halt_loop: b halt_loopHandleIRQ: sub lr, lr, #4 @ 计算返回地址 stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器 @ 注意,此时的sp是中断模式的sp @ 初始值是上面设置的3072 ldr lr, =int_return @ 设置调用ISR即EINT_Handle函数后的返回地址 ldr pc, =EINT_Handle @ 调用中断服务函数,在interrupt.c中int_return: ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr
#include "s3c24xx.h"void EINT_Handle(){ unsigned long oft = INTOFFSET; unsigned long val; switch( oft ) { // S2被按下 case 0: { GPFDAT |= (0x7<<4); // 所有LED熄灭 GPFDAT &= ~(1<<4); // LED1点亮 break; } // S3被按下 case 2: { GPFDAT |= (0x7<<4); // 所有LED熄灭 GPFDAT &= ~(1<<5); // LED2点亮 break; } // K4被按下 case 5: { GPFDAT |= (0x7<<4); // 所有LED熄灭 GPFDAT &= ~(1<<6); // LED4点亮 break; } default: break; } //清中断 if( oft == 5 ) EINTPEND = (1<<11); // EINT8_23合用IRQ5 SRCPND = 1<<oft; INTPND = 1<<oft;}
3.init.c
/* * init.c: 进行一些初始化 */ #include "s3c24xx.h"/* * LED1,LED2,LED4对应GPF4、GPF5、GPF6 */#defineGPF4_out(1<<(4*2))#defineGPF5_out(1<<(5*2))#defineGPF6_out(1<<(6*2))#defineGPF4_msk(3<<(4*2))#defineGPF5_msk(3<<(5*2))#defineGPF6_msk(3<<(6*2))/* * S2,S3,S4对应GPF0、GPF2、GPG3 */#define GPF0_eint (0x2<<(0*2))#define GPF2_eint (0x2<<(2*2))#define GPG3_eint (0x2<<(3*2))#define GPF0_msk (3<<(0*2))#define GPF2_msk (3<<(2*2))#define GPG3_msk (3<<(3*2))/* * 关闭WATCHDOG,否则CPU会不断重启 */void disable_watch_dog(void){ WTCON = 0; // 关闭WATCHDOG很简单,往这个寄存器写0即可}void init_led(void){ // LED1,LED2,LED4对应的3根引脚设为输出 GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk); GPFCON |= GPF4_out | GPF5_out | GPF6_out;}/* * 初始化GPIO引脚为外部中断 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD) */ void init_irq( ){ // S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2 GPFCON &= ~(GPF0_msk | GPF2_msk); GPFCON |= GPF0_eint | GPF2_eint; // S4对应的引脚设为中断引脚EINT11 GPGCON &= ~GPG3_msk; GPGCON |= GPG3_eint; // 对于EINT11,需要在EINTMASK寄存器中使能它 EINTMASK &= ~(1<<11); /* * 设定优先级: * ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2 * 仲裁器1、6无需设置 * 最终: * EINT0 > EINT2 > EINT11即K2 > K3 > K4 */ PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ; // EINT0、EINT2、EINT8_23使能 INTMSK &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));}
int main(){ while(1); return 0;}
5.Makefile
objs := head.o init.o interrupt.o main.oint.bin: $(objs)arm-linux-ld -Ttext 0x00000000 -o int_elf $^arm-linux-objcopy -O binary -S int_elf $@ #-S表示不从源文件中复制重定位信息和符号信息到目标文件arm-linux-objdump -D -m arm int_elf > int.dis%.o:%.carm-linux-gcc -Wall -O2 -c -o $@ $<%.o:%.Sarm-linux-gcc -Wall -O2 -c -o $@ $<clean:rm -f int.bin int_elf int.dis *.o
阅读全文
0 0
- JZ2440 中断学习
- jz2440 中断体系结构
- JZ2440 中断分析
- JZ2440 中断分析
- JZ2440的中断控制器
- jz2440的中断处理流程
- JZ2440学习笔记
- JZ2440 LCD学习笔记
- JZ2440 MMU学习
- JZ2440 NAND FLASH学习
- JZ2440存储管理器学习
- JZ2440 UART 学习
- jz2440裸板开发之:外部中断
- jz2440 的中断中的底半部机制
- jz2440平台中断测试及分析
- JZ2440 第9章 中断体系结构
- JZ2440学习笔记,第一部分,移植uboot2015支持JZ2440串口
- cheng@Linux--JZ2440学习之jlink、dnw
- Unity射线检测的方向是 世界坐标系还是自身坐标系
- HDU1074:Doing Homework(状态压缩DP)
- Java NIO 基础
- 剑指offer面试题[34]丑数
- redux 在 React-Native 工作中的使用
- JZ2440 中断学习
- 删除字符串中出现次数最少的字符
- 笔记2
- 完全覆盖1-OJ
- c++ demo: 单词转换
- 《数据压缩》实验报告六·MPEG-1 Audio编码器
- linux内核分析——CFS(完全公平调度算法)
- 你以为的效率,可能只是焦虑
- 从编译过程看java的泛型