详细AS32 TTL-100/-C LoRa模块配置及stm32+as32 ttl-100代码测试(总结了坑点)

1. 相关工具准备

       也可去官网下泽耀科技 (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优惠:

     http://getvip.u7.cn

来咯!零基础学会ESP8266AT固件烧录(MQTT,SMARTCONFIG-esp8266智能配网),必成功教程。https://blog.youkuaiyun.com/weixin_62546617/article/details/140467444?spm=1001.2014.3001.5502icon-default.png?t=N7T8https://blog.youkuaiyun.com/weixin_62546617/article/details/140467444?spm=1001.2014.3001.5502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值