LoRa入门(2)—— PingPong测试(软件篇)

上节讲述了,PingPong测试的STM32CubeMX初始化流程,这节讲解代码生成后,需要修改的板级驱动和LoRa的发送接收函数。(参考:《Lora入门(1)—— PingPong测试(CubeMX篇)》)
摘要由CSDN通过智能技术生成

上节讲述了,PingPong测试的STM32CubeMX初始化流程,这节讲解代码生成后,需要修改的板级驱动和LoRa的发送接收函数。
(参考:《Lora入门(1)—— PingPong测试(CubeMX篇)》)
STM32CubeMX生成代码后,在radio_board_if.c设置了一组api接口函数,我们只需要提供基础的IO驱动程序,由api接口函数调用后,接可以LoRa物理应用层的初始化。

1.板级底层驱动

1.1 添加底层驱动文件

image.png
打开我们之前创建的工程,找到radio_board_if.c,可以看到文件有很多warning提示我们创建自己的驱动函数。

1.1.1 创建文件

接下来我们先创建一个board_driver.c和board_driver.h文件,用来存放板子的驱动文件,并将board_driver.c添加到Application/User/SubGHz_Phy/Target目录下。
image.png
按照同样的操作创建board_driver.h文件。

1.1.2 将文件添加至工程

image.png
image.png
由于我们的board_driver.h文件保存SubGHz_Phy/Target目录下,工程生成时已经自动添加了这个文件夹的引用路径。如果你保存在其他路径,则需要手动添加下路径,如下图:
image.png

1.2 添加IO驱动程序

1.2.1 宏定义

board_driver.h

#ifndef _BOARD_DRIVER_H_
#define _BOARD_DRIVER_H_

#ifdef __cplusplus
 extern "C" {
   
#endif

#include "stm32wlxx.h"

#include "radio_board_if.h"

//在下面添加宏定义,变量声明,函数声明

#ifdef __cplusplus
}
#endif
     
#endif /* _BOARD_DRIVER_H_ */

先添加宏定义,防止重复调用报错,同时引用stm32wlxx.h,方便c文件初始化IO。
现在先添加一组错误代码定义,用于驱动初始化返回错误信息。

/* Common Error codes */
#define BSP_ERROR_NONE                         0
#define BSP_ERROR_NO_INIT                     -1
#define BSP_ERROR_WRONG_PARAM                 -2
#define BSP_ERROR_BUSY                        -3
#define BSP_ERROR_PERIPH_FAILURE              -4
#define BSP_ERROR_COMPONENT_FAILURE           -5
#define BSP_ERROR_UNKNOWN_FAILURE             -6
#define BSP_ERROR_UNKNOWN_COMPONENT           -7
#define BSP_ERROR_BUS_FAILURE                 -8
#define BSP_ERROR_CLOCK_FAILURE               -9
#define BSP_ERROR_MSP_FAILURE                 -10
#define BSP_ERROR_FEATURE_NOT_SUPPORTED       -11

添加射频开关控制引脚宏定义,用于初始化调用。

/** @defgroup STM32WLXX_NUCLEO_RADIO_LOW_LEVEL_RFSWITCH RADIO LOW LEVEL RF SWITCH Constants
  * @{
  */ 
  
#define RF_SW_CTRL3_PIN                          GPIO_PIN_3
#define RF_SW_CTRL3_GPIO_PORT                    GPIOC
#define RF_SW_CTRL3_GPIO_CLK_ENABLE()            __HAL_RCC_GPIOC_CLK_ENABLE()
#define RF_SW_CTRL3_GPIO_CLK_DISABLE()           __HAL_RCC_GPIOC_CLK_DISABLE()

#define RF_SW_CTRL1_PIN                          GPIO_PIN_4
#define RF_SW_CTRL1_GPIO_PORT                    GPIOC
#define RF_SW_CTRL1_GPIO_CLK_ENABLE()            __HAL_RCC_GPIOC_CLK_ENABLE()
#define RF_SW_RX_GPIO_CLK_DISABLE()              __HAL_RCC_GPIOC_CLK_DISABLE()

