文章目录
前言
一、文件分析
start.S文件:
Core_ca7.h文件:
MCIMX6Y2.h文件:
bsp_gpio.h文件:
bsp_gpio.c文件:
bsp_int.h文件:
bsp_int.c文件:
Exit文件夹:
二、代码实现流程:
总结
最近在学习正点原子I.MX6ULL开发板的外部中断实验,此章实验增加了许多新的内容,包括中断向量表、GIC的控制函数等,GPIO的配置中还增加了中断的相关配置。在第一次学习完后对一些函数的实现和函数之间的调用思路不是很清晰,对一些函数指针、结构体数组等定义不是太理解,特写此文来梳理思路。
SCTLR寄存器相关位
4:基本配置完成后就跳转到C语言的main函数
6:中断服务函数执行完中断后恢复现场
左盟主移植的Cortex-A7关于GIC的一些操作函数和寄存器相关宏的定义、C语言内嵌汇编、GIC的分发器端和cpu接口端的寄存器结构体等。在后面中断初始化的时候会用到GIC_Init()(被bsp_int.c中的interr_init(void)调用), GIC_EnableIRQ(IRQn_Type IRQn)(被bsp_exti.c中的exit_init(void)调用)。
IRQn枚举类型定义了IRQ中断下所有的中断ID号
增加了中断触发类型枚举,GPIO配置结构体增加了中断触发方式(gpio_interrupt_mode_t) 在_gpio_pin_config中添加了中断触发方式interruptMode。
注意:enum _gpio_interrupt_mode 定义的量并不是传入ICR寄存器而是后面switch case语句中的变量
定义了通用中断服务函数格式,中断处理函数结构体(包括指向中断服务函数的指针,用户参数)
包含通用中断的模板、中断处理函数的实现、注册中断处理函数
包含外部中断的初始化和服务函数,结构就类似于stm32,调用了Core_ca7.h里面的一些GIC函数、bsp_int的注册中断函数、bsp_gpio.c文件中的gpio_init(),gpio_enableint()函数。
最终实现的按键中断服务函数
首先是对start.S基本的配置,配置完成后进入C语言的main()函数对基本外设进行初始化,首先是执行中断初始化interr_init()
interr_init() 里面包含GIC_Init()和中断向量表初始化、中断向量偏移
system_irqtable_init(void)先让所有的中断服务函数指向了default_irqhandler(unsigned int gicciar, void *param),用户参数默认为NULL
interr_init()初始化完成后,执行其余5个初始化函数(因为与之前相同这里就不做具体分析)。
接下来进入exti_init()函数对按键进行外部中断初始化
函数中先定义了按键IO的结构体key_config,然后将按键所连接的端口UART1_CTS_B进行复用成GPIO1_IO18,配置按键为输入模式,下降沿的中断触发方式,然后进入gpio_init()函数。
在函数中配置了GPIO1的GDIR寄存器控制为输入,IMR对应的位先写0关闭中断,然后进入gpio_intconfig()函数对中断的触发方式进行配置
gpio_init()执行完成后进入GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);
执行中断注册函数system_register_irqhandler(GPIO1_Combined_16_31_IRQn, gpio1_io18_irqhandler, NULL);
gpio_enableint(GPIO_Type* base, unsigned int pin)将IMR寄存器对应的位置1开启gpio中断
配置完成后等待外部中断的发生,当按键按下后触发了外部中断,start.S文件进入IRQ_Handler:
保护现场后跳转到C语言中的system_irqhandler(unsigned int gicciar)
进入后通过gicciar寄存器的0~10位判断具体的中断ID号,根据ID号进入对应的中断服务函数
中断服务函数内就是当按键按下后蜂鸣器状态翻转,结束后清除中断标志位。执行完gpio1_io18_irqhandler(unsigned int gicciar, void *param)后回到start.S文件恢复现场,整个中断程序结束,重新回到while(1)循环等待下一次中断的发生。
以上是我对正点原子嵌入式Linux裸机开发教程外部中断实验的思路整理。之前在学习stm32的时候没有涉及中断向量表、中断向量偏移等相关内容,这些都是ST公司帮我们事先写好的。学习完本章后,我对I.MX6ULL的GIC控制服务、中断处理流程、GPIO关于中断的寄存器都有了一个更深的理解,对C语言中的函数指针、结构体数组的知识也进行了复习、巩固。