TM4C123G开发板ARM汇编程序:按钮GPIO初始化问题咨询
TM4C123G GPIO按钮初始化(ARM汇编实现)
假设你用开发板自带的用户按钮(通常接PA0引脚,默认是NMI功能,需解锁才能作为普通GPIO使用),以下是完整的初始化步骤、汇编代码,以及按钮状态读取、消抖的实现思路,方便对接你的LED模式切换逻辑。
一、核心初始化步骤(汇编代码)
1. 使能GPIOA端口时钟
TM4C所有外设必须先开启对应时钟才能操作,GPIOA的时钟控制位在SYSCTL_RCGCGPIO_R寄存器的第0位:
; 使能GPIOA时钟 LDR R0, =SYSCTL_RCGCGPIO_R LDR R1, [R0] ORR R1, R1, #0x01 ; 置位第0位,开启GPIOA时钟 STR R1, [R0] ; 等待时钟稳定(可选但推荐) LDR R0, =SYSCTL_PRGPIO_R WAIT_GPIOA: LDR R1, [R0] ANDS R1, R1, #0x01 BEQ WAIT_GPIOA
2. 解锁PA0引脚(关键步骤!)
PA0默认被锁定为NMI功能,必须先解锁才能配置为普通GPIO:
; 解锁GPIOA锁定寄存器 LDR R0, =GPIOA_LOCK_R LDR R1, =0x4C4F434B ; 解锁密钥固定为0x4C4F434B STR R1, [R0] ; 允许修改PA0的配置寄存器 LDR R0, =GPIOA_CR_R LDR R1, [R0] ORR R1, R1, #0x01 ; 置位第0位,允许修改PA0配置 STR R1, [R0]
3. 配置引脚为上拉输入
按钮通常接地,配置上拉电阻后,未按压时引脚为高电平,按压时为低电平:
; 启用PA0上拉电阻 LDR R0, =GPIOA_PUR_R LDR R1, [R0] ORR R1, R1, #0x01 ; 置位第0位,启用上拉 STR R1, [R0] ; 设置PA0为输入方向 LDR R0, =GPIOA_DIR_R LDR R1, [R0] BIC R1, R1, #0x01 ; 清零第0位,设置为输入 STR R1, [R0] ; 启用PA0数字功能 LDR R0, =GPIOA_DEN_R LDR R1, [R0] ORR R1, R1, #0x01 ; 置位第0位,启用数字输入 STR R1, [R0]
二、读取按钮状态与消抖
机械按钮会产生抖动,直接读取会导致误判,建议添加简单延时消抖:
; 读取PA0按钮状态,返回R1=0表示按下,R1=1表示未按 READ_BUTTON: LDR R0, =GPIOA_DATA_R LDR R1, [R0] AND R1, R1, #0x01 ; 提取PA0状态 CMP R1, #0 BEQ CHECK_DEBOUNCE ; 检测到低电平,进入消抖 BX LR CHECK_DEBOUNCE: BL DELAY_10MS ; 调用10ms延时子程序 LDR R0, =GPIOA_DATA_R LDR R2, [R0] AND R2, R2, #0x01 CMP R2, #0 BEQ BUTTON_PRESSED ; 延时后仍为低电平,确认按下 BX LR BUTTON_PRESSED: ; 这里添加模式切换逻辑,比如切换LED移位方向/模式 ; 注意处理单次按压(等待按钮释放) WAIT_RELEASE: LDR R0, =GPIOA_DATA_R LDR R2, [R0] AND R2, R2, #0x01 CMP R2, #1 BEQ WAIT_RELEASE BX LR ; 简单的10ms延时子程序(假设主频80MHz,可根据实际主频调整循环次数) DELAY_10MS: LDR R3, =800000 ; 80MHz下,循环800000次约10ms DELAY_LOOP: SUBS R3, R3, #1 BNE DELAY_LOOP BX LR
三、对接LED模式切换逻辑
在BUTTON_PRESSED处,可设置一个模式寄存器(比如R4),每次按下时切换值:
BUTTON_PRESSED: CMP R4, #0 BEQ MODE1 MOV R4, #0 BX LR MODE1: MOV R4, #1 BX LR
之后在LED移位的主循环中,根据R4的值选择不同的移位方向或点亮逻辑即可。
内容的提问来源于stack exchange,提问作者euniquity
相关产品推荐
相关产品推荐

