0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32F103的CH101驅(qū)動(dòng)程序移植

zhc135136 ? 來(lái)源:SmartHWFW ? 2023-04-12 09:37 ? 次閱讀

有許多朋友在移植CHX01超聲波傳感器的過(guò)程中可能會(huì)遇到一些挑戰(zhàn),因此本文將重點(diǎn)介紹一些核心問(wèn)題。雖然本來(lái)有想以手把手的方式來(lái)教授如何移植,但是由于之前移植的時(shí)候沒(méi)有保存具體過(guò)程中的圖文,所以需要花費(fèi)很長(zhǎng)的時(shí)間來(lái)重新完成這項(xiàng)工作。文末也提供了獲取資源的接口,以幫助大家解決移植中出現(xiàn)的問(wèn)題。

01準(zhǔn)備資料

1. 從官網(wǎng)獲取 SmartSonic_HelloChirp_Example_v1_31_0.exe

源碼(CHx01 官網(wǎng)源碼的硬件平臺(tái) MCU: ATSAMG55;IDE:Microchip Studio)

2. 獲取一個(gè) STM32F103CB 的例程,比如我直接使用 STM32CubeF1 的模板。(當(dāng)然你也可以用 STM32CubeIDE 創(chuàng)建一個(gè)工程)在這之前,假設(shè)你已經(jīng)掌握了 Keil IDE 工程下的文件添加、編譯等操作。比如,如下截圖,我精簡(jiǎn)了STM32CubeF1 的模板,將工程名稱修改為:SmartSonic_HelloChirp,并在工程下新建了 Drivers/BSP 和 Drivers/chirpmicro 兩個(gè)Groups。

8c888f54-d88a-11ed-bfe3-dac502259ad0.png

3. 將SmartSonic_HelloChirp_Example_v1_31_0文件中

SmartSonic_HelloChirp_v1.31.0sourcedriverschirpmicro路徑下的src 和 inc 文件夾拷貝到自己的STM32工程的smart-sonic_-hello-chirpDriverschirpmicro目錄下

8ca99c6c-d88a-11ed-bfe3-dac502259ad0.png

02API接口封裝

我在之前的文章《超聲波傳感器(CHx01) 學(xué)習(xí)筆記 Ⅲ-API介紹》中提到所需API接口的相關(guān)內(nèi)容。同樣,在官方提供的例程中有一個(gè) chbsp_dummy.c 文件,它使用 `attribute((weak))` 的方式提供了可選板支持包IO功能的虛擬實(shí)現(xiàn),可以讓平臺(tái)依據(jù)需求來(lái)支持所需的功能。這種 `attribute((weak))` 例程能夠滿足來(lái)自其他代碼的引用,避免鏈接出現(xiàn)錯(cuò)誤,但它們不會(huì)執(zhí)行任何操作。所有板卡支持包接口的詳細(xì)信息,包括這些可選功能,都可以在 chirp_bsp.h 中找到。

/* Functions supporting debugging */
__attribute__((weak)) void chbsp_debug_toggle(uint8_t __attribute__((unused)) dbg_pin_num) {}
__attribute__((weak)) void chbsp_debug_on(uint8_t __attribute__((unused)) dbg_pin_num) {}
__attribute__((weak)) void chbsp_debug_off(uint8_t __attribute__((unused)) dbg_pin_num) {}
__attribute__((weak)) void chbsp_print_str(char *str) {
    (void)(str);
}
__attribute__((weak)) uint32_t chbsp_timestamp_ms() {
return 0;
}
__attribute__((weak)) int chbsp_i2c_deinit(void){
return 0;
}




/* Functions supporting interrupt-based operation */
__attribute__((weak)) void chbsp_group_io_interrupt_enable(ch_group_t *grp_ptr) {
    (void)(grp_ptr);
}
__attribute__((weak)) void chbsp_io_interrupt_enable(ch_dev_t *dev_ptr) {
    (void)(dev_ptr);
}
__attribute__((weak)) void chbsp_group_io_interrupt_disable(ch_group_t *grp_ptr) {
    (void)(grp_ptr);
}
__attribute__((weak)) void chbsp_io_interrupt_disable(ch_dev_t *dev_ptr) {
    (void)(dev_ptr);
}


/* Functions supporting non-blocking operation */
__attribute__((weak)) int chbsp_i2c_write_nb(ch_dev_t *dev_ptr, uint8_t *data, uint16_t num_bytes) {
    (void)(dev_ptr);
    (void)(data);
    (void)(num_bytes);
return 1;
}


__attribute__((weak)) 
int chbsp_i2c_mem_write_nb(ch_dev_t *dev_ptr, uint16_t mem_addr, uint8_t *data, uint16_t num_bytes) {
    (void)(dev_ptr);
    (void)(mem_addr);
    (void)(data);
    (void)(num_bytes);
return 1;
}


