娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年03月25日(星期二)

正在發生

2019年03月25日 | STM32CubeMX學習教程之三:GPIO輸入之利用SysTick中斷給按鍵去抖

發布者:美人如玉劍如虹 來源: eefocus關鍵字:STM32CubeMX  GPIO輸入  SysTick中斷  按鍵去抖 手機看文章 掃描二維碼
隨時隨地手機看文章

本文主要討論軟件去抖。實現方法是通過SysTick中斷每1ms對按鍵進行掃描,當檢測到連續的穩定無抖動電平信號(長度可設置)之后,才進行相應的邏輯操作。


軟件版本:

STM32CubeMX V4.25.0  

System Workbench V2.4


硬件:OneNet 麒麟座V2.3


在STM32CubeMX中新建項目,選擇正確的MCU型號


然后設置RCC和SYS,然后根據板子實際情況設置時鐘(麒麟座外部晶振是12M,STM32F103x的最高主頻是72M)

然后設置GPIO_Output (連接到LED) 和GPIO_Input(連接到按鍵)。注意上一篇文章里面按鍵連接的引腳設置為外部中斷模式,這里只需要設置為GPIO_Input就可以了。


GPIO_Output的具體設置如下:

GPIO_Input設置如下

這里按鍵我用了SW1/2/3/4。


同樣修改


Project - setting ,ToolChain/IDE選擇 SW4STM32


還要勾選這里


然后生成代碼,打開項目。


編輯stm32f1xx_it.h,函數聲明那里增加一行 :


 


void Key_Scan(void);


然后編輯stm32f1xx_it.c 增加如下代碼:


/* USER CODE BEGIN 0 */

uint8_t sw1Count,sw2Count,sw3Count,sw4Count;

uint8_t pushFlag1,pushFlag2,pushFlag3,pushFlag4;

extern uint8_t swState1,swState2,swState3,swState4;

 void Key_Scan(void)

{

         /*檢測SW1是否按下 */

         if(   HAL_GPIO_ReadPin(SW1_GPIO_Port,SW1_Pin) == GPIO_PIN_RESET )

         {

                 sw1Count++;                         //SW1鍵按下,計數sw1Count加1

                 if(sw1Count>=32)                    //1MS中斷一次,sw1Count大于等于32,即按鍵已按下32ms

                 {

                         if(pushFlag1==0)                //判斷有沒有重按鍵,1為有,0為沒有

                        {

                        swState1=1;                       //設置按鍵標志

                        sw1Count=0;

                        pushFlag1=1;                     //設置重按鍵標志

                        }

                        else

                        sw1Count=0;

                 }

                 else

                    swState1=0;

 

         }

         else                                            //無按鍵按下

         {

                 sw1Count=0;                           //清零sw1Count

                 swState1=0;                            //清除按鍵標志

                 pushFlag1=0;                          //清除重按鍵標志

         }

 

         /*檢測SW2是否按下 */

         if(   HAL_GPIO_ReadPin(SW2_GPIO_Port,SW2_Pin) == GPIO_PIN_RESET )

         {

                 sw2Count++;                         //SW2鍵按下,計數sw2Count加1

                 if(sw2Count>=32)                    //1MS中斷一次,sw2Count大于等于32,即按鍵已按下32ms

                 {

                         if(pushFlag2==0)                //判斷有沒有重按鍵,1為有,0為沒有

                        {

                        swState2=1;                       //設置按鍵標志

                        sw2Count=0;

                        pushFlag2=1;                     //設置重按鍵標志

                        }

                        else

                        sw2Count=0;

                 }

                 else

                    swState2=0;

 

         }

         else                                            //無按鍵按下

         {

                 sw2Count=0;                           //清零sw2Count

                 swState2=0;                            //清除按鍵標志

                 pushFlag2=0;                          //清除重按鍵標志

         }

 

         /*檢測SW3是否按下 */

         if(   HAL_GPIO_ReadPin(SW3_GPIO_Port,SW3_Pin) == GPIO_PIN_RESET )

         {

                 sw3Count++;                         //SW3鍵按下,計數sw3Count加1

                 if(sw3Count>=32)                    //1MS中斷一次,sw3Count大于等于32,即按鍵已按下32ms

                 {

                         if(pushFlag3==0)                //判斷有沒有重按鍵,1為有,0為沒有

                        {

                        swState3=1;                       //設置按鍵標志

                        sw3Count=0;

                        pushFlag3=1;                     //設置重按鍵標志

                        }

                        else

                        sw3Count=0;

                 }

                 else

                    swState3=0;

 

         }

         else                                            //無按鍵按下

         {

                 sw3Count=0;                           //清零sw3Count

                 swState3=0;                            //清除按鍵標志

                 pushFlag3=0;                          //清除重按鍵標志

         }

 

         /*檢測SW4是否按下 */

         if(   HAL_GPIO_ReadPin(SW4_GPIO_Port,SW4_Pin) == GPIO_PIN_RESET )

         {

                 sw4Count++;                         //SW4鍵按下,計數sw4Count加1

                 if(sw4Count>=32)                    //1MS中斷一次,sw4Count大于等于32,即按鍵已按下32ms

                 {

                         if(pushFlag4==0)                //判斷有沒有重按鍵,1為有,0為沒有

                        {

                        swState4=1;                       //設置按鍵標志

                        sw4Count=0;

                        pushFlag4=1;                     //設置重按鍵標志

                        }

                        else

                        sw4Count=0;

                 }

                 else

                    swState4=0;

 

         }

         else                                            //無按鍵按下

         {

                 sw4Count=0;                           //清零sw4Count

                 swState4=0;                            //清除按鍵標志

                 pushFlag4=0;                          //清除重按鍵標志

         }

 

}

/* USER CODE END 0 */

然后在SysTick中斷處理函數增加一行 void Key_Scan(void);, 代碼如下:


/**

* @brief This function handles System tick timer.

*/

void SysTick_Handler(void)

{

  /* USER CODE BEGIN SysTick_IRQn 0 */

Key_Scan();

  /* USER CODE END SysTick_IRQn 0 */

  HAL_IncTick();

  HAL_SYSTICK_IRQHandler();

  /* USER CODE BEGIN SysTick_IRQn 1 */

 

  /* USER CODE END SysTick_IRQn 1 */

}

 在gpio.c 中增加如下兩處代碼:


/* USER CODE BEGIN 1 */

GPIO_TypeDef* GPIO_PORT[] = {LED1_GPIO_Port,

                             LED2_GPIO_Port,

     LED3_GPIO_Port,

     LED4_GPIO_Port};

 

const uint16_t GPIO_PIN[] = {LED1_Pin,

     LED2_Pin,

                             LED3_Pin,

     LED4_Pin};

 

/* USER CODE END 1 */

/* USER CODE BEGIN 2 */

void LED_Toggle(Led_TypeDef Led)

{

HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);

}

 

/* USER CODE END 2 */

然后編輯main.c,增加如下兩處代碼:


/* USER CODE BEGIN 0 */

uint8_t swState1,swState2,swState3,swState4;

/* USER CODE END 0 */

 /* USER CODE BEGIN WHILE */

  while (1)

  {

  if  ( swState1 == 1 )

  {

  LED_Toggle(LED1);

//   HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);

  HAL_Delay(1);

  }

  if  ( swState2 == 1 )

  {

  LED_Toggle(LED2);

//   HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);

  HAL_Delay(1);

  }

  if  ( swState3 == 1 )

  {

  LED_Toggle(LED3);

//   HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);

  HAL_Delay(1);

  }

  if  ( swState4 == 1 )

  {

  LED_Toggle(LED4);

//   HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_Pin);

  HAL_Delay(1);

  }

  /* USER CODE END WHILE */

注意 如下兩個語句是等效的,我注釋掉了HAL_GPIO_TogglePin()。因為我們使用枚舉重新定義了LED狀態切換的函數LED_Toggle()。


1.   LED_Toggle(LED1);  

2.   HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);

 


然后右鍵點擊項目,選擇Properties, Run-Debug Settings, 點擊右側的New,在彈出對話框中選擇Ac6 STM32 Debugging。

