国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

安富萊 STM32 按鍵檢測(cè)

發(fā)布者:Xiaohan521最新更新時(shí)間:2025-02-05 來源: jianshu關(guān)鍵字:安富萊  STM32  按鍵檢測(cè) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

最近看了安富萊的按鍵檢測(cè)程序,支持短按,長按,連續(xù)觸發(fā)和組合按鍵。內(nèi)部采用 FIFO 來保存觸發(fā)的按鍵,保證按鍵觸發(fā)不丟失,安富萊的程序穩(wěn)定,可擴(kuò)展性強(qiáng),可以在實(shí)際工程中使用。以下記錄一些使用上要注意的方面。
在 bsp_key.h 里:

#define KEY_COUNT    2                  /* 按鍵個(gè)數(shù), 2個(gè)獨(dú)立建*/


KEY_COUNT 代表 '實(shí)際按鍵數(shù) + 組合按鍵數(shù)'。

/*

   按鍵濾波時(shí)間50ms, 單位10ms。

   只有連續(xù)檢測(cè)到50ms狀態(tài)不變才認(rèn)為有效,包括彈起和按下兩種事件

   即使按鍵電路不做硬件濾波,該濾波機(jī)制也可以保證可靠地檢測(cè)到按鍵事件

*/

#define KEY_FILTER_TIME   5

#define KEY_LONG_TIME     100           /* 單位10ms, 持續(xù)1秒,認(rèn)為長按事件 */


因?yàn)榘存I檢測(cè)目前是以 10ms 為一周期,所以上述值的單位都為 10ms 。其中 KEY_FILTER_TIME 為濾波的時(shí)間,按下濾波時(shí)間和彈起濾波時(shí)間一致。KEY_LONG_TIME 為按下按鍵之后觸發(fā)“長按”的時(shí)間,只有觸發(fā)長按之后才可以進(jìn)行“連續(xù)觸發(fā)'。

每個(gè)按鍵的數(shù)據(jù)結(jié)構(gòu)如下:

typedef struct{
    /* 下面是一個(gè)函數(shù)指針,指向判斷按鍵手否按下的函數(shù) */
    uint8_t (*IsKeyDownFunc)(void); /* 按鍵按下的判斷函數(shù),1表示按下 */

    uint8_t  Count;         /* 濾波器計(jì)數(shù)器 */
    uint16_t LongCount;     /* 長按計(jì)數(shù)器 */
    uint16_t LongTime;      /* 按鍵按下持續(xù)時(shí)間, 0表示不檢測(cè)長按 */
    uint8_t  State;         /* 按鍵當(dāng)前狀態(tài)(按下還是彈起) */
    uint8_t  RepeatSpeed;   /* 連續(xù)按鍵周期 */
    uint8_t  RepeatCount;   /* 連續(xù)按鍵計(jì)數(shù)器 */}KEY_T;

函數(shù)指針 IsKeyDownFunc 根據(jù)實(shí)際硬件環(huán)境調(diào)整,內(nèi)部實(shí)現(xiàn)需保證按下按鈕后返回 1 。
Count 是一個(gè)濾波計(jì)數(shù)器,用來判斷濾波時(shí)間是否到達(dá),供內(nèi)部使用。
LongCount 是一個(gè)長按計(jì)數(shù)器,用來判斷觸發(fā)”長按“的時(shí)間是否到達(dá),供內(nèi)部使用。
LongTime 即按下按鍵后觸發(fā)”長按“的時(shí)間,默認(rèn)為 KEY_LONG_TIME 。為 0 則代表不支持長按。
State 為按鍵當(dāng)前狀態(tài),1 為按下,0 為未按下。
RepeatSpeed 為”連續(xù)觸發(fā)“按鍵的周期,以 10ms 為單位,原因同上。
RepeatCount 為”連續(xù)觸發(fā)'的計(jì)數(shù)器,供內(nèi)部使用。

使用的 FIFO 數(shù)據(jù)結(jié)構(gòu)如下:

/* 按鍵FIFO用到變量 */

#define KEY_FIFO_SIZE   10

typedef struct

{

    uint8_t Buf[KEY_FIFO_SIZE];     /* 鍵值緩沖區(qū) */

    uint8_t Read;                   /* 緩沖區(qū)讀指針1 */

    uint8_t Write;                  /* 緩沖區(qū)寫指針 */

    uint8_t Read2;                  /* 緩沖區(qū)讀指針2 */

}KEY_FIFO_T;


這就是一個(gè)簡(jiǎn)單的 FIFO 隊(duì)列,其中 Read2 的作用還理解的不是很清楚。

以下為提供 API :

/* 供外部調(diào)用的函數(shù)聲明 */

void bsp_InitKey(void);

void bsp_KeyScan(void);

void bsp_PutKey(uint8_t _KeyCode);

uint8_t bsp_GetKey(void);

uint8_t bsp_GetKey2(void);

uint8_t bsp_GetKeyState(KEY_ID_E _ucKeyID);

void bsp_SetKeyParam(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t  _RepeatSpeed);

void bsp_ClearKey(void);


void bsp_InitKey(void) 需要在最開始調(diào)用。

void bsp_KeyScan(void) 需要周期性調(diào)用,一般放在 SysTick 中斷函數(shù)里每 10ms 調(diào)用一次。

void bsp_PutKey(uint8_t _KeyCode) 為向 FIFO 里存入當(dāng)前的鍵值(即哪一個(gè)按鍵的哪一個(gè)狀態(tài))。

uint8_t bsp_GetKey(void) 為從 FIFO 里讀取下一個(gè)鍵值并返回。

uint8_t bsp_GetKey2(void) 也是從 FIFO 里讀取下一個(gè)鍵值并返回,不過它的指針是 Read2 ,具體用處還不知,一般可以不用。

uint8_t bsp_GetKeyState(KEY_ID_E _ucKeyID) 得到指定按鍵當(dāng)前的狀態(tài),1 表按下,0 表為按下。

void bsp_SetKeyParam(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t  _RepeatSpeed) 為修改指定按鍵的一些參數(shù), _LongTime 為按下后觸發(fā)”長按“的時(shí)間, _RepeatSpeed 為”連續(xù)按鍵“的周期。

void bsp_ClearKey(void) 清除 FIFO 里的所有鍵值。

該代碼需要根據(jù)具體的硬件環(huán)境移植,不過難度不大,安富萊提供了 STM32F103 標(biāo)準(zhǔn)庫的版本和 STM32F407 HAL庫的 bsp 版本,使用起來差不多,不過移植不一樣。


當(dāng)然,該代碼里有一個(gè)隱藏的 BUG,如果你一直往 FIFO 里面填充數(shù)據(jù),而不讀出來的話,考慮以下情況:
若大小為 10 的 FIFO 緩存空間,Read 指向 0,Write 指向 9,若此時(shí)再填充一個(gè)數(shù)據(jù),則 Write 為 0。而判斷 FIFO 內(nèi)是否有數(shù)據(jù)使用的是 Read != Write,所以有一點(diǎn)小問題。只要保證及時(shí)把數(shù)據(jù)讀出來就問題不大。


關(guān)鍵字:安富萊  STM32  按鍵檢測(cè) 引用地址:安富萊 STM32 按鍵檢測(cè)

上一篇:STM32 虛擬U盤
下一篇:STM32入門項(xiàng)目筆記

推薦閱讀最新更新時(shí)間:2025-06-27 09:35

