题目要求
配置过程:
节点1
1.将时钟树频率设置成32MHz
2.将GPIO引脚做如下配置:
引脚功能
中断配置
3.生成工程代码
4.移植OLED、LoRa库文件
5.编写逻辑代码
自定义Task_Main.h Task_Main.c工程文件
Task_Main.h
#ifndef _TASK_MAIN_H_
#define _TASK_MAIN_H_
#include "main.h"
#include "stm32l0xx_hal.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "oled.h"
#include "sx127x_lora.h"
void Task_BrdInit(void);
void Task_Main(void);
void recv_buf(void);
void send_buf(void);
void get_cmd(uint8_t *get_data, uint16_t size);
#endif
Task_Main.c
#include "Task_Main.h"
radio_handle_t handle;
#define FREQ 433000000L
bool send_flag = 0;
bool recv_flag = 0;
uint8_t oled_dis_on[4] = "ON \0";
uint8_t oled_dis_off[4] = "OFF\0";
uint8_t recv_data[256] = {0};
uint16_t recv_data_size = 0;
uint8_t send_data[7] = {0x14,0x02,0x35,0x69,0x41,0x0A,0x01};
void Task_Main(void)
{
if(send_flag)
{
send_flag = 0;
send_buf();
}
if(recv_flag)
{
recv_flag = 0;
recv_buf();
}
}
void Task_BrdInit(void)
{
//OLED初始化
OLED_PowerControl(ENABLE);
HAL_Delay(200);
OLED_Init();
OLED_Clear();
OLED_ShowString(0, 0, (unsigned char *)"K1-LED:OFF ", 16);
OLED_ShowString(0, 2, (unsigned char *)"K2-LED:OFF ", 16);
//LoRa初始化
spi_init();
zm4xx_pin_init();
handle = radio_zm4xx_inst_init(spi_recv_byte,spi_send_byte,zm4xx_rst_pin_set,zm4xx_sel_pin_set,HAL_Delay,delay_us);
if(handle != NULL)
{
if(RADIO_RET_OK == radio_freq_set(handle, FREQ))
{
}
radio_mode_set(handle, RX_MODE); //Receive Mode
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_10)
{
recv_flag = 1;
}
if(GPIO_Pin == GPIO_PIN_14)
{
send_flag = 1;
}
}
void send_buf(void)
{
radio_buf_send(handle, send_data, 7);
radio_mode_set(handle, RX_MODE);
}
void recv_buf(void)
{
uint8_t data[256] = {0};
uint8_t i = 0;
int ret = 0;
ret = radio_buf_recv(handle, recv_data, &recv_data_size);
if(ret == RADIO_RET_OK)
{
for(i=0; i<recv_data_size; i++)
{
data[i] = recv_data[i];
}
get_cmd(data, recv_data_size);
}
}
void get_cmd(uint8_t *get_data, uint16_t size)
{
if(size == 7)
{
if((get_data[0]==0x14)&(get_data[1]==0x02)&(get_data[2]==0x35)&(get_data[3]==0x69)&(get_data[4]==0x42)&(get_data[5]==0x0B))
{
switch(get_data[6])
{
case 0x11:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
OLED_ShowString(56, 0, oled_dis_on, 16);
OLED_ShowString(56, 2, oled_dis_off, 16);
break;
case 0x12:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
OLED_ShowString(56, 0, oled_dis_off, 16);
OLED_ShowString(56, 2, oled_dis_on, 16);
break;
case 0x13:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
OLED_ShowString(56, 0, oled_dis_off, 16);
OLED_ShowString(56, 2, oled_dis_off, 16);
break;
default:
break;
}
}
#if 1
if((get_data[0]==0x55)&(get_data[1]==0xc6)&(get_data[2]==0x35)&(get_data[3]==0x69)&(get_data[4]==0x42)&(get_data[5]==0x0B))
{
switch(get_data[6])
{
case 0x11:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
OLED_ShowString(56, 0, oled_dis_on, 16);
OLED_ShowString(56, 2, oled_dis_off, 16);
break;
case 0x12:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
OLED_ShowString(56, 0, oled_dis_off, 16);
OLED_ShowString(56, 2, oled_dis_on, 16);
break;
case 0x13:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
OLED_ShowString(56, 0, oled_dis_off, 16);
OLED_ShowString(56, 2, oled_dis_off, 16);
break;
default:
break;
}
}
if((get_data[0]==0xB8)&(get_data[1]==0xB9)&(get_data[2]==0x35)&(get_data[3]==0x69)&(get_data[4]==0x42)&(get_data[5]==0x0B))
{
switch(get_data[6])
{
case 0x11:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
OLED_ShowString(56, 0, oled_dis_on, 16);
OLED_ShowString(56, 2, oled_dis_off, 16);
break;
case 0x12:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
OLED_ShowString(56, 0, oled_dis_off, 16);
OLED_ShowString(56, 2, oled_dis_on, 16);
break;
case 0x13:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
OLED_ShowString(56, 0, oled_dis_off, 16);
OLED_ShowString(56, 2, oled_dis_off, 16);
break;
default:
break;
}
}
#endif
}
}
main.c
引入头文件
/* USER CODE BEGIN Includes */
#include "Task_Main.h"
/* USER CODE END Includes */
板级初始化
/* USER CODE BEGIN 2 */
Task_BrdInit();
/* USER CODE END 2 */
主控代码
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Task_Main();
}
/* USER CODE END 3 */
节点2
1.将时钟树频率设置成32MHz
2.将GPIO引脚做如下配置:
引脚功能
中断配置
ADC配置
使能定时器
3.生成工程代码
4.移植OLED、LoRa库文件
5.编写逻辑代码
自定义Task_Main.h Task_Main.c工程文件
Task_Main.h
#ifndef _TASK_MAIN_H_
#define _TASK_MAIN_H_
#include "main.h"
#include "stm32l0xx_hal.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "oled.h"
#include "sx127x_lora.h"
#include "lptim.h"
#include "adc.h"
void Task_BrdInit(void);
void Task_Main(void);
void recv_buf(void);
void send_buf(uint8_t *data);
void get_cmd(uint8_t *get_data, uint16_t size);
void get_adc(void);
#endif
Task_Main.c
#include "Task_Main.h"
radio_handle_t handle;
#define FREQ 433000000L
uint32_t Period=5000;
bool recv_flag = 0;
uint8_t recv_data[256] = {0};
uint16_t recv_data_size = 0;
uint8_t send_data1[7] = {0x14,0x02,0x35,0x69,0x42,0x0B,0x11};
uint8_t send_data2[7] = {0x14,0x02,0x35,0x69,0x42,0x0B,0x12};
uint8_t send_data3[7] = {0x14,0x02,0x35,0x69,0x42,0x0B,0x13};
uint32_t adc_value[10] = {0};
float vol = 0.0;
int fputc(int ch, FILE *f)
{
while(((USART2->ISR)&(1<<7))==0);
USART2->TDR = (uint8_t)ch;
return ch;
}
void Task_Main(void)
{
if(recv_flag)
{
recv_flag = 0;
recv_buf();
}
}
void Task_BrdInit(void)
{
//OLED初始化
OLED_PowerControl(ENABLE);
HAL_Delay(200);
OLED_Init();
OLED_Clear();
OLED_ShowString(0, 0, (unsigned char *)"REC:None ", 16);
OLED_ShowString(0, 2, (unsigned char *)"ADC:None ", 16);
//LoRa初始化
spi_init();
zm4xx_pin_init();
handle = radio_zm4xx_inst_init(spi_recv_byte,spi_send_byte,zm4xx_rst_pin_set,zm4xx_sel_pin_set,HAL_Delay,delay_us);
if(handle != NULL)
{
if(RADIO_RET_OK == radio_freq_set(handle, FREQ))
{
}
radio_mode_set(handle, RX_MODE); //Receive Mode
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_10)
{
recv_flag = 1;
}
HAL_ADC_Start_DMA(&hadc, adc_value, 5);
}
void send_buf(uint8_t *data)
{
radio_buf_send(handle, data, 7);
radio_mode_set(handle, RX_MODE);
}
void recv_buf(void)
{
uint8_t data[256] = {0};
uint8_t i = 0;
int ret = 0;
ret = radio_buf_recv(handle, recv_data, &recv_data_size);
if(ret == RADIO_RET_OK)
{
for(i=0; i<recv_data_size; i++)
{
data[i] = recv_data[i];
}
get_cmd(data, recv_data_size);
}
}
void get_cmd(uint8_t *get_data, uint16_t size)
{
if(size == 7)
{
if((get_data[0]==0x14)&(get_data[1]==0x02)&(get_data[2]==0x35)&(get_data[3]==0x69)&(get_data[4]==0x41)&(get_data[5]==0x0A)&(get_data[6]==0x01))
{
get_adc();
}
}
}
void get_adc(void)
{
char oled_dis_adc[4] = {0};
vol = ((adc_value[0]+adc_value[1]+adc_value[2]+adc_value[3]+adc_value[4])*3.3)/(4095*5);
vol = (int)((vol*10)+0.5)/10.0;
sprintf(oled_dis_adc, "%.1fV", vol);
OLED_ShowString(32, 0, (uint8_t *)"OK \0", 16);
OLED_ShowString(32, 2, (uint8_t *)oled_dis_adc, 16);
HAL_LPTIM_Counter_Start_IT(&hlptim1, Period);
if(vol<1.5)
{
send_buf(send_data1);
}
else if(vol<2.5)
{
send_buf(send_data2);
}
else
{
send_buf(send_data3);
}
}
uint8_t g_count = 0;
void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
g_count++;
if(g_count==100)
{
OLED_ShowString(0, 0, (unsigned char *)"REC:None ", 16);
OLED_ShowString(0, 2, (unsigned char *)"ADC:None ", 16);
HAL_LPTIM_Counter_Stop_IT(&hlptim1);
g_count = 0;
}
}
main.c
引入头文件
/* USER CODE BEGIN Includes */
#include "Task_Main.h"
/* USER CODE END Includes */
板级初始化
/* USER CODE BEGIN 2 */
Task_BrdInit();
/* USER CODE END 2 */
主控代码
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Task_Main();
}
/* USER CODE END 3 */
实验现象
Node_A初始化画面
Node_B初始化画面
Node_A指令画面
Node_B指令画面