嵌入式爱好者

查看: 6629|回复: 6

按键中断

[复制链接]

0

主题

0

帖子

0

积分

扫一扫,手机访问本帖
发表于 2011-8-17 14:12:07 | 显示全部楼层 |阅读模式
  1. void ExtIntConfigure(void)
  2. {
  3.         rGPNCON |=0xaaa;                         //配置GPM0~GPM4为外部中断输入模式(不能省...)
  4.         rEINT0CON0 &=(~((7<<8)|(7<<4)|(7<<0)));  //将外部中断组0[5:1]配置为低电平触发(下降沿触发?
  5.         rEINT0CON0 |=((2<<8)|(2<<4)|(2<<0));
  6.         rEINT0FLTCON0 =0x0000000;
  7.                 //将外部中断组0[5:1]硬件滤波使能为电平滤波方式
  8.         rEINT0MASK  |=0x3f;                      //禁止中断--外部中断0屏蔽寄存器
  9.         rEINT0PEND=0xffffffff;                   //清除中断挂起寄存器
  10.         return;
  11. }
复制代码
这段代码中的rEINT0FLTCON0 |=((1<<23)|(0<<22)|(1<<15)|(0<<14)|(1<<7)|(0<<6));有啥用啊?不用可以吗
?谢谢。
回复

使用道具 举报

29

主题

9048

帖子

5593

积分

发表于 2011-8-17 16:26:03 | 显示全部楼层
看芯片手册来讲,是设置外部中断滤波。
其中。1 = digital filter(clock count),看来是用了数字滤波。
外部中断很容易有毛刺,一般都要有滤波吧。尤其是按键。
该会员没有填写今日想说内容.

0

主题

0

帖子

0

积分

 楼主| 发表于 2011-8-18 16:52:34 | 显示全部楼层
本帖最后由 潇毅 于 2011-8-18 16:54 编辑

