stm32l4 外部中断按键会卡死_STM32学习之路-按键中断测试(外部中断)
void RCC_Config(void)
{
SystemInit(); //系統(tǒng)時(shí)鐘初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
| RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD
| RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF
| RCC_APB2Periph_GPIOG, ENABLE);
}
當(dāng)然, 我們可以不用加SystemInit();這個(gè)函數(shù)也沒事.原因是startup_stm32f10x_hd.s這個(gè)文件已經(jīng)在幫我們干了這些事情了.. 它具體是怎么弄的,還有一些其它東西,目前還沒
去研究過,下次再研究看看.
(3)LED配置
void LED_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*led config*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
LED的配置前面應(yīng)該已經(jīng)記錄了,所以這里就不弄了
(4)配置中斷優(yōu)先級(jí)和(5)配置外部中斷線,這兩個(gè)我選擇放在一個(gè)模塊,因?yàn)槎际呛椭袛嘤嘘P(guān)系的嘛
void EXTI_PC2_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* key for exti */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
這也沒什么好解釋的了,前面的文章已經(jīng)解釋了
(6)中斷處理函數(shù)
這家伙推薦在stm32f10x_it.c里面寫,因?yàn)槟抢镉忻哪0?跟著官方走,錯(cuò)不了
void EXTI2_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line2) != RESET) //判斷按鍵是否按下
{
//LED取反
GPIO_WriteBit(GPIOD, GPIO_Pin_6,
(BitAction)((1-GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_6))));
EXTI_ClearITPendingBit(EXTI_Line2); //清除中斷標(biāo)志位
}
}
這里要注意的就是前面EXTIx這里的數(shù)字問題了,1-4沒什么問題,5-9就要稍微注意下.如果是應(yīng)該是這樣,它應(yīng)該是EXTI9_5_IRQHandler
這兒我有個(gè)問題,為什么沒看到外部中斷6呢,也就是EXTI6或7,8這些單獨(dú)的呢.. 原因可能是5-9他們都使用了同一個(gè)中斷向量表,這個(gè)話我印象中好像在哪兒看過
好,到這里基本功能就完成了.. 現(xiàn)象是可以出了.但是會(huì)有個(gè)問題就是有時(shí)候按一些按鍵,LED等會(huì)沒反應(yīng)或者亮滅幾下.. 這就是按鍵抖動(dòng)的問題了;
好,接下來說說怎么削抖:
這里說軟件消抖,硬件就不說了.. 傳說中的抖動(dòng)出現(xiàn)的原因就是你的手速不夠快,使中斷觸發(fā)了一次以上.. 我想如果你以20年到30年的專業(yè)單身手速(右手哦)來按的話
肯定沒這個(gè)問題..哈哈..好,直接上代碼..借鑒人家的:
用下面這個(gè)方法,就要調(diào)整前面的代碼了.
void KEY_DEL(void)
{
num = 0;
if (_keyon == 1) //按鍵是否按下,在中斷處理函數(shù)中
{
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == 0)
{
Delay(0x3ffff);//延遲,為的是讓你的手速能跟上
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == 0) //按鍵是否抖動(dòng)
{
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == 0); //是否松開
num = 1;
goto n_exit;
}
}
}
n_exit:;
_keyon = 0;
}
void EXTI2_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line2) != RESET)
{
_keyon = 1;//按鍵按下標(biāo)志
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
#include "misc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_rcc.h"
#include "system_stm32f10x.h"
#define LED_ON GPIO_SetBits(GPIOD, GPIO_Pin_6);
void LED_Config(void);
void EXTI_PC2_Config(void);
void RCC_Config(void);
void KEY_DEL(void);
void Delay(u32 times);
unsigned char _keyon = 0, num = 0;
int main(void)
{
unsigned char a = 0;
RCC_Config();
LED_Config();
EXTI_PC2_Config();
LED_ON;
while(1)
{
KEY_DEL();
if (num == 1 && a == 0)
{
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
a = 1;
}
else if(num == 1 && a == 1)
{
GPIO_SetBits(GPIOD, GPIO_Pin_6);
a = 0;
}
}
}
總結(jié)
以上是生活随笔為你收集整理的stm32l4 外部中断按键会卡死_STM32学习之路-按键中断测试(外部中断)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地雷会炸到自己吗_回顾自己曾经的往事
- 下一篇: 低压抽屉柜常见故障处理方法_低压配电设备