周立功教授新書《面向AMetal框架與接口的編程(上)》,對(duì)AMetal框架進(jìn)行了詳細(xì)介紹,通過閱讀這本書,你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口編程的開發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實(shí)現(xiàn)企業(yè)和個(gè)人的共同進(jìn)步。
第七章為面向通用接口的編程,本文內(nèi)容為7.1 LED 控制接口、7.2 HC595 接口、7.3 蜂鳴器控制接口。
本章導(dǎo)讀
雖然面向接口的編程簡單易懂,但無法做到最大程度上地重用應(yīng)用程序,這是導(dǎo)致軟件開發(fā)成本居高不下的原因之一。而面向通用接口的編程就是基于AMetal 框架的應(yīng)用程序設(shè)計(jì),其核心是制定統(tǒng)一的接口規(guī)范,使程序員脫離非核心域的束縛聚焦于核心競(jìng)爭力。
7.1 LED 控制接口
>>> 7.1.1 LED 通用接口
為了實(shí)現(xiàn)跨平臺(tái)開發(fā)應(yīng)用軟件,AMetal 提供了操作LED 的通用接口,詳見表7.1。
表7.1 LED 通用接口(am_led.h)
1. 設(shè)置LED 的狀態(tài)
設(shè)置LED 狀態(tài)的函數(shù)原型為:
其中,led_id 為LED 編號(hào),AM824-Core 開發(fā)板共有兩個(gè)LED:LED0 和LED1,其編號(hào)分別為0 和1。如果LED 的狀態(tài)state 值為AM_TRUE,則點(diǎn)亮LED;反之state 值為AM_FALSE,則熄滅LED,其相應(yīng)的范例程序詳見程序清單7.1。
程序清單7.1 am_led_set()范例程序
2. 點(diǎn)亮LED
點(diǎn)亮LED 的函數(shù)原型為:
其中,led_id 為LED 編號(hào),其相應(yīng)的范例程序詳見程序清單7.2。
程序清單7.2 am_led_on()范例程序
3. 熄滅LED
熄滅LED 的函數(shù)原型為:
其中,led_id 為LED 編號(hào),其相應(yīng)的范例程序詳見程序清單7.3。
程序清單7.3 am_led_off()范例程序
4. 翻轉(zhuǎn)LED 的狀態(tài)
翻轉(zhuǎn)LED 的狀態(tài)就是使LED 由點(diǎn)亮狀態(tài)轉(zhuǎn)變?yōu)橄鐮顟B(tài)或由熄滅狀態(tài)轉(zhuǎn)變?yōu)辄c(diǎn)亮狀態(tài)。
其函數(shù)原型為:
其中,led_id 為LED 編號(hào),其相應(yīng)的范例程序詳見程序清單7.4。
程序清單7.4 am_led_toggle()范例程序
通過LED 通用接口控制AM824-Core 板載的兩個(gè)LED,使兩燈交替點(diǎn)亮(2 個(gè)LED 的流水燈效果),其相應(yīng)的范例詳見程序清單7.5。
程序清單7.5 兩個(gè)LED 燈交替點(diǎn)亮(LED 流水燈)
>>> 7.1.2 LED 驅(qū)動(dòng)
顯然,如果要想使用通用接口操作LED,則必須為具體的LED 設(shè)備提供相應(yīng)的驅(qū)動(dòng)。基于此,AMetal 提供了相應(yīng)的驅(qū)動(dòng)初始化函數(shù)。當(dāng)使用該函數(shù)初始化一個(gè)LED 實(shí)例后,即可使用通用LED 接口操作LED。其函數(shù)原型為:
-
p_dev 為指向am_led_gpio_dev_t 類型實(shí)例的指針;
-
p_info 為指向am_led_gpio_info_t 類型實(shí)例信息的指針。
1. 實(shí)例
定義am_led_gpio_dev_t 類型(am_led_gpio.h)實(shí)例如下:
其中,g_led_gpio 為用戶自定義的實(shí)例,其地址作為p_dev 的實(shí)參傳遞。
2. 實(shí)例信息
實(shí)例信息主要描述了LED 的相關(guān)信息,比如,使用的GPIO 引腳號(hào),LED 為低電平點(diǎn)亮與相應(yīng)的LED 編號(hào)等信息。其類型am_led_gpio_info_t 的定義(am_key_gpio.h)如下:
(1)serv_inf0
serv_info 包含LED 編號(hào)信息,其類型am_led_servinfo_t 定義如下:
一個(gè)LED 設(shè)備可能包含多個(gè)LED,start_id 為LED 的起始編號(hào),end_id 為LED 的結(jié)束編號(hào),LED數(shù)目為end_id–start_id+1。由于AM824-Core 開發(fā)板僅有LED0和LED1兩個(gè)LED,因此其起始編號(hào)為0,結(jié)束編號(hào)為1。
(2)p_pins
p_pins 指向存放各個(gè)LED 相應(yīng)引腳號(hào)的數(shù)組,比如,AM824-Core 開發(fā)板的LED0 通過J9 與MCU 的PIO0_20 相連,LED1 通過J10 與MCU 的PIO0_21 相連。基于此,定義一個(gè)存放引腳號(hào)的數(shù)組。比如:
該數(shù)組的地址為p_pins 的值。
當(dāng)引腳輸出低電平時(shí),則點(diǎn)亮LED,因此active_low 的值為AM_TRUE。實(shí)例信息定義如下:
基于實(shí)例和實(shí)例信息,即可完成LED 的初始化。比如:
當(dāng)完成初始化后,即可調(diào)用通用LED 接口操作LED0 和LED1。為了便于配置LED(修改實(shí)例信息),基于模塊化編程思想,將初始化相關(guān)的實(shí)例和實(shí)例信息等定義存放在LED 配置文件中,通過頭文件引出實(shí)例初始化函數(shù)接口,源文件和頭文件的程序范例分別詳見程序清單7.6 和程序清單7.7。
程序清單7.6 LED 實(shí)例初始化函數(shù)實(shí)現(xiàn)(am_hwconf_led_gpio.c)
程序清單7.7 LED 實(shí)例初始化函數(shù)聲明(am_hwconf_led_gpio.h)
后續(xù)只需要使用無參數(shù)的實(shí)例初始化函數(shù),即可完成LED 實(shí)例的初始化:
AM824-Core 的LED0 和LED1 作為一種板載資源,在系統(tǒng)啟動(dòng)時(shí)默認(rèn)進(jìn)行了初始化操作,因此應(yīng)用程序無需再調(diào)用實(shí)例初始化函數(shù),即可直接使用LED0 和LED1。
如果用戶不需要使用LED,為了節(jié)省內(nèi)存空間,可以將工程配置文件(am_prj_config.h)中的AM_CFG_LED_ENABLE 宏值修改為0,裁掉LED 程序,該宏本質(zhì)上控制了板級(jí)初始化函數(shù)中的一段程序,詳見程序清單7.8。
程序清單7.8 在板級(jí)初始化中裁剪LED 的原理
>>> 7.1.3 MiniPort-LED
MiniPort-LED 模塊由8 個(gè)LED 組成的, 當(dāng)MiniPort-LED 與AM824-Core 的PIO0_8~PIO0_15 相連時(shí),如果GPIO 輸出低電平,則點(diǎn)亮LED。由于MiniPort-LED 也是GPIO 驅(qū)動(dòng)型LED,因此可以使用與板載LED 相同的LED 驅(qū)動(dòng)。其實(shí)例定義如下:
為了避免與板載LED 編號(hào)沖突,Miniport-LED 應(yīng)該使用與板載LED 不同的編號(hào),比如,將編號(hào)定義為2~9。如果系統(tǒng)不使用板載LED0 和LED1(已將工程配置文件中的AM_CFG_LED_ENABLE 宏值修改為0),僅使用MiniPort-LED,則編號(hào)定義為 0~7。其實(shí)例信息定義如下:
基于實(shí)例和實(shí)例信息,即可完成Miniport-LED 的初始化。比如:
當(dāng)完成初始化后,即可調(diào)用通用LED 接口操作LED2~LED9。為了便于配置(修改實(shí)例信息)Miniport-LED,基于模塊化編程思想,將初始化相關(guān)的實(shí)例和實(shí)例信息等定義存放在Miniport-LED 的配置文件中,通過頭文件引出實(shí)例初始化函數(shù)接口,源文件和頭文件的程序范例分別詳見程序清單7.9 和程序清單7.10。
程序清單7.9 Miniport-LED 實(shí)例初始化函數(shù)實(shí)現(xiàn)(am_hwconf_miniport_led.c)
程序清單7.10 MiniPort-LED 實(shí)例初始化函數(shù)聲明(am_hwconf_miniport_led.h)
后續(xù)只需要使用無參數(shù)的實(shí)例初始化函數(shù),即可完成Miniport-LED 實(shí)例的初始化:
當(dāng)完成初始化后,即可使用通用LED 接口操作LED2~LED9。在AM824-Core 中,MiniPort-LED 作為可選的配板資源,在系統(tǒng)啟動(dòng)時(shí)沒有像板載LED0 和LED1 那樣默認(rèn)執(zhí)行初始化操作。如果要使用MiniPort-LED,則必須調(diào)用MiniPort-LED 實(shí)例初始化函數(shù)。
7.2 HC595 接口
>>> 7.2.1 HC595 通用接口
AMetal 提供了一套操作HC595 的通用接口,詳見表7.2。
表7.2 HC595 通用接口(am_hc595.h)
1. HC595 輸出
使能HC595 輸出的函數(shù)原型為:
其中,handle 為HC595 的實(shí)例句柄,可通過具體的HC595 驅(qū)動(dòng)初始化函數(shù)獲得。其類型am_hc595_handle_t(am_hc595.h)定義如下:
未使能時(shí),HC595 的輸出處于高阻狀態(tài),使能后才能正常輸出0 或1,范例程序詳見程序清單7.11。
程序清單7.11 am_hc595_enable()范例程序
其中,hc595_handle 可以通過具體的HC595 驅(qū)動(dòng)獲得,若HC595 使用SPI 驅(qū)動(dòng),則可以通過如下語句獲得:
該實(shí)例初始化函數(shù)am_miniport_595_inst_init()會(huì)在后面詳細(xì)介紹。
2. 禁能HC595 輸出
禁能后HC595 輸出處于高阻狀態(tài),其函數(shù)原型為:
其中,handle 為HC595 的實(shí)例句柄,范例程序詳見程序清單7.12。
程序清單7.12 am_hc595_disable()范例程序
3. 輸出數(shù)據(jù)
輸出數(shù)據(jù)的函數(shù)原型為:
其中,handle 為HC595 的實(shí)例句柄,p_data 為指向待輸出數(shù)據(jù)的緩沖區(qū),nbytes 指定了輸出數(shù)據(jù)的字節(jié)數(shù)。對(duì)于單個(gè)HC595,其只能并行輸出8 位數(shù)據(jù),即只能輸出單字節(jié)數(shù)據(jù),其范例程序詳見程序清單7.13。
程序清單7.13 輸出單字節(jié)數(shù)據(jù)的范例程序
當(dāng)需要并行輸出超過8 位數(shù)據(jù)時(shí),可以使用多個(gè)HC595 級(jí)聯(lián),此時(shí)即可輸出多字節(jié)數(shù)據(jù),范例程序詳見程序清單7.14。
程序清單7.14 輸出多字節(jié)數(shù)據(jù)的范例程序
對(duì)于MiniPort-HC595,僅包含一個(gè)HC595,因此每次只能輸出1 字節(jié)數(shù)據(jù)。
>>> 7.2.2 HC595 驅(qū)動(dòng)
AMetal 已經(jīng)提供基于SPI 的HC595 的驅(qū)動(dòng),該驅(qū)動(dòng)提供了一個(gè)初始化函數(shù),使用該函數(shù)初始化一個(gè)HC595 實(shí)例后,即可得到一個(gè)通用的HC595 實(shí)例句柄。其函數(shù)原型為:
-
p_dev 為指向am_hc595_spi_dev_t 類型實(shí)例的指針;
-
p_info 為指向am_hc595_spi_info_t 類型實(shí)例信息的指針。
1. 實(shí)例
定義am_hc595_spi_dev_t 類型(am_hc595_spi.h)實(shí)例如下:
其中,g_miniport_595 為用戶自定義的實(shí)例,其地址作為p_dev 的實(shí)參傳遞。
2. 實(shí)例信息
實(shí)例信息主要描述了HC595 的相關(guān)信息,比如,鎖存引腳、輸出使能引腳以及SPI 速率等,其類型am_hc595_spi_info_t 的定義(am_hc595_spi.h)如下:
其中,pin_lock 指定了HC595 的鎖存引腳,即STR 引腳,該引腳與LPC824 連接的引腳為PIO0_14,因此pin_lock 的值應(yīng)設(shè)置為PIO0_14。
pin_oe 指定了HC595 的輸出使能引腳,該引腳未與LPC824 連接,固定為低電平,因此pin_oe 的值應(yīng)設(shè)置為-1。
clk_speed 指定了SPI 的速率,可根據(jù)實(shí)際需要設(shè)定,若HC595 的輸出用于驅(qū)動(dòng)LED 或數(shù)碼管等設(shè)備,則對(duì)速率要求并不高,可設(shè)置為 300000(300KHz)。
lsb_first 決定了一個(gè)8 位數(shù)據(jù)在輸出時(shí),輸出位的順序,若該值為AM_TRUE,則表明最低位先輸出,最高位后輸出,若該值為AM_FALSE,則表明最低位后輸出,最高位先輸出,最先輸出的位決定了HC595 輸出端Q7 的電平,最后輸出的位決定了HC595 輸出端Q0的電平。如設(shè)置為AM_TRUE,當(dāng)后續(xù)發(fā)現(xiàn)輸出順序與期望輸出的順序相反時(shí),可再將該值修改為AM_FALSE?;谝陨闲畔?,實(shí)例信息可以定義如下:
3. SPI 句柄handle
若使用LPC824 的SPI0 驅(qū)動(dòng)HC595 輸出,則通過LPC82x 的SPI0 實(shí)例初始化函數(shù)am_lpc82x_spi0_inst_init()獲得SPI 句柄。即:
SPI 句柄即可直接作為handle 的實(shí)參傳遞。
3. 實(shí)例句柄
HC595 初始化函數(shù)am_hc595_spi_init ()的返回值即為HC595 實(shí)例的句柄,其作為HC595通用接口第一個(gè)參數(shù)(handle)的實(shí)參。其類型am_hc595_handle_t(am_hc595.h)定義如下:
若返回值為NULL,說明初始化失??;若返回值不為NULL,說明返回了有效的handle。
基于模塊化編程思想,將初始化相關(guān)的實(shí)例和實(shí)例信息等定義存放在對(duì)應(yīng)的配置文件中,通過頭文件引出實(shí)例初始化函數(shù)接口,源文件和頭文件的程序范例分別詳見程序清單7.15和程序清單7.16。
程序清單7.15 實(shí)例初始化函數(shù)范例程序(am_hwconf_miniport_595.c)
程序清單7.16 實(shí)例初始化函數(shù)接口(am_hwconf_miniport_595.h)
后續(xù)只需要使用無參數(shù)的實(shí)例初始化函數(shù),即可獲取到HC595 的實(shí)例句柄:
當(dāng)直接使用AM824-Core 與MiniPort-LED連接時(shí),使用8 個(gè)GPIO 控制8 個(gè)LED,得益于MiniPort 接口的靈活性。當(dāng)GPIO 資源不足時(shí),可以在AM824-Core 與MiniPort-LED 之間增加MiniPort-595,使用595 的輸出控制LED,達(dá)到節(jié)省引腳的目的。
當(dāng)將MiniPort-595 和MiniPort-LED 連接后,等效的原理圖詳見圖7.1。
圖7.1 MiniPort-595+MiniPort-LED
通過控制HC595的輸出,可以達(dá)到控制LED 點(diǎn)亮和熄滅的效果,范例詳見程序清單7.17。
程序清單7.17 74HC595 驅(qū)動(dòng)LED 的范例程序
由此可見,通用接口的好處就是屏蔽了底層的差異性,使得無論底層硬件怎么變化,應(yīng)用程序都可以使用同一套接口操作LED。顯然,無論是使用GPIO 直接驅(qū)動(dòng)MiniPort-LED還是使用HC595 驅(qū)動(dòng)MiniPort-LED,對(duì)于用戶來說,都可以使用標(biāo)準(zhǔn)接口訪問。AMeatl 提供了使用HC595 控制LED 的驅(qū)動(dòng),使用初始化函數(shù)完成相應(yīng)實(shí)例的初始化后,即可使用通用接口操作LED。
>>> 7.2.3 使用HC595 驅(qū)動(dòng)LED
AMetal 已經(jīng)提供了使用HC595 控制LED 的驅(qū)動(dòng),該驅(qū)動(dòng)提供了一個(gè)初始化函數(shù),使用該函數(shù)初始化一個(gè)LED 實(shí)例后,即可使用通用LED 接口操作LED。其函數(shù)原型為:
-
p_dev 為指向am_led_hc595_dev_t 類型實(shí)例的指針;
-
p_info 為指向am_led_hc595_info_t 類型實(shí)例信息的指針。
1. 實(shí)例
定義am_led_hc595_dev_t 類型(am_led_hc595.h)實(shí)例如下:
其中,g_miniport_led_595 為用戶自定義的實(shí)例,其地址作為p_dev 的實(shí)參傳遞。
2. 實(shí)例信息
實(shí)例信息主要描述了HC595 驅(qū)動(dòng)LED 的相關(guān)信息,比如,LED 是否低電平點(diǎn)亮,對(duì)應(yīng)的LED 編號(hào)等信息。其類型am_led_hc595_info_t 的定義(am_led_hc595.h)如下:
(1)serv_info
serv_info 包含了通用接口訪問LED 的編號(hào)信息,當(dāng)使用HC595 驅(qū)動(dòng)時(shí),編號(hào)信息可以保持不變,同樣為2~9。
(2)hc595_num
hc595_num 表示HC595 的個(gè)數(shù),顯然一個(gè)HC595 只能輸出8 位數(shù)據(jù),因此最多控制8個(gè)LED。當(dāng)需要控制的LED 數(shù)目超過8 個(gè)時(shí),則需要使用多個(gè)HC595 級(jí)聯(lián)。對(duì)于MiniPort-LED,其僅僅只有8 個(gè)LED,恰好使用一個(gè)HC595 控制8 個(gè)LED,因此hc595_num的值應(yīng)設(shè)置為1。
(3)p_buf
p_buf 是指向一個(gè)大小為hc595_num 的緩沖區(qū)的指針,用于緩存各個(gè)595 當(dāng)前的輸出值。由于hc595_num 的值設(shè)置為1,因此緩存的大小也為1,緩存定義如下:
其中,g_miniport_led_595_buf 為緩存首地址,即可作為p_buf 的值。
基于以上信息,實(shí)例信息定義如下:
3. HC595 句柄handle
若使用Miniport-595 的輸出控制MiniPort-LED,則應(yīng)通過MiniPort-595 的實(shí)例初始化函數(shù)am_miniport_595_inst_init()獲得HC595 的句柄。即:
HC595 句柄即可直接作為handle 的實(shí)參傳遞,基于實(shí)例、實(shí)例信息和HC595 句柄,即可完成LED 實(shí)例的初始化:
由于HC595 是LED 的另一種驅(qū)動(dòng)方式,因此將其新增到am_hwconf_miniport_led.c 文件中。為了便于使用,將實(shí)例初始化函數(shù)的聲明新增到am_hwconf_miniport_led.h 文件中,詳見程序清單7.18 和程序清單7.19。
程序清單7.18 實(shí)例初始化函數(shù)范例程序(am_hwconf_miniport_led.c)
程序清單7.19 am_hwconf_miniport_led.h 文件更新
后續(xù)只需要使用無參數(shù)的實(shí)例初始化函數(shù),即可完成Miniport-LED 實(shí)例的初始化:
當(dāng)完成初始化后,即可調(diào)用通用LED 接口操作LED~LED9。MiniPort-LED 有兩種驅(qū)動(dòng)方式:GPIO 驅(qū)動(dòng)和HC595 驅(qū)動(dòng),當(dāng)使用MiniPort-LED 時(shí),應(yīng)該根據(jù)實(shí)際情況選擇對(duì)應(yīng)的實(shí)例初始化函數(shù)。但無論何種驅(qū)動(dòng)方式,在完成初始化后,對(duì)于應(yīng)用程序來說都是調(diào)用通用LED 接口操作LED2~LED9。
7.3 蜂鳴器控制接口
>>> 7.3.1 蜂鳴器通用接口
為了實(shí)現(xiàn)跨平臺(tái)開發(fā)應(yīng)用軟件,AMetal 提供了操作蜂鳴器的通用接口,詳見表7.3。
表7.3 蜂鳴器通用接口(am_buzzer.h)
1. 打開蜂鳴器
打開蜂鳴器的函數(shù)原型為:
打開蜂鳴器,使蜂鳴器開始鳴叫的范例程序詳見程序清單7.20。
程序清單7.20 am_buzzer_on()范例程序
2. 關(guān)閉蜂鳴器
關(guān)閉蜂鳴器的函數(shù)原型為:
關(guān)閉蜂鳴器,使蜂鳴器停止鳴叫的范例程序詳見程序清單7.21。
程序清單7.21 am_buzzer_off()范例程序
3. 蜂鳴器鳴叫指定時(shí)間(同步)
該函數(shù)用于打開蜂鳴器,使蜂鳴器鳴叫指定時(shí)間后自動(dòng)關(guān)閉,該函數(shù)會(huì)一直等到蜂鳴器鳴叫結(jié)束后返回。其函數(shù)原型為:
使蜂鳴器鳴叫50 毫秒(“嘀”一聲)的范例程序詳見程序清單7.22。
程序清單7.22 am_buzzer_beep()范例程序
注意,由于該函數(shù)會(huì)一直等到蜂鳴器鳴叫結(jié)束后才會(huì)返回,因此主程序調(diào)用該函數(shù)后,會(huì)阻塞50ms。
4. 蜂鳴器鳴叫指定時(shí)間(異步)
該函數(shù)用于打開蜂鳴器,使蜂鳴器鳴叫指定時(shí)間后自動(dòng)關(guān)閉,與am_buzzer_beep()函數(shù)不同的是,該函數(shù)會(huì)立即返回,不會(huì)等待蜂鳴器鳴叫結(jié)束。其函數(shù)原型為:
使蜂鳴器鳴叫50 毫秒(“嘀”一聲)的范例程序詳見程序清單7.23。
程序清單7.23 am_buzzer_beep_async()范例程序
注意,由于該函數(shù)不會(huì)等待蜂鳴器鳴叫結(jié)束,因此,主程序調(diào)用該函數(shù)后,會(huì)立即返回,不會(huì)被阻塞。顯然,要使應(yīng)用程序可以使用通用接口操作蜂鳴器,就需要為具體的蜂鳴器設(shè)備提供相應(yīng)的驅(qū)動(dòng)。
>>> 7.3.2 無源蜂鳴器驅(qū)動(dòng)
無源蜂鳴器內(nèi)部沒有震蕩源,需要外部使用一定頻率的方波信號(hào)驅(qū)動(dòng)才能發(fā)聲。AMetal已經(jīng)提供了無源蜂鳴器的驅(qū)動(dòng),直接輸出PWM 驅(qū)動(dòng)無源蜂鳴器發(fā)聲。其函數(shù)原型為:
其中,pwm_handle 為標(biāo)準(zhǔn)的PWM 服務(wù)句柄,chan 為PWM 通道號(hào),duty_ns 為和period_ns分別指定了輸出PWM 波形的脈寬和周期,決定了蜂鳴器鳴叫的響度和頻率。AM824-Core板載了一個(gè)無源蜂鳴器。只要短接J7_1 與J7_2,則蜂鳴器接入PIO0_24。
LPC82x 能夠提供PWM 輸出功能的外設(shè)是SCT(State Configurable Timer),AMetal 提供了對(duì)應(yīng)的實(shí)例初始化函數(shù),其原型為:
若需使用SCT 輸出PWM,只需調(diào)用其對(duì)應(yīng)的實(shí)例初始化函數(shù)即可獲取標(biāo)準(zhǔn)的PWM 服務(wù)句柄:
獲取的PWM 服務(wù)句柄即可作為am_buzzer_pwm_init()函數(shù)pwm_handle 的實(shí)參傳遞,當(dāng)SCT 用作PWM 功能時(shí),支持6 個(gè)通道,即可同時(shí)輸出6 路PWM,各通道對(duì)應(yīng)的I/O 口詳見表7.4。
表7.4 各通道對(duì)應(yīng)的IO 口
由于無源蜂鳴器使用的引腳為PIO0_24,其對(duì)應(yīng)的通道為1,因此,chan 參數(shù)的值應(yīng)設(shè)置為1。duty_ns 為和period_ns 分別指定了輸出PWM波形的脈寬和周期,若頻率設(shè)置為2500Hz,則對(duì)應(yīng)的周期時(shí)間為:400000ns(1000000000 / 2500),占空比通常為50%(脈寬時(shí)間為周期時(shí)間的一半),即脈寬時(shí)間為:200000ns。實(shí)際中,可以根據(jù)實(shí)際發(fā)聲效果修改脈寬時(shí)間和周期時(shí)間。
基于對(duì)各個(gè)參數(shù)的分析,即可調(diào)用am_buzzer_pwm_init()完成無源蜂鳴器的初始化:
無源蜂鳴器作為一種板載資源,在系統(tǒng)啟動(dòng)時(shí)已經(jīng)默認(rèn)進(jìn)行了初始化操作,因此應(yīng)用程序無需再手動(dòng)調(diào)用無源蜂鳴器初始化函數(shù),就可以直接使用通用接口操作蜂鳴器。
若用戶不需要使用蜂鳴器,為了節(jié)省內(nèi)存空間,可以將工程配置文件(am_prj_config.h)中的AM_CFG_BUZZER_ENABLE 宏值修改為0,以裁剪掉蜂鳴器,該宏本質(zhì)上控制了板級(jí)初始化函數(shù)中的一段程序,詳見程序清單7.24。
程序清單7.24 在板級(jí)初始化中裁剪蜂鳴器的原理
注:板級(jí)初始化函數(shù)在系統(tǒng)啟動(dòng)時(shí)自動(dòng)調(diào)用,初始化完畢后才會(huì)進(jìn)入應(yīng)用程序入口,即am_main()。
-
led
+關(guān)注
關(guān)注
240文章
23071瀏覽量
657076 -
接口
+關(guān)注
關(guān)注
33文章
8451瀏覽量
150728 -
周立功
+關(guān)注
關(guān)注
38文章
130瀏覽量
37556 -
ametal
+關(guān)注
關(guān)注
2文章
24瀏覽量
11386
原文標(biāo)題:周立功:面向通用接口的編程——LED 控制接口、HC595 接口、蜂鳴器控制接口
文章出處:【微信號(hào):Zlgmcu7890,微信公眾號(hào):周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論