初入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相比,要实现一个简单的功能,也需要查手册,然后需要配置大量的寄存器才能实现对应的功能,但是寄存器这么多也才能实现更复杂的功能,所以还需继续加油!

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

相关推荐
szxinmai主板定制专家27 分钟前
基于 ARM+FPGA精密多轴实时运动控制卡设计方案,适用于半导体设备等高精度领域(一)
arm开发·人工智能·嵌入式硬件·fpga开发·架构·语音识别
你疯了抱抱我6 小时前
【Mac】安装并配置HomeBrew;ARM GCC;make;OpenOCD
arm开发·macos
WHS-_-20223 天前
When RDMA Meets Wireless
arm开发
szxinmai主板定制专家3 天前
基于 ARM+FPGA 数据机床实时工业控制设计--以雕刻机为例
arm开发·人工智能·嵌入式硬件·fpga开发
wandertp3 天前
对信号处理及滤波器的理解---基于robomaster机器人嵌入式控制系统
arm开发·stm32·算法·信号处理
XMAIPC_Robot3 天前
基于RK3588 ARM+FPGA电火花数控机床控制系统设计,兼顾ethercat软硬件实时
linux·arm开发·人工智能·嵌入式硬件·fpga开发
底层开发智库3 天前
C1-Ultra FVP调试并运行Linux kernel全程记录,硬核演示如何解决启动问题
linux·arm开发·内核·嵌入式·arm
XMAIPC_Robot3 天前
基于 ARM+FPGA 数据机床控制系统设计--以雕刻机为例
arm开发·fpga开发
一抹晴空4 天前
Keil MDK AC6 compiler编译报错,与AC5区别
c语言·arm开发·单片机
运维成长记4 天前
关于“有x86镜像,没有Dockerfile” 怎么制作arm架构的镜像
arm开发·架构