999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

嵌入式操作系統下“單鍵多態”的通用處理方法

2016-09-15 07:02:58張錫林
單片機與嵌入式系統應用 2016年8期
關鍵詞:方法

張錫林

(廣東省特種設備檢測研究院 珠海檢測院,珠海 519000)

?

嵌入式操作系統下“單鍵多態”的通用處理方法

張錫林

(廣東省特種設備檢測研究院 珠海檢測院,珠海 519000)

介紹了一種在實時嵌入式操作系統平臺上單鍵輸入的通用處理方法。該方法通過監控按鍵的電平觸發,配合操作系統內置的軟定時器,高效實現了單個按鍵輸入時去抖動、單按、雙按、多按,以及納秒延時長按的不同狀態區分處理。該方法實現原理清晰簡單,不占用微處理器運行時間,并且可移植到等其他類似的系統中(如μC/OS、FreeRTOS、trochili RTOS),具有較高的應用價值。

實時嵌入式系統;按鍵處理;GD32F207;ThreadX

引 言

隨著ARM公司推出的Cortex系列32位處理器迅速在智能測量、人機接口、汽車工業、控制系統、家用電器等應用場合得到廣泛的應用,為了更合理地調度多任務,高效利用系統資源、系統函數以及與專用庫函數的接口,通常使用實時嵌入式操作系統作為開發平臺,這樣既保證了程序執行的實時性,又減少了產品開發時間,提高了軟件的維護性,縮短了新設備的上市時間。

在該系統的應用開發中,經常遇到需要在單個按鍵內實現單按、雙按、多按、延時長按等多種組合的功能。本文以兆易創新(GigaDevice)公司的入門級開發板GD32-Colibri-F207ZE(下稱GD32F207ZE)作為硬件平臺,并通過ExpressLogic公司的商用高性能實時嵌入式操作系統——ThreadX測試版作為軟件開發平臺,實現了這些功能。

1 實現原理

在大多數常見的按鍵輸入處理方法中,通常方法是監控輸入端口的單一電平變化。而本方法同時還監控了按鍵輸入電平的兩種變化——從高電平變為低電平或者從低電平變為高電平,并通過處理器輸入I/O的上升沿觸發和下降沿觸發,分別在中斷服務函數里面取得其觸發時刻的系統時鐘節拍,從而計算出兩種觸發變化時刻的時鐘節拍差異,判斷出按鍵輸入的類型,并通過一個全局變量傳遞至預先設置激活的軟定時器函數里,最終由軟定時器函數實現不同的按鍵處理。

2 實現過程

2.1按鍵輸入電路

圖1 按鍵輸入電路及信號

按鍵輸入電路及信號如圖1所示,按鍵KEY1連接至微處理器GD32F207ZE的PD14輸入端口,并通過一個上拉電阻R30將輸入信號的初始穩定狀態鉗位到高電平。當按鍵KEY1觸發后,會呈現圖1(b)的實際電平信號。可以看出,在輸入信號電平切換過程中,均有一段電平信號的抖動過程,需使用處理程序對其進行過濾。

2.2處理結果輸出電路

圖2 按鍵處理輸出電路

GD32F207ZE開發板板載了3顆不同顏色的LED,其電路形式如圖2所示,分別連接至微處理器GD32F207ZE的PD11、PD12和PD13輸入端口,可作為按鍵處理的輸出結果顯示,直觀方便。

2.3按鍵輸入及LED輸出I/O的初始化代碼

按鍵輸入I/O以及LED輸出I/O的初始化代碼如下:

01 #define BSP_LED_REDGPIO_PIN_11

02 #define BSP_LED_GREENGPIO_PIN_12

03 #define BSP_LED_YELLOWGPIO_PIN_13

04 #define BSP_BTN_KEY1GPIO_PIN_14

05 #define BSP_KEY1_EXTI_PIN_SOURCEGPIO_PINSOURCE14

06 #define BSP_KEY1_EXTI_LINEEXTI_LINE14

07 #define BSP_KEYS_EXTI_IRQChannelEXTI15_10_IRQn

08

