我是靠谱客的博主 内向大雁,最近开发中收集的这篇文章主要介绍Lora—点灯 Day11,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

软件: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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部