打印

中断按键实验

[复制链接]
1159|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
EXTI 最普通的应用就是接上一个按键,设置为下降沿触发,用中断来检测按键。本实
验通过外部按键来控制板载 LED 的点亮和熄灭。  

沙发
aizaixiyuanqian|  楼主 | 2018-9-30 18:45 | 只看该作者
开发板的按键原理图如下所示



使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2018-9-30 18:45 | 只看该作者
代码分析
#include "example.h"
#if (EVB_EXAMPLE == KEY_EXAMPLE)
void KeyControl(void)
{
static int index = 1;
if (EvbKeyScan())
{
if (index % 2)
{
EvbLedControl(LED1, LED_ON);
EvbLedControl (LED2, LED_ON);
}
else
{
EvbLedControl (LED1, LED_OFF);
EvbLedControl (LED2, LED_OFF);
}
index++;
}}
/* 处理器 BOOT 之后会调用 main 函数,必须提供 */
int main(void)
{
/* 配置使能评估板上的 LED 和 KEY 设备 */
EVB_LEDConfig();
EVB_KeyConfig();
while(1);
return 1;
}
#endif

使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2018-9-30 18:46 | 只看该作者
在主函数中,首先使用 EvbLEDConfig()配置好 LED 用到的 I/O 后,等待外部中断,来点
亮或者熄灭 LED。
void EvbKeyConfig(void)
{
GPIO_InitPara GPIO_InitStructure;
EXTI_InitPara EXTI_InitStructure;
NVIC_InitPara NVIC_InitStructure;
RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD ,ENABLE);
/* Configure PD14\15 pin */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Connect EXTI Line14 to PD14 pin */
GPIO_EXTILineConfig(GPIO_PORT_SOURCE_GPIOD,
GPIO_PINSOURCE15);
/* Connect EXTI Line15 to PD15 pin */
GPIO_EXTILineConfig(GPIO_PORT_SOURCE_GPIOD,
GPIO_PINSOURCE14);
/* Configure EXTI Line0 and its interrupt to the lowest priority*/
EXTI_InitStructure.EXTI_LINE = EXTI_LINE14|EXTI_LINE15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LINEEnable = ENABLE;EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQ = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQPreemptPriority = 0;
NVIC_InitStructure.NVIC_IRQSubPriority = 1;
NVIC_InitStructure.NVIC_IRQEnable = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2018-9-30 18:46 | 只看该作者
int EvbKeyScan(void)
{
// int value = 0;
int count = 0xffff;
if (EXTI_GetIntBitState(EXTI_LINE14) != RESET)
{
while(count--);
if (EXTI_GetIntBitState(EXTI_LINE14) != RESET)
{
EXTI_ClearIntBitState(EXTI_LINE14);
return 1;
}
}

使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2018-9-30 18:46 | 只看该作者
if (EXTI_GetIntBitState(EXTI_LINE15) != RESET)
{
while(count--);
if (EXTI_GetIntBitState(EXTI_LINE15) != RESET)
{
EXTI_ClearIntBitState(EXTI_LINE15);
return 2;
}
}
//return value;
return 0;
}

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2018-9-30 18:47 | 只看该作者
NVIC 初始化调用 NVIC_PriorityGroupConfig()库函数, 把 NVIC 中断优先级分组设置为第 1 组。接下来
开始向 NVIC 初始化结构体写入参数.NVIC_IRQChannel = EXTI4_15_IRQn,表示要配置的为 EXTI
第 4~15 线的中断向量。
然后配置抢占优先级和响应优先级,因为这个工程简单,就直接把它设置为最高级中断。
填充完结构体,别忘记最后要调用 NVIC_Init()函数来向寄存器写入参数。

使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2018-9-30 18:47 | 只看该作者
EXTI 初始化
配置好 NVIC 后,还要对 GPIOE 进行初始化。调用 SYSCFG_EXTILine_Config ()函数把 GPIOD
Pin14、 15 设置为 EXTI 输入线。这里需要填写 EXTI 的初始化结构体。

使用特权

评论回复
9
aizaixiyuanqian|  楼主 | 2018-9-30 18:48 | 只看该作者
编写中断服务函数
GD32_EXTI4_15_ISR,我们改写该代码,使得调用我们编写得中断处理函数 KeyControl ()。
进 入 中 断 后 , 调 用 函 数 EVB_KeyScan() 来 检 查 是 否 有 按 键 事 件 发 生 。 库 函 数
EXTI_GetITStatus()检查是否产生了 EXTI_Line 中断来操作 LED.

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2018-9-30 18:48 | 只看该作者
实验现象
将 Colibri 开发板供电,插上 USB 串口线,打开串口工具,配置串口工具为 115200 8-N-1,
将编译好的程序下载到开发板,即可看到串口工具打印出如下图的信息。然后通过按键 1、
按键 2 就可以分别点亮或者熄灭 LED1、 LED2。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