CH7-Lora
Lora原理图
Lora连接原理图
表1.stm32连接LORA引脚
STM32引脚 |
LORA引脚 |
功能 |
PA4 |
SPI1_NSS |
SPI 片选引脚,低电平有效 |
PA5 |
SPI1_SCK |
SPI 总线时钟引脚,常态为低电平,上升沿触发 |
PA6 |
SPI1_MISO |
SPI 总线从机输出引脚。当 MCU 读取模块数据时,模块数据由此引脚输出 |
PA7 |
SPI1_MOSI |
SPI 总线从机输入引脚。当 MCU 向模块写数据时,数据从此引脚写入 |
MDK配置
CubeMX配置
下载线配置
SPI配置1
由于SPI配置后只有三个引脚被配置,但数据通信时还有一个Lora通信SPI1_NSS对映的PA4需要配置为低电平
SPI配置2
OLED引脚配置
GPIO引脚配置
RTC配置
USART_DMA配置
USART参数配置
USART中断配置(IDLE)
NVIC配置
时钟树配置
生成文件配置1
生成文件配置2
MDK代码编写
Lora
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| unsigned char SPI_WriteRead(unsigned char addr,unsigned char mss) { extern SPI_HandleTypeDef hspi1; unsigned char tx_data[2],rx_data[2]; tx_data[0]=addr; tx_data[1]=mss; HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1,tx_data,rx_data,2,0xff); HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET); return rx_data[1]; }
|
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout)
函数是一个STM32 HAL库中的SPI传输函数,它可以同时发送和接收数据。其中,hspi是SPI柄,pTxata是要发送的数据缓区指针,pRxpata是接收数据的缓冲中区指针,size是要发送/接收的数据字节数,Timeout是超时时间。
function.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| #include "function.h" #include "gpio.h" #include "stdio.h" #include "string.h" #include "oled.h" #include "lora.h"
extern UART_HandleTypeDef huart2; extern DMA_HandleTypeDef hdma_usart2_tx; extern DMA_HandleTypeDef hdma_usart2_rx;
extern I2C_HandleTypeDef hi2c3; extern RTC_HandleTypeDef hrtc; extern SPI_HandleTypeDef hspi1;
#define Usart_RX_buffer_len 100 unsigned char usart_rx_sec_len; unsigned char usart_rx_sec_flag; unsigned char usart_rx_buffer[Usart_RX_buffer_len];
void ALL_Init(void) { Usart_RX_Init(); IIC_OLED_Init(100); }
void Usart_RX_Init(void) { __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE); HAL_UART_Receive_DMA(&huart2,usart_rx_buffer,Usart_RX_buffer_len); }
void Usart_RX_EXTI(void) { if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) == SET) { __HAL_UART_CLEAR_IDLEFLAG(&huart2); HAL_UART_DMAStop(&huart2); usart_rx_sec_len = Usart_RX_buffer_len - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx); usart_rx_sec_flag=1; } } void Usart_RX_DEAL(void) { if(usart_rx_sec_flag==1) {
if((Usart_RX_mess[0]=='L') && (Usart_RX_mess[1]=='E') && (Usart_RX_mess[2]=='D')) { HAL_UART_Transmit_DMA(&huart2,Usart_RX_mess,Usart_RX_sec_len); }
usart_rx_sec_flag=0; usart_rx_sec_len=0; HAL_UART_Receive_DMA(&huart2,usart_rx_buffer,Usart_RX_buffer_len); } }
unsigned char SPI_WriteRead(unsigned char addr,unsigned char mss) { extern SPI_HandleTypeDef hspi1; unsigned char tx_data[2],rx_data[2]; tx_data[0]=addr; tx_data[1]=mss; HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1,tx_data,rx_data,2,0xff); HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET); return rx_data[1]; }
void IIC_OLED_Init(unsigned char ms) { HAL_GPIO_WritePin(OLED_POWER_GPIO_Port, OLED_POWER_Pin, GPIO_PIN_RESET); HAL_Delay(ms); OLED_Init(); OLED_Clear(); }
void OLED_Write(unsigned char addr,unsigned char data) { unsigned char pdata[2]; pdata[0]=addr; pdata[1]=data; HAL_I2C_Master_Transmit(&hi2c3,0x78,pdata,2,0xff); }
unsigned char * RTC_Data(void) { static unsigned char rtc_data[7]; RTC_TimeTypeDef rtc_time_data; RTC_DateTypeDef rtc_date_data; HAL_RTC_GetTime(&hrtc,&rtc_time_data,RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc,&rtc_date_data,RTC_FORMAT_BIN); rtc_data[0]=rtc_date_data.Year; rtc_data[1]=rtc_date_data.Month; rtc_data[2]=rtc_date_data.WeekDay; rtc_data[3]=rtc_date_data.Date; rtc_data[4]=rtc_time_data.Hours; rtc_data[5]=rtc_time_data.Minutes; rtc_data[6]=rtc_time_data.Seconds; return rtc_data; }
int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xffff); return ch; }
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(USER_KEY_Pin==GPIO_Pin) { flag_send_rtc=1; } }
|
function.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #ifndef __FUNCTION_H__ #define __FUNCTION_H__
void Layer_switch(const unsigned char layer_choose,const unsigned char layer_state);
void IDLE_RX_Init(void); void IDLE_RX_Exit(void); void IDLE_RX_Deal(void);
void Usart_puplish(const unsigned char *ms,const unsigned char ms_len);
unsigned char * RTC_Read(void);
unsigned char SPI_WriteRead(unsigned char addr,unsigned char mss);
void OLED_A_Init(unsigned char time_delay); void OLED_Write(unsigned char addr,unsigned char mss);
void ALL_Init(void);
#endif
|
main.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include "function.h" #include "stdio.h" #include "string.h" #include "oled.h" #include "lora.h"
int main(void) { ALL_Init(); extern unsigned char flag_num; extern unsigned char oled_2_pub[16]; unsigned char *rtc_rec_data; unsigned char oled_1_pub[16]; unsigned char oled_3_pub[16]; unsigned char lora_a_rx[5]; while (1) { rtc_rec_data=RTC_Read(); if(1==flag_num) { flag_num=0; printf("\r\n RTC:%d-%d-%d %02d:%02d:%02d \r\n",2000+rtc_rec_data[0],rtc_rec_data[1],rtc_rec_data[3],rtc_rec_data[4],rtc_rec_data[5],rtc_rec_data[6]); } sprintf((char *)oled_1_pub,"RTC:%02d:%02d:%02d",rtc_rec_data[4],rtc_rec_data[5],rtc_rec_data[6]); OLED_ShowString(0,oled_1_pub); LORA_Tx(rtc_rec_data,7); LORA_Rx(lora_a_rx); sprintf((char *)oled_3_pub,"EX:%02d",lora_a_rx[0]); OLED_ShowString(2,oled_3_pub);
IDLE_RX_Deal(); } }
|