__attribute__((weak)) int chbsp_i2c_read_nb(ch_dev_t *dev_ptr, uint8_t *data, uint16_t num_bytes) {
    (void)(dev_ptr);
    (void)(data);
    (void)(num_bytes);
return 1;
}


__attribute__((weak)) int chbsp_i2c_mem_read_nb(ch_dev_t *dev_ptr, uint16_t mem_addr, uint8_t *data, uint16_t num_bytes) {
    (void)(dev_ptr);
    (void)(mem_addr);
    (void)(data);
    (void)(num_bytes);
return 1;
}




/* Functions supporting controlling int pins of individual sensors (originally only controllable in a group) */
__attribute__((weak)) void chbsp_set_io_dir_out(ch_dev_t *dev_ptr) {
    (void)(dev_ptr);
}
__attribute__((weak)) void chbsp_set_io_dir_in(ch_dev_t *dev_ptr) {
    (void)(dev_ptr);
}
__attribute__((weak)) void chbsp_io_clear(ch_dev_t *dev_ptr) {
    (void)(dev_ptr);
}
__attribute__((weak)) void chbsp_io_set(ch_dev_t *dev_ptr) {
    (void)(dev_ptr);
}
__attribute__((weak)) void chbsp_external_i2c_irq_handler(chdrv_i2c_transaction_t *trans){
    (void)(trans);
}

超聲波傳感器(CHx01) 學(xué)習(xí)筆記 Ⅱ- I2C讀寫操作》中有詳細(xì)的介紹,按照上述API接口逐個(gè)封裝函數(shù)內(nèi)容即可。

03API接口驗(yàn)證

假設(shè)你已經(jīng)將MAX3378EEUD和74LVC1T45用于IO口電平轉(zhuǎn)換,接下來(lái)就是如何獲取傳感器的固定ID,以此來(lái)驗(yàn)證I2C通信接口的正確性。獲取ID的方式可以幫助我們更好地驗(yàn)證I2C通信接口的封裝正確性。

8cc4451c-d88a-11ed-bfe3-dac502259ad0.png

獲取傳感器 ID流程圖

8cd90330-d88a-11ed-bfe3-dac502259ad0.png

獲取傳感器 IDI2C讀時(shí)序圖

04關(guān)鍵API接口介紹

`int chbsp_i2c_mem_read(ch_dev_t *dev_ptr, uint16_t mem_addr, uint8_t *data, uint16_t num_bytes)`

這個(gè) API 使用內(nèi)存尋址從I2C從機(jī)讀取字節(jié)。需要封裝成一個(gè),指定一個(gè)字節(jié)寄存器地址并從Slave讀取多個(gè)字節(jié)的函數(shù)。

與 STM32 HAL庫(kù)相關(guān)的函數(shù)是:HAL_I2C_Mem_Read(&hi2c1, Address << 1, RegisterAddr, 1, (uint8_t *)(uint32_t)RegisterValue, (uint16_t)RegisterLen, 1000)

`int chbsp_i2c_read(ch_dev_t *dev_ptr, uint8_t *data, uint16_t num_bytes)`

這個(gè) API 是原始的I2C從機(jī)讀取字節(jié)。需要封裝成一個(gè),從Slave讀取多字節(jié)的函數(shù)。

與 STM32 HAL庫(kù)相關(guān)的函數(shù)是:HAL_I2C_Master_Receive(&hi2c1, (Address << 1), (uint8_t *)(uint32_t)data, (uint16_t)len, 1000)

`int chbsp_i2c_mem_write(ch_dev_t *dev_ptr, uint16_t mem_addr, uint8_t *data, uint16_t num_bytes)`

這個(gè) API 使用內(nèi)存尋址將字節(jié)寫入I2C從機(jī)。需要封裝成一個(gè),指定一個(gè)字節(jié)寄存器地址并將多個(gè)字節(jié)寫入從機(jī)的函數(shù)。

與 STM32 HAL庫(kù)相關(guān)的函數(shù)是:HAL_I2C_Mem_Write(&hi2c1, Address << 1, RegisterAddr, 1, (uint8_t *)(uint32_t)RegisterValue, (uint32_t)RegisterLen, 1000)

`int chbsp_i2c_write(ch_dev_t *dev_ptr, uint8_t *data, uint16_t num_bytes)`

這個(gè) API 是原始的將字節(jié)寫入I2C從機(jī)。需要封裝成一個(gè),將多字節(jié)寫入從機(jī)的函數(shù)。

與 STM32 HAL庫(kù)相關(guān)的函數(shù)是:HAL_I2C_Master_Transmit(&hi2c1, (Address << 1), (uint8_t *)(uint32_t)data, (uint32_t)len, 1000)

`void chbsp_delay_ms(uint32_t num_ms)`

