日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]//======================================================//**基于STM32的按鍵控制與外部中斷實(shí)例詳解**為了減少重復(fù)的內(nèi)容,所以將外部中斷的例程與按鍵控制實(shí)例 放在一起學(xué)習(xí)。一開始先在51黑論壇率先上傳了本文

//======================================================//

**基于STM32的按鍵控制與外部中斷實(shí)例詳解

**為了減少重復(fù)的內(nèi)容,所以將外部中斷的例程與按鍵控制實(shí)例

放在一起學(xué)習(xí)。

一開始先在51黑論壇率先上傳了本文,上傳時(shí)間不分什么順序,只是希望在學(xué)習(xí)中慢慢寫下自己的思路。

//======================================================//

/********************************************************/

因?yàn)樯婕暗膬?nèi)容較多,這里大體說一下整片文章的內(nèi)容分布:

1)、按鍵控制實(shí)例

1、按鍵的相關(guān)信息描述

2、按鍵的初始化代碼實(shí)現(xiàn)

3、常用按鍵檢測(cè)及控制代碼(主要學(xué)習(xí)其實(shí)現(xiàn)思路)

2)、外部中斷實(shí)例

1、外部中斷的相關(guān)信息描述

2、外部中斷的初始化代碼實(shí)現(xiàn)

/********************************************************/

==================================華麗的分界線=================================

//=========================按鍵控制實(shí)例=============================//

==================================華麗的分界線=================================

首先,先來講述簡(jiǎn)單的按鍵控制,下面來看看按鍵是什么東西,開發(fā)的時(shí)候按鍵又有哪些要注意的事情.

釋義:

按鍵開關(guān)是一種電子開關(guān),屬于電子元器件類,使用時(shí)以滿足操作力的條件向開關(guān)操作方向施壓開關(guān)功能閉合接通,當(dāng)撤銷壓力時(shí)開關(guān)即斷開,其內(nèi)部結(jié)構(gòu)是靠金屬彈片受力變化來實(shí)現(xiàn)通斷的。

一般在開發(fā)中涉及按鍵的一般是按鍵消抖。按鍵消抖通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開。也就是在閉合及斷開的那一瞬間會(huì)有一小段的不穩(wěn)定狀態(tài),即伴隨著連續(xù)的抖動(dòng)。按鍵在電路中一般也就0跟1兩中狀態(tài),正常情況下,按鍵沒有按下的情況下,按鍵所連的引腳狀態(tài)一般都是為1。原因是一般會(huì)在引腳上加上一個(gè)上拉,然后再與按鍵相連,按鍵的另一端接地,所以在按鍵沒有按下的情況下,引腳返回的一般都是高電平,這是電路決定的。如下圖:

按鍵的抖動(dòng)就是介于1跟0的不定狀態(tài)。所以為了取得穩(wěn)定狀態(tài),需要在延遲取狀態(tài)值,也就是既然知道有抖動(dòng)存在了,那么就把取值的時(shí)間延遲一下。還有一個(gè)東西跟抖動(dòng)有關(guān),那就是觸發(fā)沿的設(shè)置,比如上升沿和下降沿的觸發(fā)。上升沿是按鍵松開后那一瞬間,電平從0到1的過程,下降沿就與之相反,也就是按鍵按下的一瞬間,電平從1降為0的過程。邊沿觸發(fā)一般會(huì)用在外部中斷的過程中。下面的內(nèi)容也會(huì)講到。

按鍵相對(duì)來說比較簡(jiǎn)單,按鍵的初始化跟LED和BEEP蜂鳴器幾乎一致,不同之處也就在于按鍵是輸入設(shè)備,所以GPIO的模式上一般選為輸入模式,緊接著就要設(shè)置上拉/下拉輸入模式,最后設(shè)置初始狀態(tài),這個(gè)要根據(jù)電路來間接。

//=======================key.c===============================//

/************************************************

接口:

key0引腳接在 PE4 低電平有效

key1引腳接在 PE3 低電平有效

key_up引腳接在 PA0 高電平有效

************************************************/

#include "stm32f10x.h"

#include "key.h"

