一、蜂鸣器学习(中断)
二、BSP工程管理
利用BSP工程管理,使文档显示不杂乱;
将这些文件分为4类,并保存到4个不同的文件夹里。
首先在新的工程文件夹里创建一个之后我们编写的类似led驱动,clk驱动等等外设驱动程序都放在这文件夹里面,创建名为bsp文件夹;
再创建project文件夹,存放 start.s和 main.c 文件,也就是应用文件;
一个imx6ull文件夹,用来保存NXP的相关库cc.h、fsl_common.h、fsl_iomuxch和 MCIMX6Y2.h 这四个文件;
最后再创建一个obj文件夹,用来存放编译生成的.o 文件。
三、 按键练习
代码实现(GPIO):
四、中断
4.1 GIC控制器(通用中断控制器)
VFIQ/VIRQ中V指虚拟化的;
多数情况下我们使用IRQ:
作用:
作用是中断优先级排序;
中断屏蔽的控制;
GIC控制器(v2版本)最多处理8个内核;最多有1020个中断源:SGI (软件中断):( 0 - 15 ),由软件产生的中断;用于实现多核通信
PPIs(私有中断):(16 - 31),每个核都有自己独有的中断;这里的私有指内核
SPI(共享中断):(32-1019),外设中断,如定时器、外部中断、串口中断等。实际用到的只有(32-159)128个,这128是imx6ull所支持的
PS:GIC也可以屏蔽不需要的中断
V2版本的GIC不在ARM内部,V3、V4版本的是64位
4.2 异常向量表
异常向量表重映射(__set_VBAR)是指在处理器发生异常时,通过改变异常向量表的物理地址与逻辑地址之间的映射关系
目的:确保系统能够正确响应和处理异常。
异常状态返回地址偏移量:当异常状态发生以后,返回地址和lr中保留的地址偏移量
4.3 协处理器
协处理器:用于减轻系统微处理器特定处理任务的芯片;
cortex A7 共16个协处理器,CP0~CP15
每个soc中都有一个kernel,也是处理器,有时候处理不过来了,ARM就再设计了一堆协处理器,我们大多数情况下只用P15
4.3.1 mcr指令与mrc指令
用mcr与mrc来访问协处理器;
eg:mrc p15, 0, r0, c0, c0, 0(mrc指令读取MIDR(主ID)寄存器,读出来的结果放入了寄存器R0中)
mcr写入协处理器;
mrc读取协处理器;
CPSR分为I位(bit[7](0不屏蔽 1屏蔽))、F位(bit[6] 0不屏蔽 1屏蔽)
协处理器编号p0-p15;
读取出来的寄存器内容:
SCTLR寄存器:
CPS指令
这里的 effect 分为俩个bit[7](IE使能 cpsie(0)、ID失能cpsid(1)),使用了effect的话就不能省略iflags,i位指irq,f位指frq
PS:在汇编中调main.c中的函数时,要先保护现场
GIC首地址不确定,由P15保存
获取中断号,并记录
C_IAR 读写中断 C_EOIR 写回去
GPIOx_ICR //GPIO中的中断配置寄存器
GPIOx_IMR //GPIO中的中断屏蔽寄存器,0失能,1使能(默认失能)
GPIOx_ISR //设置中断标记寄存器 ,若为1,则说明该位产生中断,但要手动清零(第几位为1,第几位就中断)
.
4.4 抢占优先级
Cortex——A7 有32个抢占优先级(谁数小,谁的优先级就高)
1 1111 ---> 32个
0(组优先级) xxxx(子优先级)