第七章為面向通用接口的編程,本文內容為7.4 溫度采集接口、7.5 鍵盤。
7.4 溫度采集接口
>>> 7.4.1 溫度傳感器通用接口
AMetal 提供了溫度采集的通用接口,僅包含一個溫度讀取接口,用于讀取當前的溫度值,其函數原型為(am_temp.h):
其中,handle 為溫度傳感器的句柄,其可以通過初始化具體的溫度傳感器(如LM75)獲得,p_temp 為輸出參數,用于返回當前的溫度值,為了避免小數運算,這里使用有符號的32 位整數表示溫度值(單位:攝氏度),且其值為實際溫度值的1000 倍,表示溫度值的分辨率為0.001℃。讀取溫度的范例程序詳見程序清單7.25。
程序清單7.25 am_temp_read()范例程序
顯然要使應用程序可以使用通用接口讀取溫度,就必須獲取溫度傳感器的handle,這就需要為具體的溫度傳感器提供相應的驅動。
>>> 7.4.2 LM75B 驅動
LM75B 是NXP 半導體推出的具有I2C接口的數字溫度傳感器芯片,AMetal 已經提供了其對應的驅動,僅包含一個初始化函數,其函數原型(am_temp_lm75.h)為:
該函數意在獲取LM75 溫度傳感器的實例句柄,進而使用通用接口讀取溫度。其中:
-
p_lm75 為指向am_temp_lm75_t 類型實例的指針;
-
p_devinfo 為指向am_temp_lm75_info_t 類型實例信息的指針。
1. 實例
定義am_temp_lm75_t 類型(am_temp_lm75.h)實例如下:
其中,g_temp_lm75 為用戶自定義的實例,其地址作為p_lm75 的實參傳遞。
2. 實例信息
實例信息主要描述了與LM75 相關的信息,即LM75 的I2C從機地址等,其類型am_temp_lm75_info_t 的定義(am_temp_lm75.h)如下:
其中,i2c_addr 指定了LM75 的7-bit 從機地址(在很多應用中,常常使用8 位數據表示從機地址, 8 位地址的最低位為讀寫方向位,由于在AMetal 中,讀寫方向位無需用戶控制,驅動會自動實現對讀寫方向位的控制,因此在AMetal 中需要由用戶提供的7-bit 從機地址不包含讀寫方向位),LM75 的7-bit 從機地址為1001A2A1A0,最低三位由A0~A2 引腳電平決定,在AM824-Core 中,板載了一個LM75 溫度傳感器。由此可見,A0~A2 均與地連接,為低電平,因此,板載LM75 的地址為1001000,即:0x48。其實例信息定義如下:
其中,g_temp_lm75_info 為用戶自定義的實例信息,其地址作為p_info 的實參傳遞。
3.I2C句柄i2c_handle
以I2C1 為例,其實例初始化函數am_lpc82x_i2c1_inst_init()的返回值即可作為實參傳遞給i2c_handle。即:
4. 實例句柄
基于實例、實例信息和I2C句柄,即可完成LM75 的初始化。比如:
初始化函數的返回值即為溫度傳感器的句柄,若返回值為NULL,說明初始化失敗;若返回值不為NULL,說明返回了有效的handle,其可以作為溫度讀取接口的參數。為了便于配置LM75(如修改7-bit 從機地址等)。基于模塊化編程思想,將初始化相關的實例、實例信息等的定義存放到LM75 的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件的程序范例分別詳見程序清單7.26 和程序清單7.27。
程序清單7.26 LM75 實例初始化函數實現(am_hwconf_lm75.c)
程序清單7.27 LM75 實例初始化函數聲明(am_hwconf_lm75.h)
后續只需要使用無參數的實例初始化函數即可完成LM75 實例的初始化,獲取溫度傳感器句柄,即執行如下語句:
當完成初始化后,即可使用通用的溫度讀取接口獲取當前溫度值,讀取并通過串口打印當前溫度值的范例程序詳見程序清單7.28。
程序清單7.28 使用LM75 檢測當前溫度的范例程序
7.5 鍵盤
>>> 7.5.1 通用鍵盤接口
由于此前的按鍵處理方式與具體的MCU、鍵盤的組織形式(獨立按鍵或矩陣鍵盤等)完全耦合在一起,為此AMetal 提供了一種通用鍵盤接口。其函數原型為:
其中,p_handler 為指向按鍵事件處理器的指針,pfn_cb 為指向用戶自定義按鍵處理函數的指針,p_arg 為按鍵處理函數的用戶參數。
1. p_handler
am_input_key_handler_t 是按鍵事件處理器的類型,它是在am_input.h 文件中使用typedef自定義的一個類型。即:
基于此,在使用按鍵時,首先需要定義一個該類型的按鍵事件處理器實例(對象),其本質是定義一個結構體變量。比如:
即可該實例的地址&key_handler 作為參數傳遞給函數的形參p_handler。
2. pfn_cb
am_input_cb_key_t 是按鍵處理函數的指針類型,它是在am_input.h 文件中使用typedef自定義的一個類型。即:
當有按鍵事件發生時(按鍵按下或按鍵釋放),均會調用pfn_cb 指向的按鍵處理函數,完成相應的按鍵處理功能。當該函數被調用時,傳遞給p_arg 的值為用戶參數,傳遞給key_code 的值為按鍵的編碼,它是在am_input_code.h 文件中使用宏進行定義的,比如,KEY_1、KEY_2 等,傳遞給key_state 的值為按鍵的狀態,詳見表7.5。
表7.5 按鍵狀態
以AM824-Core 開發板為例,KEY 對應的按鍵編碼為KEY_KP0。當KEY 鍵按下時,則LED0 點亮;當KEY 鍵釋放后,則LED0 熄滅,相應的按鍵處理函數詳見程序清單7.29。
程序清單7.29 按鍵處理函數范例程序
函數名即可作為參數傳遞給am_input_key_handler_register()函數的形參pfn_cb。
3. p_arg
通常調用am_input_key_handler_register()函數傳遞給形參p_arg 的值會在調用事件處理回調函數時,傳遞給事件處理函數的p_arg 形參。
如果不使用,則在調用am_input_key_handler_register()函數時,將p_arg 的值設置為NULL,注冊按鍵處理器的范例程序詳見程序清單7.30。
程序清單7.30 按鍵處理函數范例程序
注冊按鍵處理器后,當有鍵按下或按鍵釋放時,均會調用注冊按鍵處理器時指定的回調函數,即程序清單7.29 中的__input_key_proc ()函數。為了分離各個鍵的處理代碼,可以注冊多個按鍵事件處理器,每個處理器負責處理一個或多個鍵,詳見程序清單7.31。
程序清單7.31 注冊多個按鍵處理器范例程序
通用鍵盤接口的特點是屏蔽了底層的差異性,使應用程序與底層MCU、鍵盤的具體形式無關,可以輕松地實現應用程序的跨平臺。
在實際的應用中,鍵盤的表現形式是多種多樣的,比如,直接使用GPIO 驅動的獨立鍵盤(一個或多個獨立按鍵組成的鍵盤)和矩陣鍵盤和標準的PS/2 接口鍵盤,以及使用ZLG推出的I2C接口的ZLG72128 鍵盤與數碼管驅動芯片制作的鍵盤等。雖然各種按鍵的檢測方法都不相同,但只要提供相應的驅動,即可將接口統一起來。如同在PC 上使用外部設備時,需要安裝對應的驅動一樣。AMetal 提供了常用鍵盤的驅動,用戶直接使用無需關心按鍵檢測的方法或按鍵消抖等細節問題。
>>> 7.5.2 獨立鍵盤驅動
AMetal 獨立鍵盤的驅動提供了一個初始化函數,使用該函數初始化一個獨立鍵盤實例后,即可使用通用接口使用按鍵。其函數原型為:
其中,p_dev 為指向am_key_gpio_t 類型實例的指針,p_info 為指向am_key_gpio_info_t類型實例信息的指針。
1. 實例
定義am_key_gpio_t 類型(am_key_gpio.h)實例如下:
其中,g_key_gpio 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
2. 實例信息
實例信息主要描述與獨立鍵盤相關的信息,比如,使用的GPIO 引腳號,獨立按鍵的個數,以及對應的按鍵編碼等信息。其類型am_key_gpio_info_t 的定義(am_key_gpio.h)如下:
其中,p_pins 指向存放各獨立按鍵對應引腳號的數組,如在AM824-Core 開發板上,有一個多功能按鍵可以當做獨立按鍵使用。當J14 的1 和2 短接時,KEY 與PIO_KEY(PIO0_1)連接,此時,按鍵KEY 當做獨立按鍵使用。基于此,可以定義一個存放引腳號的數組:
該數組的地址即可作為p_pins 的值。由于AM824 開發板只有一個獨立按鍵,因此數組僅有一個元素,其值為與該獨立按鍵連接的引腳號,即PIO0_1。當存在多個獨立按鍵時,繼續在該數組后添加數據元素即可。同時,由于引腳號在系統啟動后不會修改,因此使用了const 修飾符。
為了區分各個按鍵,要求每個按鍵都具有一個唯一的編碼值,因此需要為獨立鍵盤中的各個按鍵指定一個編碼,p_codes 即指向存放各獨立按鍵對應編碼的數組,其編碼與p_pins指向的數組中各個獨立按鍵一一對應。比如,設置AM824ZB 開發板中的獨立按鍵對應編碼為KEY_KP0,則可以定義如下數組:
該數組的地址即可作為p_codes 的值。在通用按鍵處理接口的程序范例中,使用了按鍵編碼KEY_F1 作為獨立按鍵的編碼,按鍵編碼KEY_F1 就是在這里配置的,如果需要使用其它按鍵編碼,直接修改即可。按鍵編碼可以是任意整數值,但建議使用類似KEY_KP0 這樣的標準按鍵編碼,其是在am_input_code.h 文件中定義的宏。
pin_num 指定了獨立鍵盤中獨立按鍵的個數,其應該與p_pins 和p_codes 指向的數組大小保持一致,在AM824-Core 開發板上只有一個獨立按鍵,因此該值為1。
對于獨立按鍵來講,不同的電路可能影響按鍵按下時的電平,為了讓驅動準確獲取這一信息,使用active_low 成員表明按鍵按下時的電平,若按鍵按下時為低電平,則該值為AM_TRUE,反之該值為AM_FALSE。查看相應的原理圖可知,當按鍵按下時,GPIO 引腳為低電平,因此active_low 的值應該設置為AM_TRUE。
scan_interval_ms 指定了按鍵掃描的時間間隔,即每隔該段時間執行一次按鍵檢測,檢測是否有按鍵事件發生(按鍵按下或按鍵釋放),通常將該值設置為10 ms。基于以上信息,實例信息定義如下:
基于實例和實例信息,即可完成獨立鍵盤的初始化。比如:
初始化完成后,即可使用通用鍵盤處理接口處理編碼為KEY_KP0 的按鍵。為了便于配置獨立鍵盤(修改實例信息)。基于模塊化編程思想,將初始化相關的實例和實例信息等的定義存放到獨立鍵盤的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件的程序范例分別詳見程序清單7.32 和程序清單7.33。
程序清單7.32 獨立鍵盤實例初始化函數實現(am_hwconf_key_gpio.c)
程序清單7.33 獨立鍵盤實例初始化函數聲明(am_hwconf_key_gpio.h)
后續只需要使用無參數的實例初始化函數,即可完成獨立鍵盤實例的初始化:
初始化完成后,即可使用通用鍵盤處理接口處理編碼為KEY_KP0 的按鍵。
在AM824ZB 中,獨立鍵盤作為一種板載資源,在系統啟動時已經默認進行了獨立鍵盤的初始化操作,因此在程序清單7.30 所示的范例程序中,沒有調用獨立鍵盤實例初始化函數就可以使用板載的獨立按鍵。
若用戶不需要使用獨立按鍵,為了節省內存空間,可以將am_prj_config.h 工程配置文件中的AM_CFG_KEY_GPIO_ENABLE 宏值修改為0,裁剪掉獨立鍵盤,該宏本質上控制了板級初始化函數中的一段程序,詳見程序清單7.34。
程序清單7.34 在板級初始化中裁剪獨立鍵盤的原理
注:板級初始化函數在系統啟動時自動調用,初始化完畢后才會進入應用程序入口,即am_main()。
>>> 7.5.3 矩陣鍵盤驅動
類似地,AMetal 矩陣按鍵的驅動也提供了一個初始化函數,使用該函數初始化一個矩陣鍵盤實例后,即可使用通用接口使用按鍵。其函數原型為:
其中的p_dev 為指向am_key_matrix_gpio_softimer_t 類型實例的指針,p_info 為指向am_key_matrix_gpio_softimer_info_t 類型實例信息的指針。
1. 實例
定義am_key_matrix_gpio_softimer_t 類型(am_key_matrix_gpio.h)實例如下:
其中,miniport_key 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
2. 實例信息
實例信息描述了與矩陣鍵盤相關的信息,其類型am_key_matrix_gpio_softimer_info_t 的定義(am_key_matrix_gpio.h)如下:
其中, key_matrix_gpio_info 成員包含了GPIO 驅動型矩陣鍵盤的相關信息;scan_interval_ms 指定了按鍵掃描的時間間隔(單位:毫秒),即每隔該段時間執行一次按鍵檢測,檢測是否有按鍵事件發生(按鍵按下或按鍵釋放),該值一般設置為5 ms 即可。
key_matrix_gpio_info 類型am_key_matrix_gpio_info_t 定義(am_key_matrix_gpio.h)為:
其中,base_info 成員包含了矩陣鍵盤的基礎信息,如矩陣鍵盤的行數和列數、各按鍵對應的編碼等。p_pins_row 指向存放矩陣鍵盤行線對應引腳號的數組,p_pins_col 指向存放矩陣鍵盤列線對應引腳號的數組。
若使用MiniPort-Key 與AM824-Core 相連接時,KR0、KR1 為行線,分別與PIO0_6 和PIO0_7 連接,KL0、KL1 為列線,分別與PIO0_17 和PIO0_23 連接。定義行線引腳數組和列線引腳數組為:
兩個數組的地址可分別作為p_pins_row 和p_pins_col 的值。
base_info 成員的類型am_key_matrix_base_info_t 定義(am_key_matrix_base.h)如下:
其中,row 和col 分別表示矩陣鍵盤的行數目和列數目,若使用MiniPort-Key 矩陣鍵盤,其為2×2 的矩陣鍵盤,因此行數目和列數目均為2。
p_codes 指向存放矩陣鍵盤中各按鍵對應編碼的數組,為了與硬件標號一致,分配給各個按鍵的編碼依次為:KEY_0、KEY_1、KEY_2、KEY_3。則可以定義如下數組:
該數組的地址即可作為p_codes的值。active_low 表明按鍵按下是否為低電平,由電路的設計可知,行線外接了上拉電阻,配置為輸入模式時默認會是高電平。因此,應該使用低電平驅動方式,列線輸出低電平,當按鍵按下時,就會檢測到低電平, 即該值應為AM_TRUE。scan_mode 表示掃描方式,支持的方式有行掃描和列掃描方式,它們對應的宏名詳見表7.6。如使用列掃描,則該值為AM_KEY_MATRIX_SCAN_MODE_COL。基于以
上信息,完整的實例信息可以定義如下:
表7.6 矩陣鍵盤掃描方式
基于實例和實例信息,即可完成MiniPort-Key 矩陣鍵盤的初始化。比如:
初始化完成后,即可使用通用鍵盤處理接口處理編碼為KEY_0~KEY_3 的按鍵。為了便于配置矩陣鍵盤(修改實例信息)。基于模塊化編程思想,將初始化相關的實例、實例信息等的定義存放到獨立鍵盤的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件的程序范例分別詳見程序清單7.35 和程序清單7.36。
程序清單7.35 矩陣鍵盤實例初始化函數實現(am_hwconf_miniport _key.c)
程序清單7.36 矩陣鍵盤實例初始化函數聲明(am_hwconf_miniport_key.h)
后續只需要使用無參數的實例初始化函數,即可完成矩陣鍵盤實例的初始化:
當完成初始化后,即可使用通用鍵盤處理接口處理編碼為KEY_0~KEY_3 的按鍵。在AM824-Core 中,矩陣鍵盤作為可選的配板資源,在系統啟動時沒有像獨立鍵盤那樣默認就執行了初始化操作,因此如需使用矩陣鍵盤,則必須手動調用矩陣鍵盤實例初始化函數。
基于按鍵通用接口編寫一個簡易的應用程序:當有鍵按下時,蜂鳴器在發出“嘀”的一聲的同時,通過LED0 和LED1 的組合顯示按鍵編號。比如,當KEY0 鍵按下時,兩個LED燈均熄滅。當KEY1 按下時,則顯示01,即LED0 亮,LED1 熄滅,依此類推。將應用程序存放在app_key_code_led_show.c 文件中,其接口聲明在app_key_code_led_show.h 文件中,詳見程序清單7.37 和程序清單7.38。
程序清單7.37 矩陣鍵盤應用程序實現(app_key_code_led_show.c)
程序清單7.38 矩陣鍵盤應用程序接口聲明(app_key_code_led_show.h)
使用MiniPort-Key 的4 個按鍵展示此應用程序的功能的主程序詳見程序清單7.39。
程序清單7.39 矩陣鍵盤應用程序主程序
-
溫度采集
+關注
關注
0文章
99瀏覽量
23411 -
接口編程
+關注
關注
0文章
9瀏覽量
8732
原文標題:周立功:面向通用接口的編程——溫度采集接口、鍵盤
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論