如题,再给lora初始化的时候,给的MD0=1,进入配置模式,此时发送AT,正常初始化返回值应该是OK,但是发送后没有数据接收单独的测试lora模块是没有问题的,然后单独的测串口也没有问题,但是现在放在一起用的话就会出问题,收不到数据,也就无法初始化
贴出代码
[mw_shl_code=c,true] HAL_Init(); //初始化HAL库
Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
delay_init(72); //初始化延时函数
USART_DMA_Config(1); //初始化DMA1通道4-TX 通道5-RX
uart_init(1,115200,UART_WORDLENGTH_8B,UART_STOPBITS_1,UART_PARITY_NONE,UART_HWCONTROL_NONE,UART_MODE_TX_RX); //初始化串口
Lora_Test();//lora测试
//主测试函数
void Lora_Test(void)
{
u8 t=0;
printf("ATK-LORA-01 测试程序");
while(LoRa_Init())//初始化ATK-LORA-01模块
{
printf("未检测到模块!!!");
delay_ms(300);
}
printf("检测到模块!!!");
delay_ms(500);
Menu_ui(); //主菜单显示}
u8 LoRa_Init(void)
{
u8 retry=0;
u8 temp=1;
//AUX-PA4 MD0-PA1初始化
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_1; //PA1 MD0初始化
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_4; //PA4 AUX初始化
GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
LORA_MD0=0;
// LORA_AUX=0;
while(LORA_AUX)//确保LORA模块在空闲状态下(LORA_AUX=0)
{
printf("模块正忙,请稍后");
delay_ms(500);
delay_ms(100);
}
usart2_init(115200);//初始化串口2
printf("USART2初始化完成");
delay_ms(20);
LORA_MD0=1;//进入AT模式
delay_ms(40);
retry=3;
while(retry--)
{
if(!lora_send_cmd("AT","OK",70))
{
temp=0;//检测成功
break;
}
}
if(retry==0) temp=1;//检测失败
return temp;
}
u8 lora_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART2_RX_STA=0;
if((u32)cmd<=0XFF)
{
while((USART2->SR&0X40)==0);//等待上一次数据发送完成
USART2->DR=(u32)cmd;
}else u2_printf("%s
",cmd);//发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART2_RX_STA&0X8000)//接收到期待的应答结果
{
if(lora_check_cmd(ack))
{
USART2_RX_STA=0;
break;//得到有效数据
}
}
}
if(waittime==0)res=1;
}
return res;
}[/mw_shl_code][mw_shl_code=c,true]u8* lora_check_cmd(u8 *str)
{
char *strx=0;
if(USART2_RX_STA&0X8000) //接收到一次数据了
{
USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
//初始化IO,串口2
//bound:波特率
void usart2_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_USART2_CLK_ENABLE(); //使能USART2时钟
//UART 初始化设置
UART2_Handler.Instance=USART2; //USART2
UART2_Handler.Init.BaudRate=bound; //波特率
UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART2_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART2_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART2_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART2_Handler); //HAL_UART_Init()会使能UART2
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PA2,PA3
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA2
__HAL_UART_DISABLE_IT(&UART2_Handler,UART_IT_TC);
#if USART2_RX_EN
__HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_RXNE); //开启接收中断
HAL_NVIC_EnableIRQ(USART2_IRQn); //使能USART2中断通道
HAL_NVIC_SetPriority(USART2_IRQn,2,3); //抢占优先级2,子优先级3
#endif
TIM7_Init(100-1,9000-1); //重新设置为10ms中断
HAL_TIM_Base_Stop(&TIM7_Handler); //关闭定时器7
USART2_RX_STA=0; //清零
}
//串口2中断服务程序
void USART2_IRQHandler(void)
{
u8 Res;
if((__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_RXNE)!=RESET))
{
HAL_UART_Receive(&UART2_Handler,&Res,1,1000);
if((USART2_RX_STA&0x8000)==0) //接收完的一批数据,还没有被处理,则不再接收其他数据
{
if(USART2_RX_STA<USART2_MAX_RECV_LEN) //还可以接收数据
{
if(!Lora_mode)//配置模式下(启动定时器超时)
{
TIM7->CNT = 0; //计数器清空
if(USART2_RX_STA==0) //如果没有接收任何数据
{
HAL_TIM_Base_Start(&TIM7_Handler);//开启定时器7
}
}
USART2_RX_BUF[USART2_RX_STA++]=Res; //记录接收到的值
}
else
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
}
// HAL_UART_IRQHandler(&UART2_Handler);
}
//串口2,printf 函数
//确保一次发送数据不超过USART2_MAX_SEND_LEN字节
void u2_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART2_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while((USART2->SR&0X40)==0); //循环发送,直到发送完毕
USART2->DR=USART2_TX_BUF[j];
}
}[/mw_shl_code]
测试串口单独收发数据都是没问题的,有人知道是哪里出错了吗
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>