09 /* Enable APB2 Clock */

10 RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD|RCC_APB2PERIPH_AF,ENABLE);

11

12 /* Configure LED I/O mode */

13 GPIO_InitStructure.GPIO_Pin = BSP_LED_RED|BSP_LED_GREEN|BSP_LED_YELLOW;

14 GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;

15 GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;

16 GPIO_Init(GPIOD,&GPIO_InitStructure);

17

18 /* Configure BSP_BTN_KEYs IO mode*/

19 GPIO_InitStructure.GPIO_Pin = BSP_BTN_KEY1;

20 GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;

21 GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;

22 GPIO_Init(GPIOD,&GPIO_InitStructure);

23

24 /* Connect EXTI Line to pin */

25 GPIO_EXTILineConfig(GPIO_PORT_SOURCE_GPIOD, BSP_KEY1_EXTI_PIN_SOURCE);

26

27 /* Configure EXTI line trigger mode*/

28 EXTI_InitStructure.EXTI_LINE = BSP_KEY1_EXTI_LINE;

29 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

30 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;

31 EXTI_InitStructure.EXTI_LINEEnable = ENABLE;

32 EXTI_Init(&EXTI_InitStructure);

33

34 /* Enable and set EXTI Line Interrupt */

35 NVIC_InitStructure.NVIC_IRQ = BSP_KEYS_EXTI_IRQChannel;

36 NVIC_InitStructure.NVIC_IRQPreemptPriority = 0x0F;

37 NVIC_InitStructure.NVIC_IRQSubPriority = 0x0F;

38 NVIC_InitStructure.NVIC_IRQEnable = ENABLE;

39 NVIC_Init(&NVIC_InitStructure);

這部分代碼將驅動3個LED的I/O均設置為普通推挽輸出,同時將按鍵KEY1的I/O設置為懸空輸入,即在處理器芯片內部既沒有接上拉電阻,也沒有接下拉電阻,其工作電平由外部電路決定(根據圖1,其穩定初始狀態為高電平)。需注意兩點,在第30行代碼中,把按鍵KEY1的中斷觸發模式設置為上升沿和下降沿均引起中斷觸發,這是整個實現方法中的關鍵;在第10行代碼中,由于使用了按鍵輸入端口PD14的中斷功能,因此需要將其復用功能RCC_APB2PERIPH_AF的時鐘同時開啟。

2.4ThreadX軟定時器函數

ThreadX軟定時器函數代碼如下所示:

01 tx_timer_create (&button_timer, "button_timer", button_timer_entry, 0x00, 100, 100, TX_NO_ACTIVATE);

02

03 void button_timer_entry(ULONG invalue){

04 switch(buton_pushed_counter){

05 case 1:

06 GPIOD->DOR ^= BSP_LED_RED;

07 break;

08 case 2:

09 GPIOD->DOR ^= BSP_LED_GREEN;

10 break;

11 case 3:

12 GPIOD->DOR ^= BSP_LED_YELLOW;

13 break;

14 case 20:

15 GPIOD->DOR ^= BSP_LED_RED;

16 break;

17 case 50:

18 GPIOD->DOR ^= BSP_LED_GREEN;

19 break;

20 case 90:

21 GPIOD->DOR ^= BSP_LED_YELLOW;

22 break;

23 default:

24 break;

25 }

26 buton_pushed_counter = 0;

27 tx_timer_deactivate(&button_timer);

28 }

以上代碼中,其中第01行代碼是實時嵌入式操作系統ThreadX的系統函數,功能是建立一個按鍵處理的軟定時器,并處于關閉狀態。其中在該定時器函數中,buton_pushed_counter是一個UINT類型的全局變量,它由以下的按鍵中斷服務函數賦值,傳遞不同的按鍵輸入類型到這里進行判斷并分別處理。由代碼可以看出,處理結果就是分別切換開發板上板載的3顆不同顏色的LED的狀態。另外在處理完畢后,務必將buton_pushed_counter設置為0,并關閉定時器。

2.5按鍵中斷服務函數

按鍵中斷服務函數代碼如下:

01 /* In Threadx, the timer-ticks is 10ms */

02 #definebtn_0100_PUSH_MS 10UL

03 #definebtn_2000_PUSH_MS 200UL

04 #definebtn_5000_PUSH_MS 500UL

05 #definebtn_9000_PUSH_MS 900UL

06

07 void IrqHandler_BTN(void){

08 static ULONGxTimeKeyRising1, xTimeKeyFalling1;

09 ULONG xTimeKeyBetween1;

10

11 if(EXTI_GetIntBitState(BSP_KEY1_EXTI_LINE) != RESET){

12 if(GPIO_ReadInputBit(GPIOD, BSP_BTN_KEY1) == 0){

13 /* Return Values system clock ticks */

14 xTimeKeyFalling1 = tx_time_get();

15 xTimeKeyRising1 = NULL;

16 }

17 else if(GPIO_ReadInputBit(GPIOD, BSP_BTN_KEY1) == 1){

18 if(xTimeKeyFalling1 !=NULL)

19 xTimeKeyRising1 = tx_time_get();

20 }

21 if(xTimeKeyRising1 !=NULL && xTimeKeyFalling1 != NULL){

22 xTimeKeyBetween1 = xTimeKeyRising1 - xTimeKeyFalling1;

23 /* 1.單按鍵處理,包括雙按、多按鍵*/

24 if(xTimeKeyBetween1>btn_0100_PUSH_MS && xTimeKeyBetween1

25 buton_pushed_counter ++;

26 //active the timer,sometimes to wait for the next push

27 tx_timer_deactivate(&button_timer);

28 tx_timer_change(&button_timer,80, 80);

29 tx_timer_activate(&button_timer);

30 xTimeKeyRising1 = NULL;

31 xTimeKeyFalling1 = NULL;

32 }

33 /* 2.連續按下2~5 s */

34 else if(xTimeKeyBetween1>btn_2000_PUSH_MS && xTimeKeyBetween1

35 buton_pushed_counter = 20;

36 //active the timer,set it expired in 10ms

37 tx_timer_deactivate(&button_timer);

38 tx_timer_change(&button_timer,10, 10);

39 tx_timer_activate(&button_timer);

40 xTimeKeyRising1 = NULL;

41 xTimeKeyFalling1 = NULL;

42 }

43 /* 3.連續按下5~9 s */

44 else if(xTimeKeyBetween1>btn_5000_PUSH_MS && xTimeKeyBetween1

45 buton_pushed_counter = 50;

46 tx_timer_deactivate(&button_timer);

47 tx_timer_change(&button_timer,10, 10);

48 tx_timer_activate(&button_timer);

49 xTimeKeyRising1 = NULL;

50 xTimeKeyFalling1 = NULL;

51 }

52 /* 4.連續按下9 s以上 */

53 else if(xTimeKeyBetween1>btn_9000_PUSH_MS){

54 buton_pushed_counter = 90;

55 tx_timer_deactivate(&button_timer);

56 tx_timer_change(&button_timer,10, 10);

57 tx_timer_activate(&button_timer);

58 xTimeKeyRising1 = NULL;

59 xTimeKeyFalling1 = NULL;

60 }

61 }

62 /* Clear the EXTI line pending bit */

63 EXTI_ClearIntBitState(BSP_KEY1_EXTI_LINE);

64 }

65 }

該段代碼的重點是第14行和第19行,分別獲得下降沿和上升沿觸發時刻的系統時鐘節拍,并在第22行計算其時鐘節拍差。在第24行代碼中,利用時鐘節拍差必須大于100 ms的特點來過濾按鍵觸發階段的抖動態。另外,第24~32行代碼在發生按鍵單按后,buton_pushed_counter增加1,同時設置軟定時器在800 ms后觸發,目的是等待是否還有下一次短按,從而實現按鍵單按和多按兼并判斷的效果。

剩下其余代碼,均是處理單鍵延時長按的,可對比代碼注釋自行推敲,不再一一贅述。

結 語