#include "delay.h"

void key_Init(void)

{

RCC ->APB2ENR |= 1 << 2;//使能 PORTA 時(shí)鐘

RCC ->APB2ENR |= 1 << 6;//使能 PORTE 時(shí)鐘

//key_up配置

GPIOA ->CRL &= ~(15 << 0);//先設(shè)置輸入模式

GPIOA ->CRL |= 1 << 3; //PA.0 下拉輸入模式

GPIOA ->ODR &= ~(1 << 0); //設(shè)置下拉,即設(shè)置初始狀態(tài)為低電平

//key1配置

GPIOE ->CRL &= ~(3 << 13);//先設(shè)置輸入模式

GPIOE ->CRL |= 1 << 15; //PE.3 上拉輸入模式

GPIOE ->ODR |= 1 << 3; //設(shè)置上拉,即設(shè)置初始狀態(tài)為高電平

//key0配置

GPIOE ->CRL &= ~(3 << 17);//先設(shè)置輸入模式

GPIOE ->CRL |= 1 << 19; //PE.4 上拉輸入模式

GPIOE ->ODR |= 1 << 4; //設(shè)置上拉,即設(shè)置初始狀態(tài)為高電平

}

/*************************************************************

**功 能:按鍵處理函數(shù)

**輸入?yún)?shù):無

**輸出參數(shù):

//mode:0,不支持連續(xù)按;1,支持連續(xù)按;

//0,沒有任何按鍵按下

//1,KEY0 按下

//2,KEY1 按下

//3,KEY_UP 按下 即 WK_UP

**注 釋:注意此函數(shù)有響應(yīng)優(yōu)先級(jí),KEY0>KEY1>KEY_UP!!

***********************************************************/

u8 KEY_Scan(u8 mode)

{

static u8 key_up=1; //按鍵按松開標(biāo)志

if(mode)key_up=1; //支持連按

if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))

{

delay_ms(10); //去抖動(dòng)

key_up=0;

if(KEY0==0)return 1;

else if(KEY1==0)return 2;

else if(WK_UP==1)return 3;

}

else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;

return 0;// 無按鍵按下

}

//======================================================//

注釋:按鍵檢測(cè)函數(shù),原理是檢測(cè)按鍵的電平,而mode的作用就是一直把key_up置1,那么就會(huì)一直進(jìn)入按鍵按下的檢測(cè),而不會(huì)進(jìn)入按鍵松開的檢測(cè)。

if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))這句是進(jìn)行按鍵按下的檢測(cè),

else if(KEY0==1&&KEY1==1&&WK_UP==0)這句是進(jìn)行按鍵松開的檢測(cè)。

如果沒有按鍵按下的話,雖然key_up為1,但是沒有按鍵,那么就只會(huì)返回0。

==================================華麗的分界線=================================

//===========================key.h===========================//

#ifndef __KEY_H_

#define __KEY_H_

#include "stm32f10x.h"

#include "sys.h"

#define KEY0 PEin(4) //PE4

#define KEY1 PEin(3) //PE3

#define WK_UP PAin(0) //PA0 WK_UP 即 KEY_UP

#define KEY0_PRES 1 //KEY0 按下

#define KEY1_PRES 2 //KEY1 按下

#define WKUP_PRES 3 //KEY_UP 按下(即 WK_UP/KEY_UP)

extern void key_Init(void);

extern u8 KEY_Scan(u8 mode);

#endif

//======================================================//

==================================華麗的分界線=================================

//==========================main.c============================//

/*************************************************************

**功 能:按鍵處理函數(shù)

//1,KEY0 按下 控制LED0

//2,KEY1 按下 控制LED1

//3,KEY_UP 按下 即 WK_UP 控制蜂鳴器

***********************************************************/

#include "stm32f10x.h"

#include "sys.h"

#include "delay.h"

#include "led.h"

#include "beep.h"

#include "key.h"

int main(void)

{

u8 key=0;

Stm32_Clock_Init(9); //系統(tǒng)時(shí)鐘設(shè)置

delay_init(72); //延時(shí)初始化

led_Init();//LED初始化

beep_Init(); //beep初始化

key_Init(); //key初始化

while(1)

{

key=KEY_Scan(0); //得到鍵值

if(key)

{

switch(key)

{

case WKUP_PRES: //控制蜂鳴器

GPIOB ->ODR |= (1 << 8);//PB.8 輸出高,即蜂鳴器開

delay_ms(10000);//延時(shí)

GPIOB ->ODR &= ~(1 << 8);//PB.8 輸出低,即蜂鳴器關(guān)

break;

case KEY1_PRES: //控制 LED1

GPIOB ->ODR &= ~ (1 << 5);//PB.5輸出低電平,即點(diǎn)亮LED

delay_ms(10000); //延時(shí)

GPIOB ->ODR |= 1 << 5;//PB.5輸出高電平,即滅掉LED

break;

case KEY0_PRES: //控制 LED0

GPIOE ->ODR &= ~(1 << 5);//PB.5輸出低電平,即點(diǎn)亮LED

delay_ms(10000); //延時(shí)

GPIOE ->ODR |= 1 << 5;//PB.5輸出高電平,即滅掉LED

break;

}

}

else delay_ms(10);

}

}

//======================================================//

==================================華麗的分界線=================================

//=========================外部中斷實(shí)例=============================//

**注釋:特別鳴謝CSDN博客的博主->“zzwdkxx”的博文,在外部中斷的學(xué)習(xí)中直接的幫助!

博文地址:http://blog.csdn.net/zzwdkxx/article/details/9036679

==================================華麗的分界線=================================

接著下面將進(jìn)行外部和中斷的講解,講之前先對(duì)中斷先做一定了解。

//============================百度搜索==========================//

簡(jiǎn)介:

中斷是處理器處理外部突發(fā)事件的一個(gè)重要技術(shù)。它能使處理器在運(yùn)行過程中對(duì)外部事件發(fā)出的中斷請(qǐng)求及時(shí)地進(jìn)行處理,處理完成后又立即返回?cái)帱c(diǎn),繼續(xù)進(jìn)行處理器原來的工作。引起中斷的原因或者說發(fā)出中斷請(qǐng)求的來源叫做中斷源。根據(jù)中斷源的不同,可以把中斷分為硬件中斷和軟件中斷兩大類,而硬件中斷又可以分為外部中斷和內(nèi)部中斷 兩類。

外部中斷一般是由計(jì)算機(jī)外設(shè)發(fā)出的中斷請(qǐng)指求,如:鍵盤中斷、打印機(jī)中斷、定時(shí)器中斷等。外部中斷是可以屏蔽的中斷,也就是說,利用中斷控制器可以屏蔽這些外部設(shè)備 的中斷請(qǐng)求。

內(nèi)部中斷是指因硬件出錯(cuò)(如突然掉電、奇偶校驗(yàn)錯(cuò)等)或運(yùn)算出錯(cuò)(除數(shù)為零、運(yùn)算溢出、單步中斷等)所引起的中斷。內(nèi)部中斷是不可屏蔽的中斷。

軟件中斷其實(shí)并不是真正的中斷,它們只是可被調(diào)用執(zhí)行的一般程序。

優(yōu)先級(jí):

CPU為了處理并發(fā)的中斷請(qǐng)求,規(guī)定了中斷的優(yōu)先權(quán),中斷優(yōu)先權(quán)由高到低的順序是: (1)除法錯(cuò)、溢出中斷、軟件中斷 (2)不可屏蔽

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開發(fā)中,STM32的時(shí)鐘系統(tǒng)因其靈活性和復(fù)雜性成為開發(fā)者關(guān)注的焦點(diǎn)。然而,看似簡(jiǎn)單的時(shí)鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時(shí)鐘源選擇、PLL配置、總線時(shí)鐘分配等關(guān)鍵環(huán)...

關(guān)鍵字: STM32 時(shí)鐘系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測(cè)等場(chǎng)景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準(zhǔn)算法、軟...

