按键中断
void ExtIntConfigure(void){
rGPNCON |=0xaaa; //配置GPM0~GPM4为外部中断输入模式(不能省...)
rEINT0CON0 &=(~((7<<8)|(7<<4)|(7<<0)));//将外部中断组0配置为低电平触发(下降沿触发?
rEINT0CON0 |=((2<<8)|(2<<4)|(2<<0));
rEINT0FLTCON0 =0x0000000;
//将外部中断组0硬件滤波使能为电平滤波方式
rEINT0MASK|=0x3f; //禁止中断--外部中断0屏蔽寄存器
rEINT0PEND=0xffffffff; //清除中断挂起寄存器
return;
}这段代码中的rEINT0FLTCON0 |=((1<<23)|(0<<22)|(1<<15)|(0<<14)|(1<<7)|(0<<6));有啥用啊?不用可以吗
?谢谢。 看芯片手册来讲,是设置外部中断滤波。
其中。1 = digital filter(clock count),看来是用了数字滤波。
外部中断很容易有毛刺,一般都要有滤波吧。尤其是按键。 本帖最后由 潇毅 于 2011-8-18 16:54 编辑
回复 2# 飞凌-fatfish
谢谢,还有一个问题。就是下面关于CPSR状态寄存器的初始化。;/*************************************************************************************
; File Name : retarget_.s
;
; File Description : This file implements the stack & heap initilaization
;*************************************************************************************/
GET ..\inc\option.inc
AREA |C$$code|, CODE, READONLY
Mode_USR EQU 0x10 ;用户模式
Mode_FIQ EQU 0x11 ;快速中断模式
Mode_IRQ EQU 0x12 ;中断请求模式
Mode_SVC EQU 0x13 ;管理模式
Mode_ABT EQU 0x17 ;异常中断模式
Mode_UND EQU 0x1b ;未定义模式
Mode_SYS EQU 0x1f ;系统模式
I_Bit EQU 0x80 ;禁止IRQ中断
F_Bit EQU 0x40 ;禁止FRQ中断
;定义中断堆栈空间大小
Size_FIQ_Stack EQU 256
Size_IRQ_Stack EQU 256
Size_ABT_Stack EQU 256
Size_UND_Stack EQU 256
Size_SVC_Stack EQU 8192
;定义堆栈偏移量
Offset_FIQ_Stack EQU 0
Offset_IRQ_Stack EQU Offset_FIQ_Stack + Size_FIQ_Stack
Offset_ABT_Stack EQU Offset_IRQ_Stack + Size_IRQ_Stack
Offset_UND_Stack EQU Offset_ABT_Stack + Size_ABT_Stack
Offset_SVC_Stack EQU Offset_UND_Stack + Size_UND_Stack
EXPORT __user_initial_stackheap
__user_initial_stackheap ;初始化堆栈
ldr r0,=top_of_stacks ;将栈顶的地址赋给r0
msr CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_FIQ_Stack
msr CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_IRQ_Stack
msr CPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_ABT_Stack
msr CPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_UND_Stack
msr CPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_SVC_Stack
;IMPORT|Image$$ZI$$Limit| ;表示ZI的结束地址
;LDR r0, =|Image$$ZI$$Limit|
ldr r0, =base_of_heap
mov r2,#0
mov r3,#0
mov pc,lr ;R14的值复制到PC,子程序返回
;-------------------------------------------------------
[ (VIC_MODE = 0) ;VIC_MODE预定义为1,跳过该段程序
IMPORT IntHandlerTable
EXPORT IsrIRQ
IsrIRQ
sub sp,sp,#4 ; reserved for PC
stmfd sp!,{r8-r9}
ldr r9,=0x71200f00 ; rVIC0ADDR
ldr r9,
ldr r8,=IntHandlerTable
add r8,r8,r9,lsl #2 ;r8=r8+r9*4
ldr r8,
str r8,
ldmfd sp!,{r8-r9,pc}
]
LTORG ;数据缓冲池伪指令
END我有个地方搞不懂,就是__user_initial_stackheap 这个汇编函数__user_initial_stackheap ;初始化堆栈
ldr r0,=top_of_stacks ;将栈顶的地址赋给r0
msr CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_FIQ_Stack
msr CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_IRQ_Stack
msr CPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_ABT_Stack
msr CPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_UND_Stack
msr CPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_SVC_Stack
;IMPORT|Image$$ZI$$Limit| ;表示ZI的结束地址
;LDR r0, =|Image$$ZI$$Limit|
ldr r0, =base_of_heap
mov r2,#0
mov r3,#0
mov pc,lr ;R14的值复制到PC,子程序返回
比如说: ldr r0,=top_of_stacks ;将栈顶的地址赋给r0
msr CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
sub sp,r0,#Offset_FIQ_Stack
执行这句话后状态寄存器CPSR的C标志位会有何种变化? 这次我还是帮顶吧。需要回复的帖子还很多。
欢迎其他做裸机开发的朋友一起参与讨论。 IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。标 号在程序中区分大小写, 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0 ,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。
页:
[1]