一、按鍵
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);
}
}
}