綜上所述,通過監控單個按鍵輸入的電平觸發,配合實時嵌入式操作系統的軟定時器,可以高效地實現在單個按鍵輸入下去抖動、單按、雙按、多按,以及延時長按的不同輸入區分處理。本方法不使用延時消抖或等待,不會空占MCU的運行時間,具有很強的實時性。另外,本方法實現原理架構是通用的,只要替換幾個重要的系統函數,即可輕松移植到其他實時嵌入式操作系統中,具有較高的推廣價值。

[1] GigaDevice Semiconductor (Beijing) Inc.GD32F207xx_Datasheet_Rev1.01,2015.

[2] Express Logic Inc.ThreadX User Guide Version 5.0,2006.

張錫林,從事電梯安全技術檢驗工作。

General Method for Single Polymorphism in Embedded Operating System

Zhang Xilin

(Zhuhai Academy of Detection,Guangdong Special Equipment Inspection and Research Institute,Zhuhai 519000,China)

In the paper,a general method of single input in the real-time embedded operating system is introduced.The method achieves a single key input to jitter,single click,double press,press and nano second long delay according to the different states of distinguishing and processing through monitoring the key level trigger and the soft timer built in the operating system.The implementation of the method is simple and clear without occupying the microprocessor running time,and can port to the other similar systems such as μC/OS,FreeRTOS,trochili RTOS.

real-time embedded system;key processing;GD32F207;ThreadX

TP368.1

A

(責任編輯:薛士然2016-03-22)

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 999精品色在线观看| 亚洲天堂福利视频| 精品国产乱码久久久久久一区二区| 欧美一区二区自偷自拍视频| 国产91无毒不卡在线观看| 日本亚洲国产一区二区三区| 国产凹凸一区在线观看视频| 免费看a级毛片| 久久综合五月婷婷| 亚洲一区国色天香| 日韩专区第一页| 精品福利视频网| 亚洲综合色婷婷| 免费在线一区| 99热6这里只有精品| 亚洲人成网站色7799在线播放| 国产黄在线免费观看| 欧美福利在线观看| 毛片在线播放网址| 欧美另类第一页| 日本道中文字幕久久一区| 久久精品娱乐亚洲领先| 国产成人无码播放| 亚洲综合婷婷激情| 手机精品福利在线观看| 国产男女XX00免费观看| 狠狠色噜噜狠狠狠狠色综合久| 少妇极品熟妇人妻专区视频| 精品国产黑色丝袜高跟鞋| 欧美性爱精品一区二区三区| 亚洲成a∧人片在线观看无码| 精品一区二区三区水蜜桃| 亚洲aⅴ天堂| 久久人搡人人玩人妻精品| 国产成人无码久久久久毛片| 蜜臀AV在线播放| 亚洲无码A视频在线| av性天堂网| 国产乱人伦精品一区二区| 国产成人精品高清在线| 亚洲国产成人自拍| 亚洲综合香蕉| 色视频国产| 欧美a在线视频| 毛片视频网址| 中文字幕日韩视频欧美一区| 欧美日本二区| 98精品全国免费观看视频| 国产成人一级| 激情综合图区| 91黄视频在线观看| 青青青国产视频| 欧美一级夜夜爽www| 先锋资源久久| 国产精品女人呻吟在线观看| 99视频在线看| 久久99国产精品成人欧美| 青青青伊人色综合久久| 亚洲欧美日韩中文字幕在线| 日韩精品一区二区三区视频免费看| 国产午夜一级毛片| 亚洲码一区二区三区| 久久国产精品电影| 中文字幕一区二区人妻电影| 天天色综网| 狠狠色成人综合首页| 黄色网址免费在线| 国产不卡一级毛片视频| 国产福利影院在线观看| 国产95在线 | 天堂va亚洲va欧美va国产| 日韩无码黄色| 一级毛片基地| 亚洲中文字幕23页在线| 亚洲无码在线午夜电影| 一区二区三区高清视频国产女人| 亚洲精品国产精品乱码不卞| aa级毛片毛片免费观看久| 国产精品女人呻吟在线观看| 在线无码九区| 久久毛片免费基地| 国产主播在线一区|