潇毅 发表于 2011-8-17 14:12:07

按键中断

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));有啥用啊?不用可以吗
?谢谢。

飞凌-fatfish 发表于 2011-8-17 16:26:03

看芯片手册来讲,是设置外部中断滤波。
其中。1 = digital filter(clock count),看来是用了数字滤波。
外部中断很容易有毛刺,一般都要有滤波吧。尤其是按键。

潇毅 发表于 2011-8-18 16:52:34

本帖最后由 潇毅 于 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标志位会有何种变化?

飞凌-fatfish 发表于 2011-8-19 08:07:11

这次我还是帮顶吧。需要回复的帖子还很多。
欢迎其他做裸机开发的朋友一起参与讨论。

ffhd01 发表于 2012-3-13 16:52:27

dbird 发表于 2013-10-31 10:12:38

飞凌-路飞 发表于 2013-10-31 17:44:12

IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。标 号在程序中区分大小写, 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0 ,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。
页: [1]
查看完整版本: 按键中断