然后任務欄上點擊Run圖,當然會報錯的,原因請查看另一篇我的博客(https://blog.csdn.net/toopoo/article/details/79680323),所以需要右鍵點擊  項目名Run.cfg ,給它改個名字,


然后右鍵點擊項目樹里面的項目名稱,選擇“Propeties”,然后在Run/Debug Settings-選擇項目名-Edit-Main-C/C++Application那里點擊“Search Project”,然后選擇出現的默認的elf文件:

然后在Debugger-User Defined-Browse 那里選擇你自己改名的配置文件:

然后右鍵點擊那個新的cfg文件,選擇"Open With - Text Editor", 進行如下更改:


source [find interface/stlink.cfg] 更改為 source [find interface/stlink-v2.cfg]


reset_config srst_only srst_nogate connect_assert_srst 這一行改為 reset_config none 


然后再Run一下,就可以了。


 


就實現四個按鍵分別控制LED的開關切換并實現了軟件去抖,不會產生誤動作了。

關鍵字:STM32CubeMX  GPIO輸入  SysTick中斷  按鍵去抖 引用地址:STM32CubeMX學習教程之三:GPIO輸入之利用SysTick中斷給按鍵去抖

上一篇:STM32F407 串口接收中斷的使用
下一篇:STM32Cube-定時器中斷

推薦閱讀

據海外媒體報道,白宮稱美國總統特朗普將在當地時間3月22日12:30(北京時間3月23日00:30)簽署一份針對中國貿易的總統行政備忘錄,其中將可能涉及數百億美元的關稅和投資限制。這一消息引發了各界對于“貿易戰”的擔憂。白宮副新聞發言人沙阿(Raj Shah)21日稱:“明天總統(特朗普)將基于美國貿易代表辦公室對中國進行‘301調查’的結果,宣布他決定采...
OPPO已經確認會在4月10日發布新機OPPO Reno,也是幾年來OPPO首次單獨打造全新的系列產品,因此獲得了不少網友的關注?! ∽蛱?,OPPO副總裁沈義人表示,SuperVOOC超級閃充對于電池體質和元器件的空間都有特別需求。Reno在大電池長續航和超級閃充中選擇了大電池長續航?! ∷€表示,VOOC3.0運用了全新技術,在2.0功率不變的前提下充電總時長...
3月24日,國家電網公司網站發布了“國家電網公司發布進一步支持和推進增量配電業務改革的意見”,業內為之一振,紛紛點贊國家電網公司的責任和擔當。該意見的發布,對于當前增量配電的推進工作無疑有積極作用。同時,仍然不能過分樂觀該意見發揮的功效。 該意見的積極作用 (1)對于合理配電價格機制的推動作用 配電價格機制能否產生合理收益是目前...
隨著2021年的到來,政府領導者仍將面臨疫情及其后果所帶來的不斷變化的挑戰。為了應對這些挑戰、并在面臨成本削減壓力的情況下保持數字創新步伐,政府首席信息官和信息領導者必須將不斷擴大的關鍵業務優先事項與長期技術和信息(I&T)投資相聯系。在此背景下,Gartner評估了2021年推動政府政策和實踐的公共行政趨勢。 疫情所引發的變革讓人們進一步認識到...

史海拾趣

問答坊 | AI 解惑

基于Web的嵌入式設備管理

隨著互聯網絡硬件、軟件的迅猛發展,嵌入式系統被廣泛應用到工作和生活的各個領域中,如何對這些設備進行治理成為嵌入式系統軟件開發中的一個重要方面。用戶只有通過設備所提供的治理接口對共進行配置、治理和監控,因些治理接易用程度和效率成為衡 ...…

查看全部問答∨

NXP LPC1343 開發板 學習之旅(二)

       在開始我的學習之旅第二篇之前,先來點題外話,今天下午,soso姐給我發了版主tiankai001的一篇帖子,讀起來感覺有點心酸啊。。。版主辛辛苦苦奮斗數載,打造良帖無數,怎奈看貼多數,回復寥寥。。。一股悲情 ...…

查看全部問答∨

請問A/D的輸入電壓范圍與參考電壓的關系?

1. 比如C8051F350,它的內部參考電壓為2.5V,如果我要測量的模擬電壓范圍是0~5V,那不是超過了量程? 2. 比如ADS1211,它的輸入模擬電壓范圍好像與A/D的增益因數有關系,還與參考電壓Vref,偏置電壓Vbias 有關系?       …

查看全部問答∨

315avr自制活動正在開展,已出原理圖,歡迎積極參與

315avr自制活動正在開展,已出原理圖,歡迎積極參與... 1. 自制\"M16/32標準學習開發板\"活動主題貼地址:http://www.315avr.com/bbs/dispbbs.asp?boardID=3&ID=191&page=1 2. \"自制USB AVR JTAGICE仿真器+AVRISP下載器\"活動主題貼地址:http:/ ...…

查看全部問答∨

請問PFM和PSM需不需要環路補償?

即是說,需不需要考慮環路穩定性,對環路的零極點進行補償? 有沒有哪篇論文或者哪本書上有介紹的(因為我翻到的所有書都只有關于PWM的)?謝謝!…

查看全部問答∨

STM323.0的庫出現怪問題了...

下載 (42.84 KB) 2010-1-23 20:59 這個是我的工程目錄,   Init目錄里頭包含一個初始化文件 Init.c , 然后我在Main.c里面 包含Init.h的頭文件,   里面只放了 #ifndef _Init_H_ #define _Init_H ...…

查看全部問答∨

初始化,請教高手!

void Init(void) { // =============Basic Timer 中斷設置========================== BTCTL = BTDIV+BTIP0; // IE2|=0X80; // =============Timer A中斷設置========================== TACTL= ...…

查看全部問答∨

求一個MSP430f21X1的最小系統圖

求一個MSP430f21X1的最小系統圖…

查看全部問答∨

如何實現3v電壓用8050三極管將手觸摸微弱電流放大到0.5瓦,不用運放

如何實現3v電壓用8050三極管將手觸摸微弱電流放大到0.5瓦,不用運放 [ 本帖最后由 boofeng2002 于 2012-4-8 09:51 編輯 ]…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 临沂市| 腾冲县| 久治县| 娄烦县| 陈巴尔虎旗| 镶黄旗| 泸水县| 新化县| 卢湾区| 江安县| 包头市| 樟树市| 合山市| 汉中市| 台南市| 松原市| 绍兴市| 铜川市| 民丰县| 遵化市| 五寨县| 北安市| 友谊县| 都昌县| 安远县| 新昌县| 通州区| 内丘县| 湘西| 任丘市| 车致| 嘉义市| 沈丘县| 浠水县| 泉州市| 浦东新区| 桦甸市| 锡林浩特市| 郓城县| 张北县| 军事|