LoRa官方固件下载:https://pan.baidu.com/s/1ftP-HMJTmF9PtA05Lt-Tag 密码:bc8y

IAR代码操作快捷键

如果要在整个工程中查找 某个单词或者其他,则按照如下方式查找:

LoRa驱动框架

硬件接口设计

硬件接口函数

驱动移植过程(修改代码之后可以先编译,然后再看哪里还需要修改)

LoRa固件中相关文件复制到IAR工程里面

IAR工程中添加工作组

添加相关文件(platform文件中请将下图的sx1232-Hal.c换成sx1276-Hal.c,特此更正)

修改硬件平台:添加宏定义,选择sx1276的硬件库(platform文件中请将下图的sx1232-Hal.c换成sx1276-Hal.c,特此更正)

添加新增文件的包含路径

修改硬件平台:修改相关代码,并添加宏定义,选择我们实际使用的MCU硬件库(本项目中使用的是STM32F051K8)(先编译代码,然后根据错误提示修改)

注释掉USB相关代码和初始化函数(先编译代码,然后根据错误提示修改)

修改led.h中IO口定义(根据IO功能映射表)

PB0 LED4 数字输出-无线通信网络指示灯
PB1 LED3 数字输出-无线通信发送指示灯
PB2 LED2 数字输出-无线通信接收指示灯

typedef enum
{LED_GREEN = 0,//如果从第二个成员开始,第一个就没有任何意义,随便填一个就可以了LED_RX = 1,//接收指示灯,根据端口映射表可知,我们实际使用了三个指示灯。假设我们从第二个成员开始LED_TX = 2,//发送指示灯LED_NT = 3,//网络指示灯
#if defined( STM32F4XX ) || defined( STM32F2XX ) || defined( STM32F429_439xx )LED_DBG3 = 4,
#endif
} tLed;

// RED
#define LED1_PIN                         GPIO_PIN_2  //因为我们只用了三个指示灯,而且是从第二个成员开始定义的,所以这第一个是无效的,可以随便填一个
#define LED1_GPIO_PORT                   GPIOB
//#define LED1_GPIO_CLK                    RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉
// GREEN
#define LED2_PIN                         GPIO_PIN_2 //无线通信接收指示灯
#define LED2_GPIO_PORT                   GPIOB
//#define LED2_GPIO_CLK                    RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉
// DBG1
#define LED3_PIN                         GPIO_PIN_1 //无线通信发送指示灯
#define LED3_GPIO_PORT                   GPIOB
//#define LED3_GPIO_CLK                    RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉
// DBG2
#define LED4_PIN                         GPIO_PIN_0 //无线通信网络指示灯
#define LED4_GPIO_PORT                   GPIOB
//#define LED4_GPIO_CLK                    RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉

修改led.c

void LedOn( tLed led )//灯亮
{HAL_GPIO_WritePin( LedPort[led], LedPin[led], LED_ON );//HAL库函数原型:void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
}void LedOff( tLed led )//灯灭
{HAL_GPIO_WritePin( LedPort[led], LedPin[led], LED_OFF ); //HAL库函数原型:void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
}void LedToggle( tLed led )//灯状态翻转,此处不使用
{//LedPort[led]->ODR ^= LedPin[led];
}

#if LED_INV
#define LED_ON                           GPIO_PIN_RESET
#define LED_OFF                          GPIO_PIN_SET
#else
#define LED_ON                           GPIO_PIN_SET
#define LED_OFF                          GPIO_PIN_RESET
#endif

修改sx1276-Hal.c(请将下图的sx1232-Hal.c换成sx1276-Hal.c,其代码修改方式一致,特此更正)

PA7 NSS_LoRa LoRa模块片选接口

PA11 DIO0 数字量输入-LoRa数字IO0
PA12 DIO1

数字量输入-LoRa数字IO1

PA2 DIO3 数字量输入-LoRa数字IO3
PA3 DIO2 数字量输入-LoRa数字IO2

