

本文適用于零基礎(chǔ),手把手搭建基于STM32單片機(jī)控制億佰特公司E22-xxxMxx、E220-xxxMxx、E32-xxxMxx的LoRa模塊,旨在降低M系列LoRa模塊開發(fā)難度,幫助大家更快上手M系列的LoRa模組?!?/span>零基礎(chǔ)搭建基于STM32單片機(jī)的M系列LoRa模塊透傳教程一》主要介紹了CubeMX代碼文件的生成,本文將會介紹 Keil代碼的移植 為核心教程。
本文使用E22系列模塊,使用的射頻芯片為sx126x,可以在Semtech官網(wǎng)進(jìn)行下載sx126x驅(qū)動文件,下載地址如下https://github.com/Lora-net/sx126x_driver/archive/refs/tags/v2.2.zip 。
把下載好的文件解壓縮,得到“sx126x_driver-x.x.x”文件夾,把此文件夾移動到XXSTM32_MDrivers項(xiàng)目的驅(qū)動文件夾下。打開keil工程“STM32_M.uvprojx”,按照如圖1所示,添加sx126x驅(qū)動.c文件。

圖1
再通過圖2所示,添加sx126x驅(qū)動.h文件。注意“序號5”文件路徑是XXSTM32_MDriverssx126x_driver-2.2src。

圖2
e22_hal.c代碼見附件1,e22_demo.c代碼見附件2。
在XXSTM32_MCoreSrc文件下創(chuàng)建“e22_hal.c”文件,名字可以自己取。然后按照圖3所示,添加e22_hal.c文件。

圖3
然后在e22_hal.c文件中進(jìn)行代碼的編寫,先引用sx126x、gpio和spi的頭文件,如圖4所示。

圖4
編寫射頻模組復(fù)位函數(shù)和狀態(tài)忙等待函數(shù),如圖5所示。

圖5
編寫射頻模組喚醒函數(shù),如圖6所示。

圖6
編寫射頻模組寄存器寫入函數(shù),如圖7所示。

圖7
編寫射頻模組寄存器讀取函數(shù),如圖8所示。

圖8
編寫射頻模組發(fā)送和接收切換函數(shù),如圖9所示。

圖9
最后在e22_hal.h文件的最末尾加上如下代碼,詳細(xì)見圖9(2)所示。
sx126x_hal_status_t sx126x_rf_switch_tx(void);
sx126x_hal_status_t sx126x_rf_switch_rx(void);

圖9(2)
在XXSTM32_MCoreSrc文件下創(chuàng)建“e22_demo.c”文件和e22_demo.h,名字可以自己取。然后在Keil中像添加e22_hal.c文件一樣添加e22_ demo.c文件。
然后在e22_demo.c文件中進(jìn)行代碼編寫,如圖10所示,引用頭文件和書寫相關(guān)結(jié)構(gòu)體,注意配置默認(rèn)參數(shù)時(shí),要注意自己模塊的初始頻率,本文使用的170MHz的頻率,因此選擇frequency_mhz = 170。

圖10
編寫射頻模組SPI讀寫測試和晶振啟動測試函數(shù),如圖11所示。

圖11
編寫射頻模組初始化函數(shù),如圖12所示,注意圖中紅色框框的內(nèi)容,選擇自己模塊的對應(yīng)頻率,本文使用模塊的頻率為170Mhz。

圖12
編寫射頻模組重新配置參數(shù)函數(shù),如圖13所示。

圖13
編寫射頻模組的射頻發(fā)射函數(shù),如圖14所示。

圖14
編寫射頻模組的持續(xù)接收函數(shù),如圖15所示。

圖15
編寫射頻模組查詢是否有接收數(shù)據(jù)的函數(shù),如圖16所示。

圖16
編寫射頻模組中斷響應(yīng)函數(shù),如圖17和圖18所示。

圖17

圖18
在main.h文件中,添加頭文件引用,結(jié)構(gòu)體和函數(shù)聲明,代碼如下,具體見圖19和2.20所示。

圖19

圖20
在stm32f4xx_it.c文件中(不同型號的單片機(jī)的文件名不一樣),添加中斷回調(diào)函數(shù),最好在void EXTI3_IRQHandler(void)函數(shù)下方,添加如下函數(shù),詳細(xì)見圖21所示。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == DIO1_Pin )
{
e22_demo_dio1_interrupt_callback();
}
}

圖21
在main.c文件中,while(1)前面和while(1)里面添加如下代碼,詳細(xì)見圖2.1所示。
e22_demo_init();
e22_demo_menu_config( &user_config );
e22_demo_receive();
static uint8_t rx_mode_buffer[255];
static uint8_t rx_mode_length = 0;
int8_t rx_rssi = 0;
if( e22_demo_check_rx_done( rx_mode_buffer, &rx_mode_length, &rx_rssi) == true )
{
/* 如果接收到數(shù)據(jù),燈進(jìn)行閃爍 */
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
}

圖2.1
軟件配置好了,接線按照STM32CubeMX配置的進(jìn)行連線,下圖2.2是本文使用的單片機(jī)與無線模塊的接線,最后下載程序到單片機(jī),射頻模塊接上天線,最終完成接收的功能。注意,接收到信息并未處理,請自主實(shí)現(xiàn),本教程模組接收到信息時(shí),對應(yīng)LED燈閃一下。

圖2.2
在main.c文件中,while(1)前面和while(1)里面添加如下代碼,詳細(xì)見圖2.3所示。
e22_demo_init();
e22_demo_menu_config( &user_config );
e22_demo_receive();
uint8_t value[12] = {0x54,0x58,0x2E,0x30,0x31,0x30,0x2E,0x30,0x30,0x34,0x2E,0x00};
uint8_t tx_length = 0;
e22_demo_transmit( (uint8_t*)value , 12);
HAL_Delay(500);
HAL_GPIO_WritePin( LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
HAL_Delay(500);

圖2.3
軟件配置好了,接線按照STM32CubeMX配置的進(jìn)行連線,最后下載程序到單片機(jī),射頻模塊接上天線,最終完成發(fā)送的功能,每隔0.5秒發(fā)送一包數(shù)據(jù)。
今天的分享就到這里啦,EBYTE每一天都致力于更好的助力物聯(lián)化、智能化、自動化的發(fā)展,提升資源利用率,更多LoRa模組產(chǎn)品和LoRa技術(shù)資料,感興趣的小伙伴可以登錄我們的億佰特官網(wǎng)和企業(yè)公眾號(微信號:cdebyte)進(jìn)行了解,也可以直接撥打400電話咨詢技術(shù)專員!
相關(guān)閱讀:
3、基于STM32核心板的E01和E01C無線模塊驅(qū)動移植案例教程1