当前位置: 首页 >应用方案 >技术应用 >

基于STM32单片机的Keil代码移植实现LoRa模块透传教程

零基础搭建基于STM32单片机的M系列LoRa模块透传教程 二

本文适用于零基础,手把手搭建基于STM32单片机控制亿佰特公司E22-xxxMxx、E220-xxxMxx、E32-xxxMxxLoRa模块,旨在降低M系列LoRa模块开发难度,帮助大家更快上手M系列的LoRa模组。《零基础搭建基于STM32单片机的M系列LoRa模块透传教程一》主要介绍了CubeMX代码文件的生成,本文将会介绍 Keil代码的移植 为核心教程。


一、Keil文件配置及其代码编写

1、射频芯片底层驱动文件配置

本文使用E22系列模块,使用的射频芯片为sx126x,可以在Semtech官网进行下载sx126x驱动文件,下载地址如下https://github.com/Lora-net/sx126x_driver/archive/refs/tags/v2.2.zip   。

把下载好的文件解压缩,得到“sx126x_driver-x.x.x”文件夹,把此文件夹移动到XXSTM32_MDrivers项目的驱动文件夹下。打开keil工程“STM32_M.uvprojx”,按照如图1所示,添加sx126x驱动.c文件。

1
1

再通过图2所示,添加sx126x驱动.h文件。注意“序号5”文件路径是XXSTM32_MDriverssx126x_driver-2.2src

2
2

2、编写射频模块硬件抽象层代码

e22_hal.c代码见附件1,e22_demo.c代码见附件2。

XXSTM32_MCoreSrc文件下创建e22_hal.c”文件,名字可以自己取。然后按照图3所示,添加e22_hal.c文件。

3
3

然后在e22_hal.c文件中进行代码的编写,先引用sx126xgpiospi的头文件,如图4所示。

4
4

编写射频模组复位函数和状态忙等待函数,如图5所示。

5
5

编写射频模组唤醒函数,如图6所示。

6
6

编写射频模组寄存器写入函数,如图7所示。

7
7

编写射频模组寄存器读取函数,如图8所示。

8
8

编写射频模组发送和接收切换函数,如图9所示。

9
9

最后在e22_hal.h文件的最末尾加上如下代码,详细见图9(2)所示。

sx126x_hal_status_t sx126x_rf_switch_tx(void);

sx126x_hal_status_t sx126x_rf_switch_rx(void);

9-2
9(2)

XXSTM32_MCoreSrc文件下创建“e22_demo.c”文件和e22_demo.h,名字可以自己取。然后在Keil中像添加e22_hal.c文件一样添加e22_ demo.c文件。

然后在e22_demo.c文件中进行代码编写,如图10所示,引用头文件和书写相关结构体,注意配置默认参数时,要注意自己模块的初始频率,本文使用的170MHz的频率,因此选择frequency_mhz = 170。

10
10

编写射频模组SPI读写测试和晶振启动测试函数,如图11所示。

11
11

编写射频模组初始化函数,如图12所示,注意图中红色框框的内容,选择自己模块的对应频率,本文使用模块的频率为170Mhz。

12
12

编写射频模组重新配置参数函数,如图13所示。

13
13

编写射频模组的射频发射函数,如图14所示。

14
14

编写射频模组的持续接收函数,如图15所示

15
15

编写射频模组查询是否有接收数据的函数,如图16所示

16
16

编写射频模组中断响应函数,如图17和图18所示

17
17

18
18

3、其他细节代码

main.h文件中,添加头文件引用,结构体和函数声明,代码如下,具体见图19和2.20所示

19
19

20
20

stm32f4xx_it.c文件中(不同型号的单片机的文件名不一样),添加中断回调函数,最好在void EXTI3_IRQHandler(void)函数下方,添加如下函数,详细见图21所示。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

   if( GPIO_Pin == DIO1_Pin )

   {

       e22_demo_dio1_interrupt_callback();

   }

}

21
21

、M系列LoRa模块透传应用与实现教程

1、M系列LoRa模块透传接收教程

main.c文件中,while(1)前面和while(1)里面添加如下代码,详细见图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 )

     {

         /* 如果接收到数据,灯进行闪烁 */

         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);

     }

22
2.1

软件配置好了,接线按照STM32CubeMX配置的进行连线,下图2.2是本文使用的单片机无线模块的接线,最后下载程序到单片机,射频模块接上天线,最终完成接收的功能。注意,接收到信息并未处理,请自主实现,本教程模组接收到信息时,对应LED灯闪一下。

23
2.2

2、M系列LoRa模块透传发送

main.c文件中,while(1)前面和while(1)里面添加如下代码,详细见图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);

24
2.3

软件配置好了,接线按照STM32CubeMX配置的进行连线,最后下载程序到单片机,射频模块接上天线,最终完成发送的功能,每隔0.5秒发送一包数据。


今天的分享就到这里啦,EBYTE每一天都致力于更好的助力物联化、智能化、自动化的发展,提升资源利用率,更多LoRa模组产品LoRa技术资料,感兴趣的小伙伴可以登录我们的亿佰特官网和企业公众号(微信号:cdebyte进行了解,也可以直接拨打400电话咨询技术专员!


相关阅读:

1、STM32的工作原理及各部件作用

2、基于STM32F103+MAX4003的射频功率表制作

3、基于STM32核心板的E01和E01C无线模块驱动移植案例教程1

4、基于STM32核心板E01和E01C无线模块驱动移植案例教程2

5、在单片机上移植国产RT-thread操作系统的教程分享

点击拨打: 亿佰特官网 4000-330-990