本帖最后由 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- /* GPIOC Periph clock enable */
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
- /* SYSCFG Periph clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
复制代码 b.初始化GPIO 设置成输入状态- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed =GPIO_Speed_Level_2;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOF, &GPIO_InitStructure);
复制代码 c.设置中断线路6 EXTI6- /* Configure EXTI6 line */
- EXTI_InitStructure.EXTI_Line = EXTI_Line6;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
复制代码 d.设置NVIC- /* Enable and set EXTI6 Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = EXTI6_1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
复制代码 e.填写中断服务程序- if(EXTI_GetITStatus(EXTI_Line6) != RESET)
- {
- GPIO_WriteBit(GPIOA, GPIO_Pin_11,
- (BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_11))));
- GPIO_WriteBit(GPIOA, GPIO_Pin_12,
- (BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_12))));*/
- EXTI_ClearITPendingBit(EXTI_Line6);
- }
复制代码 |