stm32按键的检测(EXTI和Polling两种方式)
2017-09-20 14:02
447 查看
好像很简单的,但...
EXTI Mode时,只要别漏下面这两行基本是没问题了.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 复用时钟使能 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1); /* 选择GPIO管脚用作外部中断线路 */
#include <stm32f10x.h>
#include <rtthread.h>
#define EXTI_Trigger_Mode
#define KEY_RCC RCC_APB2Periph_GPIOB
#define KEY_GPIO GPIOB
#define KEY_PIN (GPIO_Pin_1)
#define KEY_LINE (EXTI_Line1)
#ifdef EXTI_Trigger_Mode
void rt_hw_key_gpio_init(void);
void rt_hw_key_exti_init(void);
void rt_hw_key_navi_init(void);
#else
void rt_key_polling_judge(void);
#endif
以上是.h文件内容
#include "key.h"
void rt_hw_key_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(KEY_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY_GPIO,&GPIO_InitStructure);
}
#ifdef EXTI_Trigger_Mode
void rt_hw_key_exti_init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = KEY_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
}
void rt_hw_key_navi_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI1_IRQHandler(void)
{
if(EXTI_GetITStatus(KEY_LINE) == SET)
{
rt_kprintf("~~~~~~~~~~~~~~~~~~~~~~~~~~111~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
EXTI_ClearFlag(KEY_LINE);
}
}
#else
void rt_key_polling_judge(void)
{
while(1)
{
if(GPIO_ReadInputDataBit(KEY_GPIO,KEY_PIN) == 0)
{
rt_thread_delay(100);
if(GPIO_ReadInputDataBit(KEY_GPIO,KEY_PIN) == 0)
{
rt_kprintf("~~~~~~~~~~~~~~~~~~~~~~~~~~222~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
}
}
}
}
#endif
以上是.c的内容.
EXTI Mode时,只要别漏下面这两行基本是没问题了.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 复用时钟使能 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1); /* 选择GPIO管脚用作外部中断线路 */
#include <stm32f10x.h>
#include <rtthread.h>
#define EXTI_Trigger_Mode
#define KEY_RCC RCC_APB2Periph_GPIOB
#define KEY_GPIO GPIOB
#define KEY_PIN (GPIO_Pin_1)
#define KEY_LINE (EXTI_Line1)
#ifdef EXTI_Trigger_Mode
void rt_hw_key_gpio_init(void);
void rt_hw_key_exti_init(void);
void rt_hw_key_navi_init(void);
#else
void rt_key_polling_judge(void);
#endif
以上是.h文件内容
#include "key.h"
void rt_hw_key_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(KEY_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY_GPIO,&GPIO_InitStructure);
}
#ifdef EXTI_Trigger_Mode
void rt_hw_key_exti_init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = KEY_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
}
void rt_hw_key_navi_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI1_IRQHandler(void)
{
if(EXTI_GetITStatus(KEY_LINE) == SET)
{
rt_kprintf("~~~~~~~~~~~~~~~~~~~~~~~~~~111~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
EXTI_ClearFlag(KEY_LINE);
}
}
#else
void rt_key_polling_judge(void)
{
while(1)
{
if(GPIO_ReadInputDataBit(KEY_GPIO,KEY_PIN) == 0)
{
rt_thread_delay(100);
if(GPIO_ReadInputDataBit(KEY_GPIO,KEY_PIN) == 0)
{
rt_kprintf("~~~~~~~~~~~~~~~~~~~~~~~~~~222~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
}
}
}
}
#endif
以上是.c的内容.
相关文章推荐
- STM32中关于检测按键的一些问题(关于采用传统的延时消抖方式和采用中断方式)
- 通过Javascript调用微软认知服务情感检测接口的两种实现方式
- 多功能检测按键-3 按键扫描 单按 长按 多个按键 响应方式
- 第33章 TIM—电容按键检测—零死角玩转STM32-F429系列
- Tiny4412裸机程序,按键检测(轮询方式)
- STM32——EXTI外部中断:中断方式翻转LED灯
- STM32的两种debug方式
- STM32按键的检测
- MSP430利用IO中断方式来实现按键检测
- STM32 按键检测
- 【连载】【STM32神舟III号实验例程】按键检测与315M无线模块实验(3)
- STM32学习笔记之按键查询方式控制led灯的亮灭
- STM32学习笔记:gps两种解码的方式
- qt5读取按键值的两种方式
- IOS检测晃动的两种方式
- 友坚科技4412开发板Linux平台下UT4412BV03裸机开发指南(十二)查询方式检测按键
- 基于ADNROID 检测网络是否可用的两种方式
- IOS检测晃动的两种方式
- 裸奔程序之查询方式检测按键
- 我的一个基于stm32的独立按键扫描方式