完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、前言
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 |
|
|
|
只有小组成员才能发言,加入小组>>
3316 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9060 浏览 16 评论
4088 浏览 18 评论
1180浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 06:09 , Processed in 1.198386 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号