GPIO中断
一、函数介绍
(1)void GPIOIntTypeSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32IntType)
- 功能:设置指定引脚的中断触发类型.
- 参数:
(1)ui32Port: GPIO口的基地址
(2)ui8Pins: 多个bit-packed格式表示的引脚
(3)ui32IntType: 中断触发类型(有以下类型)
1 |
中断触发方式是啥?
就是怎样触发这个中断
主要有两种方式
沿触发和电平触发
沿触发比如说时钟中断,在被响应并被清除时,就不会触发,
电平触发比如串口中断,在被响应并清除后,从中断态返回SVC态仍可能会触发中断。
可能顾名思义就可以吧。。
(2)void GPIOIntRegister(uint32_t ui32Port, void (*pfnIntHandler)(void))
- 功能:注册GPIO中断的中断处理程序
- 参数:
(1)ui32Port :GPIO口的基地址
(2)pfnIntHandler: 是GPIO中断服务程序入口地址指针。 - 说明:
(1)不管是什么外设触发的中断,都要先注册中断服务函数,告诉程序中断发生时去哪里,类似的函数有SysCtlIntRegister
、ADCIntRegister
等
(2)如果不利用这些中断注册函数,也可以在启动文件中修改中断向量表进行手动注册
(3)GPIOIntRegister只能以GPIO组为单位注册,不能精确到判断哪个引脚发生中断,因此要在中断服务函数中判断触发中断的引脚,以下为一个示例
1 | //GPIOF中断服务函数 |
(3)void GPIOIntEnable(uint32_t ui32Port, uint32_t ui32IntFlags)
- 功能:使能指定引脚的中断.
- 参数:
(1)ui32Port :GPIO口的基地址
(2)ui32IntFlags: 被禁止的中断源中断屏蔽位(指示哪些引脚中断被开启,是以下参数的逻辑或)
(4)void IntEnable(uint32_t ui32Interrupt)
- 功能:使能一个中断
- 参数:
(1)ui32Interrupt 指定的被允许的中断. - 说明:这个函数是中断控制器级的中断使能控制
(5)bool IntMasterEnable(void)
- 功能:使能处理器中断.
- 参数:无
- 说明:
(1)这是处理器级的中断使能控制,它决定处理器要不要处理中断控制器的请求
(2)以上三个函数,从低级到高级对应了中断处理通路的三道“开关”,如下图所示
看来要同时有三个级别的中断使能控制。
(6)uint32_t GPIOIntStatus(uint32_t ui32Port, bool bMasked)
- 功能:读取指定GPIO口的中断状态
- 参数:
(1)ui32Port: GPIO口的基地址.
(2)bMasked: 指定返回屏蔽的中断状态还是原始的中断状态 - 说明: 如果bMasked被设置为真,则函数返回被屏蔽的中断状态,否则返回原始的中断状态。解释一下所谓“被屏蔽的中断状态”。在
GPIOIntEnable
这个函数中,没有写在第二个参数ui32IntFlags
中的引脚是被屏蔽的(即不处理它们的中断事件)。当bMasked为真时,返回GPIOMIS寄存器值,所有被屏蔽的位都是0,否则返回GPIORIS寄存器值,被屏蔽的位也可能是1(因为虽然不处理这些引脚的中断事件,但它们的输入也可能符合中断特征) - 就是输出都那个口在中断状态。
(7)void GPIOIntClear(uint32_t ui32Port, uint32_t ui32IntFlags)
功能:清除指定中断源标志
参数:
(1)ui32Port :GPIO口的基地址
(2)ui32IntFlags :被清除的中断源中断屏蔽位发生中断后,对应的中断标志位置1,进入中断服务函数,在服务函数中务必清除中断标志,否则程序将不停地进入中断服务函数
二、例程
1 | void GPIO_INT_init(){ |