STM32:串口多級(jí)緩沖接收
本文是基于STM32G431的LL庫做的,針對(duì)裸機(jī)的串口接收和發(fā)送庫。其中UART接收采用DMA+idle中斷+多級(jí)緩沖模式。 1. 結(jié)構(gòu)體 先創(chuàng)建幾個(gè)必要的結(jié)構(gòu)體 typedef struct uart_rx { uint8_t mode; uint8_t *buf; /* poniter to receive buf */ uint16_t size; uint32_t wr_index; uint32_t rd_index; FlagStatus cplt_flag; #ifdef UART_RX_MODE_DMA DMA_TypeDef *dma; uint32_t dma_c
[單片機(jī)]
ST發(fā)布“史上最強(qiáng)”STM32:STM32N6如何讓邊緣AI隨處可見?
隨著邊緣AI的大火,Tiny ML和NPU MCU也跟著火了起來。早在2022年,ST就曾宣布,STM32N6將成為ST首個(gè)加入NPU的產(chǎn)品,很多工程師也對(duì)這一產(chǎn)品翹首以盼。 在STM32峰會(huì)上,STM32N6正式亮相。“我們對(duì)于STM32N6的定義是首款具有 AI 加速能力的高性能的STM32 MCU?!痹谌涨暗腟TM32媒體溝通會(huì)上,意法半導(dǎo)體中國區(qū)微控制器、數(shù)字 IC 與射頻產(chǎn)品部 (MDRF) 微控制器產(chǎn)品市場(chǎng)經(jīng)理丁曉磊 (Lisa DING)如是說。 有史以來功能最強(qiáng)大的STM32系列 “STM32N6是目前為止所有STM32芯片中性能最強(qiáng)的產(chǎn)品。”丁曉磊在會(huì)議上這樣介紹到。從STM32家族中來看,S
[單片機(jī)]
ST發(fā)布“史上最強(qiáng)”<font color='red'>STM32</font>:STM32N6如何讓邊緣AI隨處可見?
《嵌入式-STM32開發(fā)指南》第一部分 入門篇 - 第7章 STM32固件庫與STM32Cube產(chǎn)品介紹
自STM32標(biāo)準(zhǔn)庫出道以來,備受廣大工程師和公司的喜愛,但是,從2013年開始,ST逐漸停止了對(duì)標(biāo)準(zhǔn)外設(shè)庫的更新和維護(hù)。目前,ST全力推崇HAL庫,STM32Cube就是與HAL庫配合使用圖形化編程官方IDE。 7.1 STM32庫簡(jiǎn)介 到目前為止,ST有標(biāo)準(zhǔn)外設(shè)庫(SPL 庫)、HAL 庫、LL 庫 三種。前兩者都是常用的庫,后面的 LL 庫是 ST 最近才添加,隨 HAL 源碼包一起提供,目前支持的芯片也偏少。各庫如下所示: 圖1 標(biāo)準(zhǔn)庫、HAL 庫、LL 庫對(duì)比.png 其中,SPL 庫 和 HAL 庫兩者相互獨(dú)立,互不兼容。幾種庫的比較如下: 圖2各個(gè)庫對(duì)比.png 目前幾種庫對(duì)不同芯片的支持情況如下: 圖
[單片機(jī)]
stm32 mmc卡掃描指定文件夾下的所有文件 串口輸出(文件名長度有限制)
硬件環(huán)境:神州一號(hào)開發(fā)板 軟件環(huán)境:mdk 1、sd卡初始化 2、f_mount 3、掃描函數(shù)如下: #define _USE_LFN 0 FRESULT scan_files (char* path) { FRESULT res; FILINFO fno; DIR dir; int i; char *fn; #if _USE_LFN static char lfn ; fno.lfname = lfn; fno.lfsize = sizeof(lfn); #endif res = f_opendir(&dir, path); if (res == FR_OK) { i = strl
[單片機(jī)]
stm32 CAN總線例子
利用stm32實(shí)現(xiàn)了1個(gè)簡(jiǎn)單的CAN功能,使用了隊(duì)列緩存 can.c 文件 #include includes.h #define GPIO_CAN GPIOB #define RCC_APB2Periph_GPIO_CAN RCC_APB2Periph_GPIOB #define GPIO_Pin_RX GPIO_Pin_8 #define GPIO_Pin_TX GPIO_Pin_9 #define GPIO_Remap_CAN GPIO_Remap1_CAN1 #define MAX_MAIL_NUM 3 static u8 CAN_msg_num ; //
[單片機(jī)]
stm32怎么讀取io口輸入電平
要讀取STM32的IO口輸入電平,你可以使用GPIO外設(shè)來完成。GPIO是通用輸入輸出端口,它可以配置成輸入模式,用于讀取外部信號(hào)的電平。 首先,你需要定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體變量,用于配置GPIO的相關(guān)參數(shù)。這個(gè)結(jié)構(gòu)體包含了GPIO端口號(hào)、模式、速度、上拉下拉等參數(shù)。 接下來,你需要使用HAL庫中的HAL_GPIO_Init()函數(shù)來初始化GPIO端口。這個(gè)函數(shù)會(huì)使用結(jié)構(gòu)體中定義的參數(shù)來配置相應(yīng)的GPIO端口。 GPIO_InitTypeDef GPIO_InitStruct; // 配置GPIO端口 GPIO_InitStruct.Pin = GPIO_PIN_0; // 設(shè)置GPI
[單片機(jī)]
STM32 GPIO 寄存器的配置
配置每組IO口的寄存器:(每一組一套寄存器) 1、兩個(gè)32位的配置寄存器;GPIOx_CRL,GPIOx_CRH 2、兩個(gè)32位的數(shù)據(jù)寄存器:GPIOx_IDR,GPIOx_ODR 3、一個(gè)32位置位/復(fù)位寄存器:GPIOx_BSRR 4、一個(gè)16位的復(fù)位寄存器GPIOx_BRR 5、一個(gè)32位的鎖定寄存器GPIOx_LCKR 詳解 : CRL和CRH控制IO口,是四個(gè)位控制一個(gè)口,所以要兩個(gè)32位的來控制16個(gè)口 1、GPIOx_CRL:端口配置低寄存器: 每個(gè)口由四位控制,為MODE+CNF聯(lián)合配置,具體模式在下圖中。(輸入要與輸入對(duì)應(yīng),輸出也要與輸出對(duì)應(yīng)) 具體對(duì)應(yīng)輸入輸出配置表(對(duì)上圖的詳解): 2、GPIOx_
[單片機(jī)]
<font color='red'>STM32</font> GPIO 寄存器的配置
STM32單片機(jī)的原理、特性和應(yīng)用
STM32單片機(jī) 由ST廠商推出的STM32系列單片機(jī),行業(yè)的朋友都知道,這是一款性價(jià)比超高的系列單片機(jī),應(yīng)該沒有之一,功能及其強(qiáng)大。其基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計(jì)的ARM Cortex-M內(nèi)核,同時(shí)具有一流的外設(shè):1μs的雙12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表現(xiàn),當(dāng)然和MSP430的功耗比起來是稍微遜色的一些,但這并不影響工程師們對(duì)它的熱捧程度,由于其簡(jiǎn)單的結(jié)構(gòu)和易用的工具再配合其強(qiáng)大的功能在行業(yè)中赫赫有名…其強(qiáng)大的功能主要表現(xiàn)在: 特性: 1.內(nèi)核:ARM32位Cortex-M3CPU,最高工作頻率72MHz,1.25DMIPS/MHz,單周
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved