日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|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、常用按鍵檢測及控制代碼(主要學(xué)習(xí)其實(shí)現(xiàn)思路)

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

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

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

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

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

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

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

首先,先來講述簡單的按鍵控制,下面來看看按鍵是什么東西,開發(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ì)講到。

按鍵相對來說比較簡單,按鍵的初始化跟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)先級,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;// 無按鍵按下

}

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

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

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

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

如果沒有按鍵按下的話,雖然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)行外部和中斷的講解,講之前先對中斷先做一定了解。

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

簡介:

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

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

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

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

優(yōu)先級:

CPU為了處理并發(fā)的中斷請求,規(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)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

嵌入式系統(tǒng)的算法效率與硬件資源的平衡是核心挑戰(zhàn)。STM32微控制器通過零開銷循環(huán)機(jī)制與DWT計(jì)數(shù)器的結(jié)合,為算法優(yōu)化提供了硬件級支持。本文以插入排序算法為例,探討如何利用STM32的硬件特性驗(yàn)證排序閾值,實(shí)現(xiàn)性能與代碼復(fù)...

關(guān)鍵字: STM32 DWT

智能家居與工業(yè)控制場景,手勢識(shí)別作為非接觸式交互的核心技術(shù),正從實(shí)驗(yàn)室走向消費(fèi)級應(yīng)用。以STM32F407VET6微控制器與TensorFlow Lite Micro框架的組合為例,通過模型量化、硬件加速與低功耗設(shè)計(jì),可...

關(guān)鍵字: STM32 TensorFlow

在高性能電機(jī)驅(qū)動(dòng)的“納秒級戰(zhàn)爭”中,浮點(diǎn)運(yùn)算單元(FPU)往往成為制約控制環(huán)帶寬的阿喀琉斯之踵。當(dāng)PWM載波頻率攀升至100kHz,留給電流環(huán)PID、Clarke/Park變換及SVPWM計(jì)算的時(shí)間窗口僅剩寥寥數(shù)微秒。此...

關(guān)鍵字: 電機(jī)控制算法 FOC磁場 STM32

在工業(yè)控制、電機(jī)驅(qū)動(dòng)等實(shí)時(shí)性要求嚴(yán)苛的場景中,中斷響應(yīng)延遲直接影響系統(tǒng)精度與穩(wěn)定性。STM32系列微控制器憑借Cortex-M內(nèi)核的硬件特性,通過合理的系統(tǒng)架構(gòu)設(shè)計(jì)可實(shí)現(xiàn)微秒級中斷響應(yīng)。本文從硬件配置、中斷處理、代碼優(yōu)化...

關(guān)鍵字: 裸機(jī)開發(fā) STM32

在工業(yè)控制、音頻處理等高性能嵌入式場景中,某電機(jī)驅(qū)動(dòng)項(xiàng)目通過混合使用寄存器操作與CMSIS-DSP庫,將PID控制周期從120μs縮短至38μs,系統(tǒng)響應(yīng)速度提升3倍。本文將揭秘這種"底層+高層"混合編程模式的核心技巧。

關(guān)鍵字: HAL STM32 寄存器

嵌入式系統(tǒng)開發(fā)手勢識(shí)別作為非接觸式人機(jī)交互的核心技術(shù),正從實(shí)驗(yàn)室走向消費(fèi)級應(yīng)用。然而,傳感器采集的原始信號常因電磁干擾、電源噪聲或機(jī)械抖動(dòng)產(chǎn)生失真,導(dǎo)致識(shí)別準(zhǔn)確率下降。本文以STM32微控制器與PAJ7620手勢識(shí)別傳感...

關(guān)鍵字: STM32 手勢識(shí)別 噪聲

在物聯(lián)網(wǎng)設(shè)備開發(fā)中,快速實(shí)現(xiàn)穩(wěn)定可靠的網(wǎng)絡(luò)通信是項(xiàng)目成功的關(guān)鍵。W5500作為一款集成硬件TCP/IP協(xié)議棧的以太網(wǎng)控制器,憑借其"開箱即用"的特性,可大幅縮短STM32平臺(tái)的網(wǎng)絡(luò)功能開發(fā)周期。本文通...

關(guān)鍵字: STM32 W5500

工業(yè)物聯(lián)網(wǎng)設(shè)備開發(fā)中,某智能電表項(xiàng)目曾因ADC采樣中斷響應(yīng)延遲導(dǎo)致數(shù)據(jù)丟失率高達(dá)15%。技術(shù)人員通過重構(gòu)DMA驅(qū)動(dòng)架構(gòu),將數(shù)據(jù)搬運(yùn)效率提升12倍,CPU占用率從38%降至3%,成功解決高速采樣場景下的實(shí)時(shí)性難題。這一案例...

關(guān)鍵字: STM32 DMA

工業(yè)機(jī)器人關(guān)節(jié)控制系統(tǒng)中,一個(gè)典型的伺服驅(qū)動(dòng)器需要在100μs周期內(nèi)完成電流采樣、位置反饋、PID計(jì)算和PWM輸出等12項(xiàng)關(guān)鍵任務(wù)。當(dāng)傳統(tǒng)固定優(yōu)先級調(diào)度導(dǎo)致機(jī)械臂出現(xiàn)0.3°的位置抖動(dòng)時(shí),某運(yùn)動(dòng)控制廠商通過引入混合排序算...

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

在STM32嵌入式系統(tǒng)開發(fā)中,排序算法的效率直接影響傳感器數(shù)據(jù)處理、通信協(xié)議解析等核心任務(wù)的實(shí)時(shí)性。傳統(tǒng)快速排序在部分有序數(shù)據(jù)場景下易退化為O(n2)時(shí)間復(fù)雜度,而單純依賴三數(shù)取中法優(yōu)化基準(zhǔn)值選擇仍存在小規(guī)模數(shù)據(jù)效率不足...

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