`void chbsp_delay_us(uint32_t us)`

這兩個(gè)延時(shí)函數(shù)要精準(zhǔn),尤其是 chbsp_delay_ms 毫秒延時(shí),會(huì)直接影響傳感器的輸出頻率。

下面這兩個(gè)函數(shù),我們無(wú)需自行封裝任何內(nèi)容,但是它們非常重要。

`int chdrv_group_detect_and_program(ch_group_t *grp_ptr)`

這個(gè)函數(shù)用來(lái)檢測(cè)、編程和啟動(dòng)傳感器。對(duì)于每個(gè)檢測(cè)到的傳感器,會(huì)將傳感器固件被編程到設(shè)備中,并設(shè)置應(yīng)用程序I2C地址。然后傳感器復(fù)位并開(kāi)始執(zhí)行。

一旦啟動(dòng),傳感器設(shè)備將開(kāi)始內(nèi)部初始化和自檢序列。chdrv_group_wait_for_lock()函數(shù)可用于等待此序列在設(shè)備上完成。此函數(shù)完成后,將使設(shè)備的PROG引腳解除。

`void chdrv_group_measure_rtc(ch_group_t *grp_ptr)`

這個(gè)函數(shù)用來(lái) 校準(zhǔn)傳感器實(shí)時(shí)時(shí)鐘。在這個(gè)函數(shù)里 觸發(fā)IO引腳上的脈沖 時(shí)與選擇的主處理器的時(shí)鐘相關(guān)。

此函數(shù)在INT 引腳上向傳感器設(shè)備發(fā)送一個(gè)脈沖(由主機(jī)MCU定時(shí)),然后回讀每個(gè)單獨(dú)設(shè)備上該脈沖期間經(jīng)過(guò)的傳感器RTC周期的計(jì)數(shù)。結(jié)果存儲(chǔ)在每個(gè)設(shè)備的ch_dev_config結(jié)構(gòu)中,隨后在范圍計(jì)算期間使用。

脈沖的長(zhǎng)度為dev_ptr->rtc_cal_pulse_ms毫秒(通常為100)。此值在ch_init()期間設(shè)置。

如果有多個(gè)傳感器時(shí),校準(zhǔn)脈沖會(huì)同時(shí)發(fā)送到所有設(shè)備。因此,所有連接的設(shè)備將看到相同的參考脈沖長(zhǎng)度。

還需要實(shí)現(xiàn)兩個(gè)外設(shè)功能

定時(shí)器,定時(shí)周期100ms,在定時(shí)器回調(diào)函數(shù)中周期性調(diào)用

`int chdrv_group_hw_trigger(ch_group_t *grp_ptr)` 啟動(dòng)硬件觸發(fā)模式下開(kāi)始測(cè)量。

int chdrv_group_hw_trigger(ch_group_t *grp_ptr) 函數(shù)通過(guò)簡(jiǎn)單地檢測(cè)INT 引腳上每個(gè)傳感器開(kāi)始被觸發(fā)的測(cè)量。在調(diào)用此函數(shù)之前,每個(gè)傳感器必須已置于硬件觸發(fā)模式。

GPIO外部中斷,在外部中斷回調(diào)函數(shù)中調(diào)用

`sensor_int_callback()` 檢測(cè)傳感器的中斷信號(hào)。每次調(diào)用此函數(shù)時(shí),都會(huì)在data_ready_devices變量中設(shè)置一個(gè)位以標(biāo)識(shí)中斷設(shè)備。當(dāng)傳感器產(chǎn)生中斷(通過(guò)與active_devices變量比較找到)時(shí),DATA_READY_FLAG被設(shè)置。該標(biāo)志將在main()循環(huán)中檢測(cè)到。

8cf2a128-d88a-11ed-bfe3-dac502259ad0.png

一個(gè)完成的硬件觸發(fā)INT硬件,并接收傳感器返回的INT信號(hào)的時(shí)序圖

05程序流程圖

主程序

8d12e4e2-d88a-11ed-bfe3-dac502259ad0.png

定時(shí)器服務(wù)程序

8d2e269e-d88a-11ed-bfe3-dac502259ad0.png

INT外部中斷服務(wù)程序

8d44b03a-d88a-11ed-bfe3-dac502259ad0.png

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16918

    瀏覽量

    349988
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8459

    瀏覽量

    150748
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10858

    瀏覽量

    354391
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    376

    瀏覽量

    28098
  • STM32F103
    +關(guān)注

    關(guān)注

    33

    文章

    475

    瀏覽量

    63424

原文標(biāo)題:基于STM32F103的CH101驅(qū)動(dòng)程序移植

