(一)外部中断与GPIO
IMX1064的外部中断属于GPIO功能之一,相关参考在参考手册12章。
General Purpose Input/Output (GPIO)
值得一提的是,IMX1064的GPIO设计是一个引脚两组IO的模式,GPIO1-5和GPIO6-9一一对应,使用的是相同的物理引脚,但GPIO1-5是普通速度的GPIO,而GPIO6-9则是高速GPIO ,运行在更高主频的时钟总线上。
(二)配置代码
IMX1064的外部中断的特性与大部分ARM单片机相似,都是使能GPIO及相关输入、中断功能,使能中断管理相关开关,以及编写中断函数。
如果从零开始可能需要查阅API手册,阅读参考手册查询每个寄存器功能。但MCUXpresso IDE的图形配置功能极大地简化了工作,只需要短短几步即可完成外部中断配置:
1-查询原理图,用户案件位于SW8,所连接引脚为GPIO5,0
相关引脚:
2-配置GPIO5,0,设置input+falling edge
3-此时即使配置了中断函数依然不会触发中断。
观察右下角的警告栏,有关于GPIO配置未初始化的提示,实际依照代码,GPIO已经配置完毕,但相关中断未使能,即在其他ARM单片机里面常见的NVIC中断管理。
这里表现为:
EnableIRQ(GPIO5_Combined_0_15_IRQn);
图形配置软件提供了方便的配置通道,只需要右键第一个选项,即可修复这个问题。
4-拷贝这个中断函数到main文件里面,中断函数里处理消抖及翻转LED的操作:
- /* GPIO5_Combined_0_15_IRQn interrupt handler */
- void BOARD_GPIO5_GPIO_COMB_0_15_IRQHANDLER(void) {
- /* Place your code here */
- static int t_lastTtl = 0;
- /* clear the interrupt status */
- GPIO_PortClearInterruptFlags(GPIO5, 1U << 0);
- /* Change state of switch. */
- // g_InputSignal = true;
- if(t_lastTtl==1)
- GPIO_PinWrite(GPIO1, 9 , 0);
- else
- GPIO_PinWrite(GPIO1, 9 , 1);
- while(GPIO_PinRead(GPIO5, 0)==0);
- for (int i = 0; i < 10000000; ++i)
- __asm("NOP");
- t_lastTtl = !t_lastTtl;
- /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
- Store immediate overlapping exception return operation might vector to incorrect interrupt. */
- #if defined __CORTEX_M && (__CORTEX_M == 4U)
- __DSB();
- #endif
- }