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

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

时间:2024-09-04 12:54:26浏览次数:10  
标签:task u8 void stm32 任务 ttl 100 include lora

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.csdn.net/weixin_62546617/article/details/140467444?spm=1001.2014.3001.5502icon-default.png?t=N7T8https://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

相关文章

  • STM32:STM32串行通信:STM32串行通信基础理论
    STM32:STM32串行通信:STM32串行通信基础理论串行通信概述串行通信的基本概念串行通信是一种数据传输方式,其中数据位被逐个按顺序传输,通常通过一条信号线完成。与并行通信相比,串行通信使用较少的线路,因此在长距离通信和减少硬件成本方面具有优势。在串行通信中,数据通常以帧......
  • STM32低功耗设计:STM32低功耗通信接口设计
    STM32低功耗设计:STM32低功耗通信接口设计STM32低功耗设计概述低功耗设计的重要性在当今的电子设备设计中,低功耗设计变得日益重要,尤其是在移动设备、可穿戴设备、物联网(IoT)设备以及任何需要长时间运行而无需频繁充电或更换电池的应用中。低功耗设计不仅可以延长设备的......
  • STM32:STM32低功耗设计:低功耗设计的未来趋势与STM32新特性
    STM32:STM32低功耗设计:低功耗设计的未来趋势与STM32新特性STM32低功耗设计基础低功耗设计的重要性在当今的电子设备中,低功耗设计变得日益重要,尤其是在移动设备、物联网(IoT)设备和可穿戴技术中。低功耗设计不仅能够延长设备的电池寿命,减少充电频率,提高用户体验,还能降低设......
  • H6922 低压升压恒压芯片 支持3.7V-5V-9V升12V24V30V48V54V60V72V100V 200W大功率
    H6922低压升压恒压芯片:高效能、多功能,应用于多种电源管理在当今的电子设备中,电源管理芯片扮演着至关重要的角色。其中,H6922作为一款好的低压升压恒压芯片,凭借其高效能、多功能以及应用领域,受到了市场的关注。产品概述H6922是一款外围电路简单的BOOST异步升压恒压控制驱动芯片,适用于......
  • AP2917远近光一切二双路输出降压恒流驱动IC 5-100V 12W 摩托车灯照明IC
    产品描述AP2917是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率管,适用于5-100V输入的高精度降压LED恒流驱动芯片。内置功率管输出最大功率可达12W,最大电流1.2A。AP2917一路灯亮切换两路灯亮,其中一路灯亮可以全亮,可以半亮。AP2917工作频......
  • AP2917远近光一切二双路输出降压恒流驱动IC 5-100V 12W 摩托车灯照明IC
    产品描述AP2917是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率管,适用于5-100V输入的高精度降压LED恒流驱动芯片。内置功率管输出最大功率可达12W,最大电流1.2A。AP2917一路灯亮切换两路灯亮,其中一路灯亮可以全亮,可以半亮。AP2917工......
  • (D卷,100分)- 堆栈中的剩余数字(Java & JS & Python&C&C++)
    题目描述向一个空栈中依次存入正整数,假设入栈元素n(1<=n<=2^31-1)按顺序依次为nx…n4、n3、n2、n1,每当元素入栈时,如果n1=n2+…+ny(y的范围[2,x],1<=x<=1000),则n1~ny全部元素出栈,重新入栈新元素m(m=2*n1)。如:依次向栈存入6、1、2、3,当存入6、1、2时,栈底......
  • CF 2100-2400 data structures 乱做
    CF2002ECosmicRays\(\star\)顺着询问想增加二元组\((a,b)\)的影响。只需要考虑它的合并情况,即尾部什么时候会出现数字\(b\),而总时间可以看作是最后一个尾部的存在时间,所以我们只需要关心尾部用栈维护尾部的数值和存在时间(不难发现这是一个单调栈)vector<pair<LL,int>>s;......
  • 算法:当一系列数据经过四舍五入后,总和不再等于100%时
    当一系列数据经过四舍五入后,总和不再等于100%时,这通常是由于四舍五入过程中产生的累积误差所导致的。为了处理这个问题,我们可以采用以下几种方法:1.重新分配误差步骤:计算四舍五入后总和与100%的差值。确定一个或多个需要调整的数据点,这些点可以是原始数据中相对不那么重要的......
  • 1001-基于51单片机LCD液晶显示器的8路抢答器(8路,串口,LCD1602)原理图 仿真 源代码
    1001-基于51单片机LCD液晶显示器的8路抢答器(8路,串口,LCD1602)原理图仿真源代码功能描述:8路抢答器1、提前抢答视为违规抢答,蜂鸣器提示2、A机为选手按钮控制,B机为主持人控制。双机通过串口通信3、可设置抢答时间:10s,20s,30s,40s4、LCD显示抢答过程有哪些资料:1、仿真工......