学前班
最后登录1970-1-1
在线时间 小时
注册时间2019-7-27
|
10火花
奇哉怪也!!ESP8266与stm32 通讯实验程序只能获取一次指令运行,第二次卡死,调试模式下全速运行不会卡死,但获取的反馈不太对,多次调试无果,请大神归位!!!平台为:stm32f429+ATK_ESP8266,固件为附件。
思路:电脑COM调试助手—USB转TTL—单片机USART1;
单片机USART2—ESP8266wifi模块;
USART2开启接收发送中断与USART1交换数据:AT指令—COM—USATRT1—USART2—WiFi模块;WiFi模块的反馈数据—USART2—USART1—COM
测试过:直接运行,第一次正确,第二次不知道卡在哪里
keil调试模式下全速运行,不会出现卡死,但以后接收到的数据与直接通过COM调试助手—USB转TTL—WiFi模块的反馈信息不一致。
通过COM调试助手—USB转TTL—WiFi模块发送指令,用WiFi模块的反馈数据—USART2—USART1—COM接收反馈,反馈的信息也与直接的不一致,会有很多信息。
通过AT指令—COM—USATRT1—USART2—WiFi模块发送AT指令,用WiFi模块—USB转TTL——COM调试助手,能正常,与直接一致。
#include "wifi_USART.h"
#include "BSP_Debug_USART.h"
#include "BSP_led.h"
#include "BSP_SysTick.h"
uint8_t AT_Cmd[wifi_BuffSize]="AT+CWMODE=2\r\n";
uint8_t AT_Cmd_Resp[wifi_BuffSize]={0};
uint8_t wifi_USART_End=0;
uint8_t wifi_USART_RX=0,wifi_USART_TX=0;
uint32_t RX_Count=0,TX_Count=0;
static void wifi_USART_Config(uint32_t Baud_Rate)
{
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(wifi_USART_CLK,ENABLE);
USART_InitStruct.USART_BaudRate=Baud_Rate;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(wifi_USART,&USART_InitStruct);
USART_Cmd(wifi_USART,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel = wifi_USART_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
static void wifi_GPIO_UART_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
/*##-1- Enable peripherals and GPIO Clocks #################################*/
/* Enable GPIO TX/RX clock */
RCC_AHB1PeriphClockCmd(wifi_USART_RX_GPIO_CLK|wifi_USART_TX_GPIO_CLK,ENABLE);
GPIO_PinAFConfig(wifi_USART_TX_GPIO_Port,wifi_USART_TX_GPIO_PinSource,wifi_USART_TX_AF);
GPIO_PinAFConfig(wifi_USART_RX_GPIO_Port,wifi_USART_RX_GPIO_PinSource,wifi_USART_RX_AF);
/* UART TX GPIO pin configuration */
GPIO_InitStruct.GPIO_Pin = wifi_USART_TX_GPIO_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_Init(wifi_USART_TX_GPIO_Port, &GPIO_InitStruct);
/* UART RX GPIO pin configuration */
GPIO_InitStruct.GPIO_Pin = wifi_USART_RX_GPIO_Pin;
GPIO_Init(wifi_USART_RX_GPIO_Port, &GPIO_InitStruct);
}
void USART_wifi_Init(void)
{
wifi_GPIO_UART_Init();
wifi_USART_Config(115200);
}
void wifi_USART_IRQHandle(void)
{
uint8_t tmp;
/* UART in mode Receiver ---------------------------------------------------*/
if(USART_GetITStatus(wifi_USART,USART_IT_RXNE)!=RESET)
{
tmp=(uint8_t)USART_ReceiveData(wifi_USART);
AT_Cmd_Resp[RX_Count]=tmp;
RX_Count++;
if(tmp=='O') //
wifi_USART_End=1;
if(tmp=='K') //
if(wifi_USART_End==1)
{
wifi_USART_End=0;
wifi_USART_RX=1;
RX_Count=0;
USART_ITConfig(wifi_USART,USART_IT_RXNE,DISABLE);
printf("接收的回馈为: %s\n",AT_Cmd_Resp);
}
USART_ClearITPendingBit(wifi_USART, USART_IT_RXNE); // Clears Receive data register not empty flag
}
/* UART in mode Transmitter ------------------------------------------------*/
if(USART_GetFlagStatus(wifi_USART,USART_FLAG_TXE)!=RESET)
{
tmp=AT_Cmd[TX_Count];
TX_Count++;
if(tmp=='\r') //
wifi_USART_End=1;
if(tmp=='\n') //
if(wifi_USART_End==1)
{
wifi_USART_End=0;
wifi_USART_TX=1;
TX_Count=0;
USART_ITConfig(wifi_USART,USART_IT_TXE,DISABLE);
}
USART_SendData(wifi_USART,tmp);
USART_ClearITPendingBit(wifi_USART, USART_FLAG_TXE);
}
}
void Clear_Buff(uint8_t *buff)
{
uint8_t i;
for(i=0;i<wifi_BuffSize;i++)
{
buff=0;
}
}
uint8_t wifi_GetATCmd(void)
{
uint8_t i=0;
Clear_Buff(AT_Cmd);
Clear_Buff(AT_Cmd_Resp);
while(1)
{
AT_Cmd=getchar();
if(AT_Cmd=='\r')
wifi_USART_End=1;
if(AT_Cmd=='\n')
if(wifi_USART_End==1)
{
wifi_USART_End=0;
break;
}
i++;
}
return 1;
}
void wifi_Transmit_AT_Cmd(void)
{
uint16_t Try=10;
printf("发送的指令为: %s",AT_Cmd);
USART_ITConfig(wifi_USART,USART_IT_TXE,ENABLE);
USART_ITConfig(wifi_USART,USART_IT_RXNE,ENABLE);
while((wifi_USART_RX!=1) || (wifi_USART_TX!=1))
{
BSP_Dealy_us(10000);
if(Try--==0)
break;
}
wifi_USART_RX =0;
wifi_USART_TX=0;
BSP_LED_Toggle(Led_R);
}
|
|