1. 相关工具准备
- AS32 TTL-100/C
- 泽耀官网卖的usb或者普通usb转ttl
- 上位机及串口调试助手,下载链接(官方资料)https://pan.baidu.com/s/14l6000nr3SR8pzBdyclYfg 提取码:2580
也可去官网下泽耀科技 (ashining.com)
2. 摘要(遇到坑点)
①MD0与MD1必须接,不能留空。AUX可空着。(初学者直接接GND)
②天线插上是有必要的,不插可能会发送接收不到数据。
③如果还不能通信就要考虑你的引脚有没有接错tx-rx,rx-tx;还有在定点模式下的地址问题。
3. 调试步骤
- 配置模块:官方usb-ttl跳线帽全部拔掉,普通usb-ttl正常连四根主线ok
- 官方usb-ttl连接
- 普通usb-ttl连接
- 打开上位机进行配置
- 模块波特率主要看右边,跟左边9600无关。
- 串口调试助手进行通信测试:
- 需要注意这个时候MD0,MD1就需要连接了
6. stm32代码(实现简单的继电器控制,继电器代码自己弄哦,不行的话,找我要!)这个是用freertos的简单实现。
main.c
#include "sys.h"
#include "delay.h"
#include "relay.h"
#include "usart.h"
#include "led.h"
#include "lora.h"
#include "FreeRTOS.h"
#include "task.h"
//#include "semphr.h"
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
//任务优先级
#define loraSendData_TASK_PRIO 2
//任务堆栈大小
#define loraSendData_STK_SIZE 256
//任务句柄
TaskHandle_t loraSendDataTask_Handler;
//任务函数
void loraSendData_task(void *pvParameters);
//任务优先级
#define loraRevciveData_TASK_PRIO 3
//任务堆栈大小
#define loraRevciveData_STK_SIZE 256
//任务句柄
TaskHandle_t loraRevciveDataTask_Handler;
//任务函数
void loraRevciveData_task(void *pvParameters);
u8 lora_receivebuf[64];
u8 lora_sendbuf[7] = {0x01,0x02,0x02,0x61,0x61};
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
USART1_Init(115200); //初始化串口
lora_Init(115200);
LED_Init(); //初始化LED
RELAY_Init();
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}
//开始任务任务函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
//创建loraSendData任务
//MutexSemaphore=xSemaphoreCreateMutex();
xTaskCreate((TaskFunction_t )loraSendData_task,
(const char* )"loraSendData_task",
(uint16_t )loraSendData_STK_SIZE,
(void* )NULL,
(UBaseType_t )loraSendData_TASK_PRIO,
(TaskHandle_t* )&loraSendDataTask_Handler);
//创建loraRevciveData任务
xTaskCreate((TaskFunction_t )loraRevciveData_task,
(const char* )"loraRevciveData_task",
(uint16_t )loraRevciveData_STK_SIZE,
(void* )NULL,
(UBaseType_t )loraRevciveData_TASK_PRIO,
(TaskHandle_t* )&loraRevciveDataTask_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
//loraSendData任务函数
void loraSendData_task(void *pvParameters)
{
while(1)
{
u8 i;
lora_Send_Data(lora_sendbuf,sizeof(lora_sendbuf));
for(i=0;i<sizeof(lora_sendbuf);i++){
printf("%x ",lora_sendbuf[i]);
}
vTaskDelay(3000);
}
}
//loraRevciveData任务函数
void loraRevciveData_task(void *pvParameters)
{
while(1)
{
// printf("...\r\n");
lora_Receive_Data(lora_receivebuf);
if(strstr((const char *)lora_receivebuf,"a"))
RELAY_1(1);
if(strstr((const char *)lora_receivebuf,"b"))
RELAY_1(0);
//printf("%s\r\n",lora_receivebuf);
vTaskDelay(500);
}
}
lora.c 引脚usart2 A2,A3; MD0,A4; MD1,A5。
#include "lora.h"
#include "sys.h"
#include "usart.h"
#ifdef EN_USART2_RX //如果使能了接收
//接收缓存区
u8 lora_RX_BUF[64]; //接收缓冲,最大64个字节.
//接收到的数据长度
u8 lora_RX_CNT=0;
void USART2_IRQHandler(void) //串口3接收中断函数
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据
{
res =USART_ReceiveData(USART2); //读取接收到的数据
if(lora_RX_CNT<64)
{
lora_RX_BUF[lora_RX_CNT]=res; //记录接收到的值
lora_RX_CNT++; //接收数据增加1
}
}
}
#endif
//初始化IO 串口3
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率
void lora_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA时钟、AFIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //Pa2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//Pa3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化MD0和MD1引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; // PA4 和 PA5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_4); // 设定MD0初始值为0
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 设定MD1初始值为0
USART_DeInit(USART2);//复位串口2
#ifdef EN_USART2_RX //如果使能了接收
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART2, &USART_InitStructure); ; //初始化串口
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清除串口3接收中断预处理位
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//使能串口3接收中断
USART_Cmd(USART2, ENABLE); //使能串口
#endif
lora_TX_EN=1; //默认为接收模式
}
//lora发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void lora_Send_Data(u8 *buf,u8 len)
{
u8 t;
lora_TX_EN=0; //设置为发送模式
for(t=0;t<len;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);//等待一个字节数据发送完成
USART_SendData(USART2,buf[t]);//发送数据
}
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); //等待发送完成
lora_RX_CNT=0;
lora_TX_EN=1; //设置为接收模式
}
//lora查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void lora_Receive_Data(u8 *buf)
{
u8 rxlen=lora_RX_CNT;
u8 i=0;
//u8 len=0; //默认为0
delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
if(rxlen==lora_RX_CNT && rxlen)//接收到了数据,且接收完成了
{
for(i=0;i<rxlen;i++)
{
buf[i]=lora_RX_BUF[i];
printf("buf:%x",buf[i]);
}
//len=lora_RX_CNT; //记录本次数据长度
//printf("len:%d",len);
lora_RX_CNT=0; //清零
}
}
lora.h
#ifndef __LORA_H
#define __LORA_H
#include "sys.h"
#include "delay.h"
extern u8 lora_RX_BUF[64]; //接收缓冲,最大64个字节
extern u8 lora_RX_CNT; //接收到的数据长度
//模式控制
#define lora_TX_EN PBout(3) //485模式控制.1,接收;0,发送.
//如果想串口中断接收,请不要注释以下宏定义
#define EN_USART2_RX 1 //0,不接收;1,接收.
void lora_Init(u32 bound);
void lora_Send_Data(u8 *buf,u8 len);
void lora_Receive_Data(u8 *buf);
#endif
其他链接指南
影音vip优惠:
来咯!零基础学会ESP8266AT固件烧录(MQTT,SMARTCONFIG-esp8266智能配网),必成功教程。https://blog.csdn.net/weixin_62546617/article/details/140467444?spm=1001.2014.3001.5502https://blog.csdn.net/weixin_62546617/article/details/140467444?spm=1001.2014.3001.5502
标签:task,u8,void,stm32,任务,ttl,100,include,lora From: https://blog.csdn.net/weixin_62546617/article/details/141888551