回复 2# 飞凌-fatfish
谢谢,还有一个问题。就是下面关于CPSR状态寄存器的初始化。
  1. ;/*************************************************************************************
  2. ;        File Name : retarget_.s
  3. ;  
  4. ;        File Description : This file implements the stack & heap initilaization
  5. ;*************************************************************************************/

  6.                                 GET                ..\inc\option.inc
  7.                                

  8.                                 AREA        |C$$code|, CODE, READONLY


  9. Mode_USR                EQU                0x10   ;用户模式
  10. Mode_FIQ                EQU                0x11   ;快速中断模式
  11. Mode_IRQ                EQU                0x12   ;中断请求模式
  12. Mode_SVC                EQU                0x13   ;管理模式
  13. Mode_ABT                EQU                0x17   ;异常中断模式
  14. Mode_UND                EQU                0x1b   ;未定义模式
  15. Mode_SYS                EQU                0x1f   ;系统模式

  16. I_Bit                        EQU                0x80   ;禁止IRQ中断
  17. F_Bit                        EQU                0x40   ;禁止FRQ中断
  18. ;定义中断堆栈空间大小
  19. Size_FIQ_Stack        EQU                256   
  20. Size_IRQ_Stack        EQU                256
  21. Size_ABT_Stack        EQU                256
  22. Size_UND_Stack        EQU                256
  23. Size_SVC_Stack        EQU                8192

  24. ;定义堆栈偏移量
  25. Offset_FIQ_Stack        EQU     0
  26. Offset_IRQ_Stack        EQU     Offset_FIQ_Stack + Size_FIQ_Stack
  27. Offset_ABT_Stack        EQU     Offset_IRQ_Stack + Size_IRQ_Stack
  28. Offset_UND_Stack        EQU     Offset_ABT_Stack + Size_ABT_Stack
  29. Offset_SVC_Stack        EQU     Offset_UND_Stack + Size_UND_Stack


  30.                                 EXPORT        __user_initial_stackheap

  31. __user_initial_stackheap                        ;初始化堆栈

  32.                                 ldr                r0,=top_of_stacks       ;将栈顶的地址赋给r0

  33.                                 msr                CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
  34.                                 sub                sp,r0,#Offset_FIQ_Stack

  35.                                 msr                CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit
  36.                                 sub     sp,r0,#Offset_IRQ_Stack

  37.                                 msr                CPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit
  38.                                 sub                sp,r0,#Offset_ABT_Stack

  39.                                 msr                CPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit
  40.                                 sub                sp,r0,#Offset_UND_Stack

  41.                                 msr                CPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit
  42.                                 sub                sp,r0,#Offset_SVC_Stack
  43.                                
  44.                                 ;IMPORT  |Image$$ZI$$Limit|           ;表示ZI的结束地址
  45.                                 ;LDR                r0, =|Image$$ZI$$Limit|                                         
  46.                                 ldr                r0, =base_of_heap

  47.                                 mov                r2,#0
  48.                                 mov                r3,#0

  49.                                 mov                pc,lr                         ;R14的值复制到PC,子程序返回

  50. ;-------------------------------------------------------
  51.         [        (VIC_MODE = 0)                                ;VIC_MODE预定义为1,跳过该段程序
  52.                                 IMPORT        IntHandlerTable
  53.                                 EXPORT        IsrIRQ
  54. IsrIRQ
  55.                                 sub                sp,sp,#4                        ; reserved for PC
  56.                                 stmfd        sp!,{r8-r9}
  57.                                 ldr                r9,=0x71200f00                ; rVIC0ADDR
  58.                                 ldr                r9,[r9]
  59.                                 ldr                r8,=IntHandlerTable
  60.                                 add                r8,r8,r9,lsl #2     ;r8=r8+r9*4
  61.                                 ldr                r8,[r8]
  62.                                 str                r8,[sp,#8]
  63.                                 ldmfd        sp!,{r8-r9,pc}
  64.         ]


  65.                                 LTORG    ;数据缓冲池伪指令
  66.    
  67.                                 END
复制代码
我有个地方搞不懂,就是__user_initial_stackheap     这个汇编函数
  1. __user_initial_stackheap                        ;初始化堆栈

  2.                                 ldr                r0,=top_of_stacks       ;将栈顶的地址赋给r0

  3.                                 msr                CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
  4.                                 sub                sp,r0,#Offset_FIQ_Stack

  5.                                 msr                CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit
  6.                                 sub     sp,r0,#Offset_IRQ_Stack

  7.                                 msr                CPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit
  8.                                 sub                sp,r0,#Offset_ABT_Stack

  9.                                 msr                CPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit
  10.                                 sub                sp,r0,#Offset_UND_Stack

  11.                                 msr                CPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit
  12.                                 sub                sp,r0,#Offset_SVC_Stack
  13.                                
  14.                                 ;IMPORT  |Image$$ZI$$Limit|           ;表示ZI的结束地址
  15.                                 ;LDR                r0, =|Image$$ZI$$Limit|                                         
  16.                                 ldr                r0, =base_of_heap

  17.                                 mov                r2,#0
  18.                                 mov                r3,#0

  19.                                 mov                pc,lr                         ;R14的值复制到PC,子程序返回

复制代码
比如说:
  1. ldr                r0,=top_of_stacks       ;将栈顶的地址赋给r0

  2.                                 msr                CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
  3.                                 sub                sp,r0,#Offset_FIQ_Stack

复制代码
执行这句话后状态寄存器CPSR的C标志位会有何种变化?

29

主题

9048

帖子

5593

积分

发表于 2011-8-19 08:07:11 | 显示全部楼层
这次我还是帮顶吧。需要回复的帖子还很多。
欢迎其他做裸机开发的朋友一起参与讨论。
该会员没有填写今日想说内容.
ffhd01 该用户已被删除
发表于 2012-3-13 16:52:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
dbird 该用户已被删除
发表于 2013-10-31 10:12:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

110

主题

1358

帖子

1443

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352通行证

发表于 2013-10-31 17:44:12 | 显示全部楼层
IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。标 号在程序中区分大小写,[WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0 ,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-22 15:11

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表