中级会员
 
- 积分
- 207
- 金钱
- 207
- 注册时间
- 2018-2-11
- 在线时间
- 24 小时
|
1金钱
想用NVIC做一个中断控制的键盘输入,按一下,led亮灯,再按一下,led熄灭。感觉没问题啊,也不报错,就是不行。led一直是量的,为什么呢?
#include "stm32f10x.h"
#include "led.h"
#include "key.h"
int main()
{
u8 led_state;
SystemInit();
systick_init();
led_gpio_config();
key_gpio_config();
while(1);
}
以下是key.c文件中的代码
#include "key.h"
#include "led.h"
u8 led_on_off;
void key_gpio_config()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO 结构体
NVIC_InitTypeDef NVIC_InitStructure; //定义外部中断结构体
EXTI_InitTypeDef EXTI_InitStructure; //定义中断控制器结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
//开启GPIOB和 AFIO(复用端口)时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化 GPIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); //将 PB113 和EXIT_13连接
EXTI_InitStructure.EXTI_Line = EXTI_Line13; //选择EXTI_Line11
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //外部中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //下降沿出发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断组优先级 0
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //PPP 外部中断线
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //设置抢占优 先级为 3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置从优先级为 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQChannel(void)
{
u16 i,j;
if(EXTI_GetFlagStatus(EXTI_Line13) != SET) //如果是 EXIT_13 出发的中断,则处理
{
for(i = 100; i > 0; i--)
for( j = 720; j > 0; j--); //延迟一会
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == RESET) //消抖
{
led_on_off = led_on_off >= 4 ? 0 : led_on_off + 1;
}
if((led_on_off % 2) == 1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
}
else
{
GPIO_SetBits(GPIOA, GPIO_Pin_8);
}
EXTI_ClearITPendingBit(EXTI_Line13);//清除标志
}
}
|
|