初入ARM,点灯,按键与中断相结合

与MCU不同,ARM属于功能更复杂,更强大的SOC,是可以移植操作系统的,但是在最开始学习arm,需要了解arm的运行方式,所以现在使用的是裸机开发。arm系统有多种工作模式,分别是User,IRQ,FIQ,Supervisor,Abort,Undef 和 System。一般情况下arm会工作在User模式,但是当有异常发生时,pc指针会指向异常向量表中对应的异常向量,该异常向量保存的是异常处理函数入口,然后就会进入异常处理函数。

而对这些异常向量进行初始化,对其对应的cpsr,sp进行初始化就是需要汇编实现的功能,将这些写好之后,在汇编中使用b指令进行跳转,跳转到c文件的主函数开始正常运行。

而这些异常向量最常用到的就是中断异常,我选择的是使用IRQ模式执行中断处理函数,当产生中断的时候就会跳转到异常向量的位置,然后会跳转到中断处理函数,该中断处理函数是所有的中断都会跳转过来的函数,所以在该函数中,需要对跳转的是哪一个中断进行判断,一般使用的是INTOFFSET,中断偏移量进行判断,INTOFFSET值不同就代表了不同的中断,然后根据对应的中断去处理相应的函数,最终在处理完之后要记得源挂起寄存器和中断挂起寄存器的置起位都清掉,不然就会反复执行该中断。

因为我要使用的是按键,使用按键需要配置端口 G 控制寄存器(GPGCON, GPGDAT, GPGUP)

然后配置GPGCON寄存器中的GPG0,GPG3等与按键相关的这六个GPG,让他们的模式为EINT模式,就可以通过按键触发对应的外部中断了。然后通过配置EXTINTn(外部中断控制寄存器 n),就可以选择对应的触发方式,按键按下是高电平向低电平的跳变,所以这里选择的是下降沿触发方式,然后需要配置EINTMASK(外部中断屏蔽寄存器),通过配置该寄存器的对应位来允许中 断,这些都是对该外部中断的初始化,让其按下按键会进入相应的终端,最后在中断处理函数中检查EINTPEND(外部中断挂起寄存器)中被置起的位,就可以得知是外部中断是EINT8_23中的哪一个中断被相应了,然后就让一全局变量的键值改变,最后使用led灯对该键值进行显示。

但是在使用led之前,也同样需要查手册,对led点亮相关的GPB寄存器进行配置,写好初始化函数,还要写好led点亮的函数,最后才能实现按键控制led的功能。

总而言之,与之前学习的51相比,要实现一个简单的功能,也需要查手册,然后需要配置大量的寄存器才能实现对应的功能,但是寄存器这么多也才能实现更复杂的功能,所以还需继续加油!

下面是我实现该功能所需要配置的寄存器的手册内容

相关推荐
secondyoung9 小时前
I2C通信协议详解
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·51单片机
奔跑的架构师11 小时前
[A-50]ARMv9/v8-DVFS系统架构
linux·arm开发·架构·系统架构·arm
零依赖极客18 小时前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama
T1mzhou21 小时前
ARM64 Linux 6.10 内核驱动(14):drivers/base/platform.c:板级设备主战场
linux·c语言·开发语言·arm开发
零依赖极客2 天前
《30 天手搓 ARM 架构零依赖纯 C 推理引擎》课程介绍与大纲
c语言·开发语言·arm开发·人工智能·嵌入式硬件·ai编程
新时代牛马2 天前
ATF/ TEE / REE 与ARM 异常级别EL 安全体系完整篇:TrustZone硬件到 SMC 进OP-TEE的全链路
arm开发·python·安全
T1mzhou2 天前
ARM64 Linux 6.10 内核驱动(13):bus.c / driver.c 总线两张表,驱动怎么挂上去
linux·服务器·c语言·arm开发·arm
2401_862880823 天前
嵌入式开发 --- 51单片机与ARM核心知识
arm开发·嵌入式硬件·51单片机
CubeSandbox3 天前
Cube Sandbox 受邀亮相 Arm Create:腾讯云工程师将在“云 + AI”专场带来开场演讲
arm开发·腾讯云·cube sandbox
CubeSandbox3 天前
Cube Sandbox 受邀亮相 Arm Create 上海站:金峰将参与“领袖对谈”,共话 AI Agent 执行层
arm开发·人工智能·cube sandbox