#define RF_SW_CTRL2_PIN                          GPIO_PIN_5
#define RF_SW_CTRL2_GPIO_PORT                    GPIOC
#define RF_SW_CTRL2_GPIO_CLK_ENABLE()            __HAL_RCC_GPIOC_CLK_ENABLE()
#define RF_SW_CTRL2_GPIO_CLK_DISABLE()           __HAL_RCC_GPIOC_CLK_DISABLE()

#define RF_TCXO_VCC_PIN                          GPIO_PIN_0
#define RF_TCXO_VCC_GPIO_PORT                    GPIOB
#define RF_TCXO_VCC_CLK_ENABLE()                 __HAL_RCC_GPIOB_CLK_ENABLE()
#define RF_TCXO_VCC_CLK_DISABLE()                __HAL_RCC_GPIOB_CLK_DISABLE()

1.2.2 射频开关初始化函数

board_driver.c :

#include "board_driver.h"

先引用头文件,接下来添加IO初始化驱动。
首先添加射频开关初始化和复位代码。

/**
  * @brief  Init Radio Switch 
  * @retval BSP status
  */
int32_t BSP_RADIO_Init(void)
{
   
  GPIO_InitTypeDef  gpio_init_structure = {
   0};
  
  /* Enable the Radio Switch Clock */
  RF_SW_CTRL3_GPIO_CLK_ENABLE();
  
  /* Configure the Radio Switch pin */
  gpio_init_structure.Pin   = RF_SW_CTRL1_PIN;
  gpio_init_structure.Mode  = GPIO_MODE_OUTPUT_PP;
  gpio_init_structure.Pull  = GPIO_NOPULL;
  gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  
  HAL_GPIO_Init(RF_SW_CTRL1_GPIO_PORT, &gpio_init_structure);
  
  gpio_init_structure.Pin = RF_SW_CTRL2_PIN;
  HAL_GPIO_Init(RF_SW_CTRL2_GPIO_PORT, &gpio_init_structure);
  
  gpio_init_structure.Pin = RF_SW_CTRL3_PIN;
  HAL_GPIO_Init(RF_SW_CTRL3_GPIO_PORT, &gpio_init_structure);

  HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); 
  HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); 
  HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET); 

  return BSP_ERROR_NONE;
}
/**
  * @brief  DeInit Radio Swicth
  * @retval BSP status
  */
int32_t BSP_RADIO_DeInit(void)
{
   
  RF_SW_CTRL3_GPIO_CLK_ENABLE();

  /* Turn off switch */
  HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); 
  HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); 
  HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET); 
  
  /* DeInit the Radio Switch pin */
  HAL_GPIO_DeInit(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN);
  HAL_GPIO_DeInit(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN);
  HAL_GPIO_DeInit(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN);

  return BSP_ERROR_NONE;
}

1.2.3 射频开关控制函数

添加射频开关控制函数,要注意的是,射频控制函数是有输入变量的。
image.png
image.png
所以射频开关有4种状态,可以用switch()选择语句进行判断。

/**
  * @brief  Configure Radio Switch.
  * @param  Config: Specifies the Radio RF switch path to be set. 
  *         This parameter can be one of following parameters:
  *           @arg RBI_SWITCH_OFF
  *           @arg RBI_SWITCH_RX
  *           @arg RBI_SWITCH_RFO_LP
  *           @arg RBI_SWITCH_RFO_HP
  * @retval BSP status
  */
int32_t BSP_RADIO_ConfigRFSwitch(RBI_Switch_TypeDef Config)
{
   
  switch (Config)
  {
   
    case RBI_SWITCH_OFF:
    {
   
      /* Turn off switch */
      HAL_GPIO_Wri
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值