本文根據一周CC2541筆記匯總得來——
適合概覽和知識快速索引——
全部鏈接:
中級教程-OSAL操作系統\OSAL操作系統-實驗01 OSAL初探
中級教程-OSAL操作系統(進一步了解-OLED && 普通按鍵和5方向按鍵-中斷!!!)這個系統驅動層和應用層不一樣~
OSAL操作系統-實驗20 模擬IIC通信+硬件IIC(Mpu6050)
一、OLED
二、OSAL 操作系統-實驗 11 普通按鍵
按鍵的中斷代碼和使用方法

P01 即是 cc2054x 的 p0.1, 通過 10k 電阻接地, 因此 p0.1 作為輸入的時候, 常態就是低電平, 當 s1, 按下的時候, p0.1 變成高電平。
❤ 在 Hal_key.c (ble-cc254x-1.3.2-osal\components\hal\target\cc2540eb) 中,
是
osal
的按鍵
驅動文件, 主要是實現 按鍵的初始化與中斷服務函數, 里邊也包含 5 向按鍵的驅動, 5 向
按鍵與 s1 按鍵相比, 多了一個 adc 采樣, 5 向按鍵, 實際上是先觸發一個按鍵中斷, 然后,
再進行 adc 采樣, 每個方向的按鍵被按下后, 由於分壓不一樣, 因此 adc 數值也就不一樣,
這樣就能區分不同的按鍵了。
驅動文件, 主要是實現 按鍵的初始化與中斷服務函數, 里邊也包含 5 向按鍵的驅動, 5 向
按鍵與 s1 按鍵相比, 多了一個 adc 采樣, 5 向按鍵, 實際上是先觸發一個按鍵中斷, 然后,
再進行 adc 采樣, 每個方向的按鍵被按下后, 由於分壓不一樣, 因此 adc 數值也就不一樣,
這樣就能區分不同的按鍵了。
驅動比較復雜,應用相對簡單
Hal_key.c (ble-cc254x-1.3.2-osal\components\hal\target\cc2540eb)

上升沿觸發P01引腳

(用了很多宏定義!便於移植)

默認為上升沿中斷
279-281是P01口中斷配置

中斷函數為halProcessKeyInterrupt()

在該中斷處理函數中檢測中斷標志位,如果觸發中斷了則用延時去抖(純延時)。
- 上面是按鍵事件檢測
- 下面是按鍵事件傳輸到應用層處理

這個在
中負責
處理中斷事件
216 行, 就是按鍵中斷並延時去抖動后的查詢函數調用

這個
HalKeyPoll就在Hal_key.c

查詢到按鍵按下

435 行, 執行一個回調函數, 該
回調函數直接就是在我們的應用層的
同時注意到一點:
notify(下面代碼);不采用中斷時用來標記當前按鍵狀態是否轉變,采用中斷時也要根據keys的值相應設置

上面用到回調技術是在下面設置的@!!
總之, 現在知道, 只要有按鍵按下,就會執行 SimpleBLETest_ProcessEvent 這個函
數, 其實,按鍵釋放的時候也都有一個按鍵消息送上來,方便我們對按鍵狀態做判斷。而
SimpleBLETest_ProcessEvent 這個函數,就是在我們的應用層里的。至此,按鍵流程分析
完畢。
OSAL_SimpleBLETest.c

105 行定義了該
回調函數, 至於這個函數在哪里別賦值等, 我這里點到即可, 不作深入分析了。
總之, 現在知道, 只要有按鍵按下,就會執行 SimpleBLETest_ProcessEvent 這個函
數, 其實,按鍵釋放的時候也都有一個按鍵消息送上來,方便我們對按鍵狀態做判斷。而
SimpleBLETest_ProcessEvent 這個函數,就是在我們的應用層里的。至此,按鍵流程分析
完畢。
應用層
simpleBLETest.c
- 初始化注冊按鍵事件

這樣一旦有按鍵中斷發生就會觸發uint16 SimpleBLETest_ProcessEvent( uint8 task_id, uint16 events )函數
逐層進入會到static void simpleBLECentral_HandleKeys( uint8 shift, uint8 keys )

三、OSAL 操作系統-實驗 12 五向按鍵

電路圖:


注意:上面, P20 即是 cc2054x 的 p2.0, 作為
中斷輸入;而 P06 即是 P0.6,作為
ADC采樣輸入,5 向按鍵與 s1 按鍵相比,多了一個 adc采樣,5向按鍵,實際上是先觸發一個按鍵中斷,然后,再進行 adc 采樣,每個方向的按鍵被按下后,由於分壓不一樣,因此 adc 數值也就不一樣, 這樣就能區分不同的按鍵了。
IO定義:
hal_key.c

P2.0 定 義 按 鍵 為 下 降 沿 沿 觸 發
P0.6為ADC采樣輸入
設置GPIO(初始化函數中)

HalKeyConfig中設置中斷

299~301 行,這是 p2.0 的 io 中斷使能,其中斷函數在:HAL_ISR_FUNCTION的halProcessKeyInterrupt()中
在該函數中和key1的用法類似,判斷是否是按鍵按下並進行延時去抖(純延時去抖)
去抖和延時之后程序跑到哪了呢???
在Hal_drivers.c中的Hal_ProccessEvent中!
當檢測到按鍵按下事件后就會調用HalKeyPoll進行處理,如下:

在HalKeyPoll中有一個回調函數,該回調函數就在應用層中,從而實現了
按鍵按下的消息傳送到應用層的業務邏輯:

下面是這個回調函數的定義處~
在應用層中OSAL_SimpleBLETest.c:

104 行定義了該回調函數, 或者, 至於這個函數在哪里別賦值等, 我這里點到即可, 不作深入分析了。
總之, 只要有按鍵按下,就會執行 SimpleBLETest_ProcessEvent 這個函數, 其實,按鍵釋放的時候也都有一個按鍵消息送上來,方便我們對按鍵狀態做判斷。而SimpleBLETest_ProcessEvent 這個函數,就是在我們的應用層里的。至此,按鍵流程分析完畢。
總之, 只要有按鍵按下,就會執行 SimpleBLETest_ProcessEvent 這個函數, 其實,按鍵釋放的時候也都有一個按鍵消息送上來,方便我們對按鍵狀態做判斷。而SimpleBLETest_ProcessEvent 這個函數,就是在我們的應用層里的。至此,按鍵流程分析完畢。
應用層
應用層類似於key1,注冊+事件處理(參考上面)
未完~關注我的cc2541分類