一、按键
1. 初始化
key.c
手册C32 - IOMUXC
1. 复用功能配置
IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B: 低四位(0101)
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
SION(信号监控)1: 0 //0 DISABLED — Input Path is determined by functionality
MUX_MODE(复用功能)4:0101 // ALT5 -- Select mux mode: ALT5 mux port:
GPIO1_IO03 of instance:gpio1
2. 电器特性配置
IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF080);
HYS(压摆率)1: 0 //0 HYS_0_Hysteresis_Disabled; 输入 不开启
PUS(上拉或者下拉)2: 11 // PUS_3_22K_Ohm_Pull_Up — 22K Ohm Pull Up
PUE(拉与保持选择)1: 1 //选择拉
PKE(拉或保持使能)1: 1 //使能
ODE(漏极开漏)1: 0 //使能
SPEED(速度)2: 10 //SPEED_2_medium_100MHz_ — medium(100MHz)
DSE(驱动能力)3: 000 //DSE_0_output_driver_disabled_ — output driver disabled; 输出是才有用,所以关闭
SRE()0: 0 //SRE_0_Slow_Slew_Rate — Slow Slew Rate
3. 引脚方向
Chapter 28:General Purpose Input/Output (GPIO)
GPIOx_GDIR
GPIO1->GDIR &= ~(1 << 18);
0 INPUT — GPIO is configured as input.
1 OUTPUT — GPIO is configured as output.
2. 开关检测
Chapter 28:General Purpose Input/Output (GPIO)
GPIOx_DR:开关断开高电平,开关按下低电平
二、中断
1. GIC介绍
1. 概念
通用目的的中断控制器(Generic Inierrupt Controller)
硬件 -> GIC -> 处理器
中断源 -> 中断控制器GIC -> 中断处理器 内核kernal
手册:裸机 - 中断 - GIC
VFIQ:V:虚拟的
2. GIC内核
GIC手册 - GIC Partitioning
中断源:0-15 SGI 软件中断
16-31 PPI 私有的外设中断
32-1019 SPI 可设置的外设中断
2. 中断配置
1. 外设终端
头文件core_ca7.h中
IRQn_Typr:0- 159 外设终端中
C_CTLR
C_IAR 中断通知寄存器
C_EOIR 中断结束寄存器
2.协处理器
cp0 - cp15 主要使用cp10.11.15 coprocessor
手册A7架构参考手册 - 4.System Control
1. c0 - MIDR
2. c1 - SCTLR4
mrc p15,0,r0,c1,c0,0
bic r0, r0, #(1 << 13)
orr r0, r0, #(1 << 12)
mcr p15,0,r0,c1,c0,0
3. c12 - VBAR
配置成0后可以修改该寄存器重新映射到其他地址
头文件MCIMX6Y2.h中
GPIO1_Combined_16_31_IRQn =99
__get_VBAR(0x87800000);
4. c15 - CBAR
mrc p15, 4, r0, c15, c0, 0
3. 获取GIC基地址
1. MRC / MCR
异常向量表基地址映射 iche打开
mrc p15, 0, r0, c1, c0, 0 参数对应cp1内容,修改异常向量表映射方式
bic r0, r0, #(1 << 13) bit13位为V清零,VBAR配置中断向量基地址
orr r0, r0, #(1 << 12) bit12位为I 置一,iche使能位打开
mcr p15, 0, r0, c1, c0, 0
2. 步骤
中断源 -> 中断控制器GIC -> 中断处理器 内核kernal
手册C28(外设) - GPIOx - ICR1 / ICR2 / IMR
1. 中断源
1. 中断触发方式
GPIO->ICR2 |= (3 << 4)
2. 中断屏蔽解除
GPIO->IMR |= (1 << 18)
3. 中断状态寄存器
if(GPIO1->ISR &= (1 << 18)) != 0)
GPIO1->ISR |= (1 << 18)
2. GIC
1.GIC初始化
GIC_Init();
2.中断使能
GIC_EnablelRQ(GPI01_Combined_16_31_IRQn);
3.GIC基地址获取
mrc p15, 4, r1, c15, c0, 0
4.获取中断号
// C_IAR:Base+0x200C
add r1,r1,#0×2000
[dr r0, [r1, #0x0C]
5.中断标志清理
// C_EOIR:Base+0x2010
str r0, [r1, #0x10]3.
3. 内核处理器
1.异常向量表基地址和开启ICache
mrc p15, 0, r0, c1, c0, 0
bic r0, r0,#(1 <<13)
orr r0, r0, #(1 <<12)
mcr p15, 0, r0, c1, c0,0
_set_VBAR(0x87800000);
2.中断向量
sub lr, lr,#4
stmfd sp!, {r0-r12, lr)
mrc p15, 4, r1, c15, c0, 0
add r1, r1, #0x2000
ldr r0,[r1, #0x0C]
stmfd sp!, {r0, r1}
cps #0x1F//中断嵌套
stmfd sp!,{lr}
bl system_interrupt_hander
ldmfd sp!, {lr}
cps #0x12
ldmfd sp!, {r0, r1}
str r0,[r1, #0x10]
ldmfd sp!, {r0-r12, pc}^
3.中断总服务函数
void system_interrupt_hander(unsigned int irq)
{
if (irq == GPI01_Combined_16_31_IRQn)
{
if ((GPI01->ISR &= (1 <<18)) != 0)
{
led_flicker();
GPI01->ISR = (1 <<18);
}
}
}