野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16817|回复: 1

奇哉怪也!!ESP8266与stm32 通讯实验程序只能获取一次指令运行,第二次卡死,调试...

[复制链接]
发表于 2019-7-27 16:09:55 | 显示全部楼层 |阅读模式
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);
}


调试.rar

337.97 KB, 下载次数: 5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-19 05:51 , Processed in 0.037394 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表