/*!* SX1232 SPI NSS I/O definitions*/
#if defined( STM32F4XX ) || defined( STM32F2XX )
#define NSS_IOPORT                                  GPIOA
#define NSS_PIN                                     GPIO_Pin_15
#else
#define NSS_IOPORT                                  GPIOA
#define NSS_PIN                                     GPIO_PIN_7
#endif/*!* SX1232 DIO pins  I/O definitions*/
#if defined( STM32F4XX ) || defined( STM32F2XX )
#define DIO0_IOPORT                                 GPIOG
#define DIO0_PIN                                    GPIO_Pin_13
#else
#define DIO0_IOPORT                                 GPIOA
#define DIO0_PIN                                    GPIO_PIN_11
#endif#if defined( STM32F4XX ) || defined( STM32F2XX )
#define DIO1_IOPORT                                 GPIOB
#define DIO1_PIN                                    GPIO_Pin_8
#else
#define DIO1_IOPORT                                 GPIOA
#define DIO1_PIN                                    GPIO_PIN_12
#endif#if defined( STM32F4XX ) || defined( STM32F2XX )
#define DIO2_IOPORT                                 GPIOA
#define DIO2_PIN                                    GPIO_Pin_2
#else
#define DIO2_IOPORT                                 GPIOA
#define DIO2_PIN                                    GPIO_PIN_3
#endif#if defined( STM32F4XX ) || defined( STM32F2XX )
#define DIO3_IOPORT
#define DIO3_PIN                                    RF_DIO3_PIN
#else
#define DIO3_IOPORT                                 GPIOA
#define DIO3_PIN                                    GPIO_PIN_2
#endif

另外具体分析 sx1276-Hal.c中的如下代码:

​void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{uint8_t i;//NSS = 0;HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );//SPI片选引脚NSS拉低,SPI被选中SpiInOut( addr | 0x80 );//SPI第一个数据字节为地址域,bit7 为读写控制位, “1” 表示写, “0” 表示读;bit(6-0)对应当前操作的寄存器地址,这里是写操作for( i = 0; i < size; i++ ){SpiInOut( buffer[i] );}//NSS = 1;HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );//SPI片选引脚NSS拉高,SPI不工作
}void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{uint8_t i;//NSS = 0;HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );SpiInOut( addr & 0x7F );//SPI第一个数据字节为地址域,bit7 为读写控制位, “1” 表示写, “0” 表示读;bit(6-0)对应当前操作的寄存器地址,这里是读操作for( i = 0; i < size; i++ ){buffer[i] = SpiInOut( 0 );}//NSS = 1;HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );
}void SX1276Write( uint8_t addr, uint8_t data )
{SX1276WriteBuffer( addr, &data, 1 );
}void SX1276Read( uint8_t addr, uint8_t *data )
{SX1276ReadBuffer( addr, data, 1 );
}void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
{SX1276WriteBuffer( 0, buffer, size );/* 在连续读写操作模式时, 寄存器会自动加“1” ,直到NSS脚被拉高;特别注意: FIFO操作时, 寄存器地址不会自动增加, 而是FIFO内的缓存地址。*/
}void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
{SX1276ReadBuffer( 0, buffer, size ); /*在连续读写操作模式时, 寄存器会自动加“1” ,直到NSS脚被拉高;特别注意: FIFO操作时, 寄存器地址不会自动增加, 而是FIFO内的缓存地址。*/
}inline uint8_t SX1276ReadDio0( void )
{return HAL_GPIO_ReadPin( DIO0_IOPORT, DIO0_PIN );//读取DIO0引脚的状态
}inline uint8_t SX1276ReadDio1( void )
{return HAL_GPIO_ReadPin( DIO1_IOPORT, DIO1_PIN );
}inline uint8_t SX1276ReadDio2( void )
{return HAL_GPIO_ReadPin( DIO2_IOPORT, DIO2_PIN );
}

修改sx1276-Hal.h

#define GET_TICK_COUNT( )                           ( HAL_GetTick() )
#define TICK_RATE_MS( ms )                          ( ms )

修改spi.c

//**********************************//
//
//函数名称:   SpiInOut
//
//函数描述:   SPI总线读取写入单个字节
//
//函数参数:   uint8_t
//
//返回值:     uint8_t
//
//创建者:
//*******************************//uint8_t SpiInOut( uint8_t outData )
{uint8_t pData = 0;
//outData:发送的数据   pData:接收数据的缓存区  1:表示数据长度为1  0xffff:超时时间if(HAL_SPI_TransmitReceive(&hspi1,&outData,&pData,1,0xffff) != HAL_OK)return ERROR;elsereturn pData;
}

LoRa模块上电自检:如果能读取LoRa芯片的版本号,则SPI功能正确,驱动移植成功

上电通过SPI总线读取芯片版本,判断读取值是否为0x12,并打印模块版本号。

//如果要使用sx1278相关的接口函数,则需要包含如下头文件
#include "platform.h"
#include "radio.h"
#include "sx1276-Hal.h"
#include "sx1276-LoRa.h"
#include "sx1276-LoRaMisc.h"

  uint8_t RegVersion = 0;SX1276Read( REG_LR_VERSION, &RegVersion );if(RegVersion != 0x12){printf("LoRa read Error!\r\n");printf("LoRa RegVersion = %d!\r\n",RegVersion);}else{printf("LoRa read Ok!\r\n");printf("LoRa RegVersion = %d!\r\n",RegVersion);}