文章出處:【微信號(hào):SmartHWFW,微信公眾號(hào):SmartHWFW】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32F103控制ad7606采集程序分享

    本文首先分析了了stm32f103系列的性能如何,其次介紹了ad7606特性,最后介紹了STM32F103控制ad7606采集程序。
    的頭像 發(fā)表于 05-21 11:31 ?3w次閱讀

    使用STIM32F101xx和STM32F103的智能卡接口

    使用STIM32F101xx和STM32F103的智能卡接口
    發(fā)表于 05-20 16:29 ?15次下載

    STM32F103芯片F(xiàn)FT程序

    STM32F103芯片使用DSP庫(kù)進(jìn)行FFT運(yùn)算的資料與程序。
    發(fā)表于 06-07 16:30 ?109次下載

    stm32f103寫的菜單管理程序

    stm32f103寫的菜單管理程序,支持無(wú)限嵌套程序里有使用說(shuō)明,12864采用串口驅(qū)動(dòng)
    發(fā)表于 07-27 16:32 ?69次下載

    盤古STM32F103開(kāi)發(fā)板移植uCGUI教程

    盤古STM32F103開(kāi)發(fā)板移植uCGUI教程
    發(fā)表于 09-29 09:21 ?21次下載
    盤古<b class='flag-5'>STM32F103</b>開(kāi)發(fā)板<b class='flag-5'>移植</b>uCGUI教程

    stm32f103移植

    stm32f103移植
    發(fā)表于 10-27 09:03 ?43次下載
    <b class='flag-5'>stm32f103</b><b class='flag-5'>移植</b>

    淺談CC1101驅(qū)動(dòng)STM32F103移植

    最后,TI驅(qū)動(dòng)里提供的是輪詢的方式收發(fā)數(shù)據(jù),對(duì)于初期來(lái)說(shuō),首先需要實(shí)現(xiàn)CC1101的工作,編譯調(diào)試移植STM32上的CC1101驅(qū)動(dòng)代碼,看見(jiàn)數(shù)據(jù)從接收端串口打印出的那瞬間,心情真心
    的頭像 發(fā)表于 09-06 15:18 ?7738次閱讀
    淺談CC1101<b class='flag-5'>驅(qū)動(dòng)</b>在<b class='flag-5'>STM32F103</b>的<b class='flag-5'>移植</b>

    STM32F103數(shù)字電位器X9C103驅(qū)動(dòng)程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32F103數(shù)字電位器X9C103驅(qū)動(dòng)程序免費(fèi)下載。
    發(fā)表于 06-27 08:00 ?188次下載
    <b class='flag-5'>STM32F103</b>數(shù)字電位器X9C<b class='flag-5'>103</b>的<b class='flag-5'>驅(qū)動(dòng)程序</b>免費(fèi)下載

    STM32F103驅(qū)動(dòng)OLED的C語(yǔ)言程序和工程文件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32F103驅(qū)動(dòng)OLED的C語(yǔ)言程序和工程文件免費(fèi)下載。
    發(fā)表于 12-23 08:00 ?23次下載
    <b class='flag-5'>STM32F103</b><b class='flag-5'>驅(qū)動(dòng)</b>OLED的C語(yǔ)言<b class='flag-5'>程序</b>和工程文件免費(fèi)下載

    STM32F103 CAN模板程序

    STM32F103 CAN模板程序
    發(fā)表于 11-09 11:08 ?67次下載
    <b class='flag-5'>STM32F103</b> CAN模板<b class='flag-5'>程序</b>

    基于STM32f103的FFT頻率測(cè)試程序下載

    基于STM32f103的FFT頻率測(cè)試程序下載
    發(fā)表于 08-02 10:07 ?166次下載

    在GD32F103移植STM32F103代碼

    在GD32F103移植STM32F103代碼使用相同F(xiàn)LASH和管腳數(shù)量相同的芯片,例如GDF103C8T6移植
    發(fā)表于 12-02 15:21 ?23次下載
    在GD32<b class='flag-5'>F103</b><b class='flag-5'>移植</b><b class='flag-5'>STM32F103</b>代碼

    RT-Thread系統(tǒng)移植STM32f103

    RT-Thread系統(tǒng)移植STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    RT-Thread系統(tǒng)<b class='flag-5'>移植</b>到<b class='flag-5'>STM32f103</b>

    基于STM32F103的DAC8411驅(qū)動(dòng)程序

    基于STM32F103的DAC8411驅(qū)動(dòng)程序,親測(cè)可用,歡迎大家一起交流
    發(fā)表于 08-28 11:21 ?16次下載

    ch32v103stm32f103的區(qū)別

    ch32v103stm32f103的區(qū)別? Ch32v103STM32f103是兩種不同的芯片,雖然它們都是基于ARM Cortex-M3內(nèi)核的32位微控制器,但它們?cè)谟布渲?、?/div>
    的頭像 發(fā)表于 08-22 15:49 ?2384次閱讀