關(guān)鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅(qū)動(dòng)下,AC-DC轉(zhuǎn)換器的數(shù)字控制技術(shù)正經(jīng)歷從傳統(tǒng)模擬方案向全數(shù)字架構(gòu)的深刻變革。基于STM32微控制器的PFM(脈沖頻率調(diào)制)+PWM(脈沖寬度調(diào)制)混合調(diào)制策略,結(jié)合動(dòng)態(tài)電壓調(diào)整(Dynam...

關(guān)鍵字: AC-DC STM32

當(dāng)前智能家居產(chǎn)品需求不斷增長(zhǎng) ,在這一背景下 ,對(duì)現(xiàn)有澆花裝置缺陷進(jìn)行了改進(jìn) ,設(shè)計(jì)出基于STM32單片機(jī)的全 自動(dòng)家用澆花機(jī)器人。該設(shè)計(jì)主要由機(jī)械結(jié)構(gòu)和控制系統(tǒng)構(gòu)成 ,機(jī)械結(jié)構(gòu)通過麥克納姆輪底盤與噴灑裝置的結(jié)合實(shí)現(xiàn)機(jī)器...

關(guān)鍵字: STM32 麥克納姆輪 安全可靠 通過性強(qiáng)

用c++編程似乎是讓你的Arduino項(xiàng)目起步的障礙嗎?您想要一種更直觀的微控制器編程方式嗎?那你需要了解一下Visuino!這個(gè)圖形化編程平臺(tái)將復(fù)雜電子項(xiàng)目的創(chuàng)建變成了拖動(dòng)和連接塊的簡(jiǎn)單任務(wù)。在本文中,我們將帶您完成使...

關(guān)鍵字: Visuino Arduino ESP32 STM32

基于STM32與LoRa技術(shù)的無線傳感網(wǎng)絡(luò)憑借其低功耗、廣覆蓋、抗干擾等特性,成為環(huán)境監(jiān)測(cè)、工業(yè)自動(dòng)化等場(chǎng)景的核心解決方案。然而,如何在復(fù)雜電磁環(huán)境中實(shí)現(xiàn)高效休眠調(diào)度與動(dòng)態(tài)信道優(yōu)化,成為提升網(wǎng)絡(luò)能效與可靠性的關(guān)鍵挑戰(zhàn)。本...

關(guān)鍵字: STM32 LoRa

在實(shí)時(shí)控制系統(tǒng)、高速通信協(xié)議處理及高精度數(shù)據(jù)采集等對(duì)時(shí)間敏感的應(yīng)用場(chǎng)景中,中斷響應(yīng)延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內(nèi)存訪問(DMA)...

關(guān)鍵字: STM32 DMA

數(shù)字電源技術(shù)向高功率密度、高效率與高動(dòng)態(tài)響應(yīng)方向加速演進(jìn),STM32微控制器憑借其基于DSP庫的算法加速能力與對(duì)LLC諧振變換器的精準(zhǔn)控制架構(gòu),成為優(yōu)化電源動(dòng)態(tài)性能的核心平臺(tái)。相較于傳統(tǒng)模擬控制或通用型數(shù)字控制器,STM...

關(guān)鍵字: STM32 數(shù)字電源

STM32微控制器憑借其針對(duì)電機(jī)控制場(chǎng)景的深度優(yōu)化,成為高精度、高可靠性驅(qū)動(dòng)系統(tǒng)的核心選擇。相較于通用型MCU,STM32在電機(jī)控制領(lǐng)域的核心優(yōu)勢(shì)集中體現(xiàn)在FOC(磁場(chǎng)定向控制)算法的硬件加速引擎與PWM死區(qū)時(shí)間的動(dòng)態(tài)補(bǔ)...

關(guān)鍵字: STM32 電機(jī)控制

無線充電技術(shù)加速滲透消費(fèi)電子與汽車電子領(lǐng)域,基于Qi協(xié)議的無線充電發(fā)射端開發(fā)成為智能設(shè)備能量補(bǔ)給的核心課題。傳統(tǒng)模擬控制方案存在響應(yīng)滯后、參數(shù)調(diào)整困難等問題,而基于STM32的數(shù)字PID控制結(jié)合FOD(Foreign O...

關(guān)鍵字: STM32 無線充電
關(guān)閉