物联网之LoRa开发与应用二(驱动移植)相关推荐

  1. 嵌入式Linux开发板_WIFI无线网卡驱动移植

    在线课堂:https://www.100ask.net/index(课程观看) 论  坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taoba ...

  2. rt_thread hc32f460开发五:wdt驱动移植

    看门狗驱动的代码结构和原理 参考STM32的看门狗驱动,RT-Thread中的看门狗驱动主要有两个函数组成wdt_init和wdt_control. 其中wdt_init提供看门狗初始化,主要就是初始 ...

  3. ThreadX应用开发笔记之二:移植ThreadX到STM32H7平台

      前面我们将ThreadX成功移植到了STM32F4平台,但这只是我们的部分应用.我们希望将ThreadX的优势发挥到我们的更多应用中,所以在这一篇中我们就来实现将ThreadX移植到STM32H7 ...

  4. QCA7000/7005HomePlugGreenPHY模块<树莓派开发套件>linux驱动移植开发设计

    移植步骤: 下载树莓派系统镜像 烧写树莓派系统 加载QCA7000/7005驱动 配置树莓派环境 安装工具包 使用的硬件: 树莓派3B主板 8GB或更大内存卡 首先,下载树莓派系统镜像 根据需要,下载 ...

  5. STM32MP157 Linux系统移植开发篇17:Linux内核摄像头驱动移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

  6. STM32MP157 Linux系统移植开发篇14:Linux内核RGB LCD驱动移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

  7. STM32MP157 Linux系统移植开发篇11:Linux HDMI驱动移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

  8. 15、RDA8910(4GCAT1)CSDK二次开发:通过OneWire驱动库获取DS18B20/DHT11的数据

    目录 点击这里查看所有博文   本系列博客所述资料均来自合宙官方,并不是本人原创(只有博客是自己写的),csdk只是得到了口头的允许公开授权.出于热心,本人将自己的所学笔记整理并推出相对应的使用教程, ...

  9. LoRa开发|LoRa(SX1276/8)串口透传代码-将LoRa封装成单独的驱动(STM32)

    一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.2020年,开年注定不平凡,新型冠状肺炎的出现哪里也去不了,在家无聊写点东西吧.最近和一友人聊天,友人一直在抱怨学习lora没有前途,一直在纠结要 ...

最新文章

  1. Spring中配置数据源的4种形式 ---转
  2. java day05【数组】
  3. 主席树 POJ2104
  4. Go语言:数组练习—数组逆置
  5. 互不侵犯king (状压dp)
  6. 用c语言编写函数流程,C语言课程设计————写下流程图! 谢谢
  7. C# 采用Automation控制自动拨打接听电话
  8. UE4 Pak 相关知识总结
  9. 电力-平衡式101规约报文解析
  10. PHP爬虫的三种方法
  11. windows 开启安全中心的方法
  12. VS 由于找不到ucrtbased.dll,无法继续执行代码。
  13. GO语言实战之类型的本质
  14. 开启阿里云80端口:如何配置阿里云服务器安全组
  15. 免费搜索引擎登陆入口
  16. 计算机学院品牌活动,计算机学院研究生会举办十佳健康品牌活动
  17. UTF-8 带BOM 和 UTF-8无BOM 的区别?
  18. 阿里巴巴张瑞谈面向未来的数据库架构
  19. nyoj 711 最舒适的路线
  20. 【91数据恢复】服务器感染了.halo勒索病毒,如何确保数据100%恢复?

热门文章

  1. 计算机检测维修与数据恢复国赛培训线上直播课火热进行中
  2. 批量验证邮箱地址php代码,php结合正则批量抓取网页中邮箱地址
  3. 无锡启用汽车电子标识卡,为市民带来便捷生活
  4. 中文最常用600句短语地道英文表达
  5. 简述html5的标记方法,HTML 5中的标记方法
  6. 韩顺平视频资源百度网盘下载地址
  7. PLC常见的输入设备及其接线方式列举
  8. 安卓动态壁纸源码--可直接进入壁纸设置界面+玫瑰花瓣飘落效果+可分享到微博、微信功能--无任何删减2
  9. Mac 查看 剪贴板/剪切板/粘贴板 内容与格式
  10. java 返回 json格式_java 如何返回json格式数据,需要技巧