在前几篇文章,GPIO的使用:点亮LED!中只讲述了IO口的输出,并没有输入,因为IO作为输入我建议采用中断方式,可以大大减轻CPU的运行时间。最常用的就是按钮的功能了,当然还有和其他芯片通信的功能。
前篇文章讲过GPIO可以通过寄存器设置为中断输入。(参考http://blog.csdn.net/devintt/article/details/50818494)
配置模式 | DDR | CR1 | CR2 | 配置模式 | 上拉电阻 |
输入 | 0 | 0 | 0 | 悬浮输入 | OFF |
0 | 1 | 0 | 上拉输入 | ON | |
0 | 0 | 1 | 中断悬浮输入 | OFF | |
0 | 1 | 1 | 中断上拉输入 | ON | |
输出 | 1 | 0 | 0 | 开漏输出 | OFF |
1 | 1 | 0 | 推挽输出 | ||
1 | x | 1 | 输出(最快速度10MHZ) | ||
x | x | x | 真正的开漏输出 | 未采用 |
这里我们选用PC3作为外部中断
-
void EXIT_GPIO_Init(void)
-
{
-
PC_DDR &= 0xf7;
-
PC_CR1 |= 0x08; // 将PC3设置成中断上拉输入
-
PC_CR2 |= 0x08;
-
-
EXTI_CR1 = 0x20; //PC设置为下降沿触发
-
}
这里需要注意的是,中断向量指定的是PC,也就是说 如果有几个PC口都设置为中断的话,只要其中一个中断响应,就会进入同一个函数 。
如果你有好几个按键在同一个port口的话,可以在进入中断函数之后做一个IO口状态的获取,判定哪个IO进行了中断,再对应相应的操作。
-
-
__ interrupt void EXIT_PORTC_RQHandler(void) //中断服务函数
-
{
-
if((PC_IDR & 0x08)== 0)
-
{
-
delay_nms( 50); //延时50ms,消抖
-
if((PC_IDR & 0x08)== 0) //再判断是否按下
-
{
-
while(!(PC_IDR & 0x08)); //松手检测
-
//TODO
-
-
}
-
}
-
}