6回答

1收藏

【望月追忆】带你入门STM32F0之四:按键----外部中断

STMCU STMCU 19581 人阅读 | 6 人回复 | 2012-12-07

本帖最后由 xinxincaijq 于 2013-1-5 17:17 编辑

按键中断,固件库已经把框架搭好了,我们要做的就是 1.初始化  2.填写中断服务程序
一、首先了解一下STM32F051的中断结构
1.STM32F051中断框架

在STM32F05x 中,共有最多28 中断/ 事件线可用: 7 线内部( 包含一条保留) 和21 线外部。
GPIO 口连接到16 个外部中断/ 事件线如下图:


板子上KEY1---->PF6    KEY2---->PF7  因此我们使用中断线路6、7
STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。

2.初始化配置  下面仅仅设置KEY1按键,KEY2类似
a.使能时钟  中断用到了 SYSCFG 也要使能SYSCFG
  1. /* GPIOC Periph clock enable */
  2.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
  3.         /* SYSCFG Periph clock enable */
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
复制代码
b.初始化GPIO   设置成输入状态
  1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
  2.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  3.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  4.         GPIO_InitStructure.GPIO_Speed =GPIO_Speed_Level_2;
  5.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  6.   GPIO_Init(GPIOF, &GPIO_InitStructure);
复制代码
c.设置中断线路6   EXTI6
  1. /* Configure EXTI6 line */
  2.   EXTI_InitStructure.EXTI_Line = EXTI_Line6;
  3.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  4.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  5.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  6.   EXTI_Init(&EXTI_InitStructure);
复制代码
d.设置NVIC
  1. /* Enable and set EXTI6 Interrupt */
  2.   NVIC_InitStructure.NVIC_IRQChannel = EXTI6_1_IRQn;
  3.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
  4.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  5.   NVIC_Init(&NVIC_InitStructure);
复制代码
e.填写中断服务程序
  1. if(EXTI_GetITStatus(EXTI_Line6) != RESET)
  2.   {
  3. GPIO_WriteBit(GPIOA, GPIO_Pin_11,
  4.                              (BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_11))));
  5.     GPIO_WriteBit(GPIOA, GPIO_Pin_12,
  6.                              (BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_12))));*/
  7.     EXTI_ClearITPendingBit(EXTI_Line6);
  8.   }
复制代码
分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

zndz410

发表于 2012-12-12 20:30:56 | 只看该作者

沙发抢一回...
板凳

woshizz

发表于 2015-8-10 16:06:48 | 只看该作者

很棒~~ 楼主大爱!!
地板

党国特派员

发表于 2015-8-10 17:31:31 | 只看该作者

感谢分享。。。
喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
5#

我的晴天

发表于 2015-12-29 13:58:17 | 只看该作者

非常感谢。学习中
6#

mrclp

发表于 2016-1-28 17:05:08 | 只看该作者

非常感谢LZ
7#

lising

发表于 2016-1-28 18:19:09 | 只看该作者

学习,收藏!谢谢!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条