您好!
我尝试为 TM4123GXl Tiva C 套件编写一些汇编代码。 我在 Keil MDK5中编写了简单的汇编程序。 以下是程序流程和配置:
GPIOF.0作为输入(板载按钮-2)
GPIOF.1 AS OUT (板载红色 LED)
程序的作用:切换按下每个按钮(SW2)时的 LED。
程序如何响应:按下每个按钮时、GPIOF.0会生成一个中断、在 ISR 中、LEAD 位被检查和切换。
问题出在哪里:ISR 只调用一次。 后续按钮按压操作不会触发 ISR。
以下是完整代码:
; ;@说明:打开 Tivs-C TM4C123GXL Launchpad 上的红色 LED ;按下 SW2; 时钟/总线控制寄存器 RCGC2GPIO_REG equ0x400FE108 GPIOHBCTL_REG equ0x400FE06C ;NVIC 寄存器 NVIC_EN0_REG equ 0xE000E100 ;GPIO 寄存器 GPIOFDIR_APB_REG equ0x40025400 GPIOFDEN_APB_REG equ0x4002551C GPIOFDATA_APB_REG equ0x4002500C GPIOFLOCK_APB_REG equ0x40025520 GPIOFCR_APB_REGequ0x40025524 GPIOPUR_APB_REG equ0x40025510 GPIOFPDR_APB_REG equ0x40025514 GPIOIS_APB_REG equ 0x40025404 GPIOIBE_APB_REG equ 0x40025408 GPIOIEV_APB_REG equ 0x4002540C GPIOIM_APB_REG equ 0x40025410 GPIOICR_APB_REG equ 0x4002541C ;寄存器值 GPIO_UNLOCK_VALequ0x4C4F434B GPIOF_NVIC_BIT equ 0x40000000 DELAY_VALUEequ500000 Area|.text|、code、readonly、align=2 拇指 条目 导出主 主函 BL_GPIO_init BL_config_interrupt B 。 _CONFIG_INTERRUPT ;启用 PF.0上的边沿检测 LDRR1、=GPIOIS_APB_REG LDRR0、[R1](R1) 和R0、 R0、 0x3E;清除位0 结构 R0、[R1](R1) ;中断生成由 GPIOIEV reg 控制 LDRR1、=GPIOIBE_APB_REG LDRR0、[R1](R1) 和R0、 R0、 0x3E;清除位0 结构 R0、[R1](R1) ;下降沿(按下按钮)产生中断 LDRR1、=GPIOIEV_APB_REG LDRR0、[R1](R1) 和R0、 R0、 0x3E;清除位0 结构 R0、[R1] ;为 PF.0启用中断 LDRR1、=GPIOIM_APB_REG LDRR0、[R1](R1) ORR0、 R0、 0x01;设置位0 结构 R0、[R1](R1) ;在 NVIC 侧启用 GPIO-F 中断 ;假定内核处于预村庄模式 LDRR1、=NVIC_EN0_REG LDRR0、=GPIOF_NVIC_BIT 结构 R0、[R1](R1) BX LR _GPIO_init ;将 APB 总线用于 GPIOF LDRR1、=GPIOHBCTL_REG LDRR0、[R1] 和R0、 R0、 0x1F;清除位5 STRR0、[R1](R1) ;启用 GPIO-F 的时钟 LDR R1、 =RCGC2GPIO_REG LDRR0、[R1](R1) ORR0、 R0、 0x20 结构R0、[R1](R1) ;解锁 GPIOCR 寄存器以进行写访问 LDRR1、=GPIOFLOCK_APB_REG LDRR0、=GPIO_UNLOCK_VAL 结构R0、[R1](R1) ;为 PF.0-1解锁 GPIOAFSEL、GPIOPUR、GPIOPDR 和 GPIODEN LDRR1、 =GPIOFCR_APB_REG LDRR0、[R1](R1) ORR0、 R0、 0x03 结构R0、[R1](R1) ;将 PF.0设置为输入,PF 方向设置为输出 LDRR1、=GPIOFDIR_APB_REG MOVR0、0x02 结构R0、[R1](R1) ;上拉 PF.0 LDRR1、 =GPIOFPUR_APB_REG LDRR0、[R1](R1) ORR0、 R0、 0x01 结构R0、[R1](R1) ;启用 PF.0-1的数字功能 LDRR1、=GPIOFDEN_APB_REG MOVR0、0x03 结构R0、[R1](R1) BX LR 对齐 Area |.text|、code、readonly GPIOF_Handler PROC 导出 GPIOF_Handler ;假设我们只需要 GPIO-F 的 PF.0中断 ;如果打开了多个中断,则需要进行检查 ;查看发生了哪个中断事件 ;清除中断 LDRR1、=GPIOICR_APB_REG LDRR0、[R1] ORRR0、 R0、 0x1;设置位0 STRR0、[R1](R1) ;禁用进一步的 ISR (防止中断重新进入) LDRR1、=GPIOIM_APB_REG LDRR0、[R1](R1) 和R0、 R0、 0x3E;设置位0 结构 R0、[R1] ;读取 PF.1的数据寄存器值 LDRR1、=GPIOFDATA_APB_REG LDRR0、[R1] 和R0、R0、#0x2 CMPR0、#0x2 BNELED_ON ;关闭 LED 和R0、R0、#0x01 STRR0、[R1] B INT_ENABLE LED_ON ;打开 LED ORRR0、R0、#0x02 STRR0、[R1] INT_ENABLE ;为 PF.0重新启用中断 LDRR1、=GPIOIM_APB_REG LDRR0、[R1](R1) ORR0、 R0、 0x01;设置位0 结构 R0、[R1](R1) ENDP 结束