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

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

相关推荐
又见情义6 小时前
RK3568 Android 13 驱动适配实战:从零开始让SDK在自己的板子上跑起来
android·arm开发·驱动开发
振南的单片机世界7 小时前
看门狗硬核拆解:1.6秒不喂狗,硬件强制“掀桌子”
arm开发·stm32·单片机·嵌入式硬件
小嵌同学9 小时前
Linux 内核中的 Per-CPU 机制详解
linux·运维·arm开发·嵌入式
Jay丶ke10 小时前
arm ni-700
arm开发
振南的单片机世界1 天前
IDLE中断:串口收完一帧数据,硬件自动“吹哨”
arm开发·stm32·单片机·嵌入式硬件
zbyyd2 天前
Linux 基础与 Shell 命令
linux·运维·arm开发
振南的单片机世界3 天前
EXTI“一线多挂”陷阱:PA0和PB0同时触发,中断函数懵了
arm开发·stm32·单片机·嵌入式硬件
LCMICRO-133108477464 天前
国产长芯微LP4807完全P2P替代ADA4807,1mA、300MHz 增益带宽、电压反馈运算放大器
arm开发·嵌入式硬件·fpga开发·硬件工程·运算放大器·ada4807
LCMICRO-133108477464 天前
国产长芯微LP8628完全P2P替代AD8628,零漂移、单电源、输入输出轨到轨高精度运放
arm开发·嵌入式硬件·fpga开发·硬件工程·精密运放·ad8628
zlinear数据采集卡5 天前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源