日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

stm32l4 外部中断按键会卡死_STM32学习之路-按键中断测试(外部中断)

發(fā)布時(shí)間:2023/12/2 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32l4 外部中断按键会卡死_STM32学习之路-按键中断测试(外部中断) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)也沒(méi)事.原因是startup_stm32f10x_hd.s這個(gè)文件已經(jīng)在幫我們干了這些事情了.. 它具體是怎么弄的,還有一些其它東西,目前還沒(méi)

去研究過(guò),下次再研究看看.

(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);

}

這也沒(méi)什么好解釋的了,前面的文章已經(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ù)字問(wèn)題了,1-4沒(méi)什么問(wèn)題,5-9就要稍微注意下.如果是應(yīng)該是這樣,它應(yīng)該是EXTI9_5_IRQHandler

這兒我有個(gè)問(wèn)題,為什么沒(méi)看到外部中斷6呢,也就是EXTI6或7,8這些單獨(dú)的呢.. 原因可能是5-9他們都使用了同一個(gè)中斷向量表,這個(gè)話我印象中好像在哪兒看過(guò)

好,到這里基本功能就完成了.. 現(xiàn)象是可以出了.但是會(huì)有個(gè)問(wèn)題就是有時(shí)候按一些按鍵,LED等會(huì)沒(méi)反應(yīng)或者亮滅幾下.. 這就是按鍵抖動(dòng)的問(wèn)題了;

好,接下來(lái)說(shuō)說(shuō)怎么削抖:

這里說(shuō)軟件消抖,硬件就不說(shuō)了.. 傳說(shuō)中的抖動(dòng)出現(xiàn)的原因就是你的手速不夠快,使中斷觸發(fā)了一次以上.. 我想如果你以20年到30年的專業(yè)單身手速(右手哦)來(lái)按的話

肯定沒(méi)這個(gè)問(wèn)題..哈哈..好,直接上代碼..借鑒人家的:

用下面這個(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); //是否松開(kāi)

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)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。