概述
软件:STM32CubeMX,MDK-ARM
硬件:蓝桥杯物联网Lora开发板,板载芯片STM32L071
一、前言
11届蓝桥杯物联网大赛里面仅仅提供了LL库的Lora API,所以这次我选择使用上次官方提供的比赛资源包的Lora API来进行实验。主要代码还是使用STM32CubeMX生成,也就是HAL库。
如果是其他STM32系列的MCU也可以用这个Lora的API,一样的操作就行。
对STM32还有问题的可以看看我以前的一些文章,写的不太好,大家可以在评论区一起交流一下。
二、STM32CubeMX配置
PA0和PA1是板子上两个大灯的引脚K1-LED、K2-LED
PC15是LED5,PC14是USER按键
PA4、PA11是ZM433也就是Lora模块的配置引脚,设置为输出就行
PC15标签设置为StateLED
PC14标签设置为KEY
PA0标签设置为LED1
PA1标签设置为LED2
SPI配置如下
时钟树配置如下
三、代码
1、Lora配置相关的代码
STM32要操作ZM433这个芯片,需要配置SPI引脚、复位引脚、选择引脚。要添加官方提供的几个Lora模块文件,lora.c
sx127x_lora.c
zm4xx_gpio.c
,主要是sx127x_lora.c文件,当然还有一些头文件也要全部复制。
因为我是使用STM32CubeMX生成的代码,所与官方给的有些不一样。例如SPI的初始化代码是STM32CubeMX生成,ZM433芯片的俩引脚PA4、PA11初始化代码也是STM32CubeMX生成。
主要是学会怎么去使用官方给的Lora API。
zm4xx_gpio.c
#include "zm4xx_gpio.h"
/*
这个复位引脚看原理图可以知道是PA9,但是我配置为PA9的话就会出错。
老师说复位可以不用管,把复位脚写作PA11可以骗过Lora API,不然会报错的。
*/
void zm4xx_rst_pin_set(uint8_t value)//ZM433复位函数
{
if(value){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11,GPIO_PIN_RESET);
}
}
void zm4xx_sel_pin_set(uint8_t value)//ZM433选择引脚设置函数
{
if(value){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_RESET);
}
}
在spi.c中添加如下函数,这些函数是咋们写的,提供给Lora API使用的。
void delay_us(uint32_t time)
{
while(time--);
}
void delay_ms(uint32_t ms)
{
HAL_Delay(ms);
}
void spi_send_byte (uint8_t send_data)
{
HAL_SPI_Transmit(&hspi1, &send_data, 1, 10);
}
uint8_t spi_recv_byte (void)
{
uint8_t byte;
HAL_SPI_Receive(&hspi1, &byte, 1, 10);
return byte;
}
lora.c
#include "lora.h"
radio_handle_t handle;
void LoRa_Init(void)
{
handle = radio_zm4xx_inst_init(spi_recv_byte,spi_send_byte,zm4xx_rst_pin_set,zm4xx_sel_pin_set,delay_ms,delay_us);
if(handle != NULL){
if(RADIO_RET_OK == radio_freq_set(handle, FREQ)){//初始化成功,点亮LED5
HAL_GPIO_WritePin(StateLED_GPIO_Port,StateLED_Pin,GPIO_PIN_RESET); // LoRa ok
}
radio_mode_set(handle, RX_MODE); //Receive Mode
}
}
2、main.c
#include "main.h"
#include "spi.h"
#include "gpio.h"
#include "lora.h"
#include "spi.h"
#include "zm4xx_gpio.h"
extern radio_handle_t handle;
int ret = RADIO_RET_OK;
uint8_t rx = 0xAA, tx = 0x55;
uint16_t len;
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
LoRa_Init();
while (1)
{
if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(100);
if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);//LED状态反转
radio_buf_send(handle, &tx, 1); //发送字符
radio_mode_set(handle, RX_MODE); //ZM433设置为接受模式
}
}
}
}
四、效果
终端A按键USER按键,终端B的K1-LED状态反转。
工程文件
https://wws.lanzous.com/iXOxrkjjzzi
密码:c8bv
官方提供的Lora例子
https://wws.lanzous.com/imTcYkjko3g
密码:aonk
最后
以上就是内向大雁为你收集整理的Lora—点灯 Day11的全部内容,希望文章能够帮你解决Lora—点灯 Day11所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复