2、CC2541芯片中級教程-OSAL操作系統(進一步了解-OLED && 普通按鍵和5方向按鍵-中斷!!!)這個系統驅動層和應用層不一樣~


 

本文根據一周CC2541筆記匯總得來——

適合概覽和知識快速索引——

全部鏈接:

中級教程-OSAL操作系統\OSAL操作系統-實驗01 OSAL初探

【插入】SourceInsight-工程建立方法

中級教程-OSAL操作系統(OSAL系統解基本套路)

中級教程-OSAL操作系統(進一步了解-OLED && 普通按鍵和5方向按鍵-中斷!!!)這個系統驅動層和應用層不一樣~

中級教程-OSAL操作系統(ADC-光敏電阻)

OSAL操作系統-實驗16 串口波特率擴展

OSAL操作系統-實驗17 AT命令初步

OSAL操作系統-實驗20 模擬IIC通信+硬件IIC(Mpu6050)

OSAL 操作系統-實驗 23 PWM 輸出(改變占空比)

OSAL 操作系統-實驗 24 看門狗 WachDog

OSAL操作系統-實驗25 SNV內部Flash數據讀寫

OSAL 操作系統-實驗 29 系統睡眠等級研究

OSAL 操作系統-實驗 31 從機廣播功率修改

 

一、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 向
按鍵與 s1 按鍵相比, 多了一個 adc 采樣, 5 向按鍵, 實際上是先觸發一個按鍵中斷, 然后,
再進行 adc 采樣, 每個方向的按鍵被按下后, 由於分壓不一樣, 因此 adc 數值也就不一樣,
這樣就能區分不同的按鍵了。
 
驅動比較復雜,應用相對簡單
Hal_key.c (ble-cc254x-1.3.2-osal\components\hal\target\cc2540eb)
 
S1 按鍵的 io 定義如下:
上升沿觸發P01引腳
 
(用了很多宏定義!便於移植)
 
默認為上升沿中斷
279-281是P01口中斷配置
 
中斷函數為halProcessKeyInterrupt()
 
在該中斷處理函數中檢測中斷標志位,如果觸發中斷了則用延時去抖(純延時)。
 
  • 上面是按鍵事件檢測
  • 下面是按鍵事件傳輸到應用層處理
 
Hal_drivers.c (ble-cc254x-1.3.2-osal\components\hal\common)
這個在 中負責 處理中斷事件
216 行, 就是按鍵中斷並延時去抖動后的查詢函數調用
 
這個 HalKeyPoll就在Hal_key.c
查詢到按鍵按下
 
435 行, 執行一個回調函數, 該 回調函數直接就是在我們的應用層的
 
同時注意到一點notify(下面代碼);不采用中斷時用來標記當前按鍵狀態是否轉變,采用中斷時也要根據keys的值相應設置
 
上面用到回調技術是在下面設置的@!!
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 這個函數,就是在我們的應用層里的。至此,按鍵流程分析完畢。
 
應用層
應用層類似於key1,注冊+事件處理(參考上面)

 

 

 

未完~關注我的cc2541分類 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM