上节讲述了,PingPong测试的STM32CubeMX初始化流程,这节讲解代码生成后,需要修改的板级驱动和LoRa的发送接收函数。
(参考:《Lora入门(1)—— PingPong测试(CubeMX篇)》)
STM32CubeMX生成代码后,在radio_board_if.c设置了一组api接口函数,我们只需要提供基础的IO驱动程序,由api接口函数调用后,接可以LoRa物理应用层的初始化。
1.板级底层驱动
1.1 添加底层驱动文件
打开我们之前创建的工程,找到radio_board_if.c,可以看到文件有很多warning提示我们创建自己的驱动函数。
1.1.1 创建文件
接下来我们先创建一个board_driver.c和board_driver.h文件,用来存放板子的驱动文件,并将board_driver.c添加到Application/User/SubGHz_Phy/Target目录下。
按照同样的操作创建board_driver.h文件。
1.1.2 将文件添加至工程
由于我们的board_driver.h文件保存SubGHz_Phy/Target目录下,工程生成时已经自动添加了这个文件夹的引用路径。如果你保存在其他路径,则需要手动添加下路径,如下图:
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 射频开关控制函数
添加射频开关控制函数,要注意的是,射频控制函数是有输入变量的。
所以射频开关有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