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

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

相关推荐
zlinear数据采集卡9 小时前
从0到1硬核拆解:工业级数据采集卡的隔离设计与Modbus通信实战
arm开发·单片机·嵌入式硬件·fpga开发·开源
zlinear数据采集卡4 天前
从协议解析到波形实时显示:硬核拆解ZLinear采集卡上位机软件的开发架构
arm开发·单片机·嵌入式硬件·fpga开发·架构·开源
奔跑的架构师4 天前
[A-48]ARMv9/v8-电源状态管理机制(PSCI协调机制)
android·linux·arm开发·arm
想你依然心痛4 天前
RT-Thread组件生态:SAL网络框架与AT组件实战——网络抽象、AT指令
网络·arm开发·at·sal
secondyoung4 天前
Cortex-R52学习:存储系统
arm开发·单片机·学习·arm
c++之路5 天前
C++跨平台(九):跨平台字节序统一处理
开发语言·arm开发·c++
AndyHeee22 天前
【SVC、PendSV(系统异常) 与 外设 IRQ 、NVIC笔记】
arm开发
暮云星影22 天前
瑞芯微rk3588利用Rockchip NPU运行大语言模型(LLM)
arm开发·人工智能·语言模型·自然语言处理
techdashen22 天前
绕过系统 ICMP:用 rawsock、Npcap 和 WMI 找到默认网卡
开发语言·arm开发·rust
振南的单片机世界22 天前
ARM中断比51快在哪?硬件压栈+NVIC集中管理
arm开发·stm32·单片机·嵌入式硬件