新手小白求助,ch32v307连接esp826601s连接不上,串口连接使用的串口3,打印用的1


#include "usart.h"

#include

#include

#include


void Usart1_Init(unsigned int baud)

{


    GPIO_InitTypeDef gpio_initstruct;

    USART_InitTypeDef usart_initstruct;

    NVIC_InitTypeDef nvic_initstruct;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


    //PA9   TXD

    gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;

    gpio_initstruct.GPIO_Pin = GPIO_Pin_9;

    gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &gpio_initstruct);


    //PA10  RXD

    gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    gpio_initstruct.GPIO_Pin = GPIO_Pin_10;

    gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &gpio_initstruct);


    usart_initstruct.USART_BaudRate = baud;

    usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        //无硬件流控

    usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                        //接收和发送

    usart_initstruct.USART_Parity = USART_Parity_No;                                    //无校验

    usart_initstruct.USART_StopBits = USART_StopBits_1;                             //1位停止位

    usart_initstruct.USART_WordLength = USART_WordLength_8b;                            //8位数据位

    USART_Init(USART1, &usart_initstruct);


    USART_Cmd(USART1, ENABLE);                                                      //使能串口


    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                  //使能接收中断


    nvic_initstruct.NVIC_IRQChannel = USART1_IRQn;

    nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;

    nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;

    nvic_initstruct.NVIC_IRQChannelSubPriority = 2;

    NVIC_Init(&nvic_initstruct);


}


void Usart2_Init(unsigned int baud)

{


    GPIO_InitTypeDef gpio_initstruct;

    USART_InitTypeDef usart_initstruct;

    NVIC_InitTypeDef nvic_initstruct;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);


   

    gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;

    gpio_initstruct.GPIO_Pin = GPIO_Pin_10;

    gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &gpio_initstruct);


    



    gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    gpio_initstruct.GPIO_Pin = GPIO_Pin_11;

    gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &gpio_initstruct);


    usart_initstruct.USART_BaudRate = baud;

    usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        //无硬件流控

    usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                        //接收和发送

    usart_initstruct.USART_Parity = USART_Parity_No;                                    //无校验

    usart_initstruct.USART_StopBits = USART_StopBits_1;                             //1位停止位

    usart_initstruct.USART_WordLength = USART_WordLength_8b;                            //8位数据位

    USART_Init(USART3, &usart_initstruct);


    USART_Cmd(USART3, ENABLE);                                                      //使能串口


    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);                                  //使能接收中断


    nvic_initstruct.NVIC_IRQChannel = USART3_IRQn;

    nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;

    nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;

    nvic_initstruct.NVIC_IRQChannelSubPriority = 0;

    NVIC_Init(&nvic_initstruct);


}


void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len)

{


    unsigned short count = 0;


    for(; count < len; count++)

    {

        USART_SendData(USARTx, *str++);                                 //发送数据

        while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);     //等待发送完成

    }


}


void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...)

{


    unsigned char UsartPrintfBuf[296];

    va_list ap;

    unsigned char *pStr = UsartPrintfBuf;


    va_start(ap, fmt);

    vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap);                         //格式化

    va_end(ap);


    while(*pStr != 0)

    {

        USART_SendData(USARTx, *pStr++);

        while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);

    }


}



void USART1_IRQHandler(void)

{


    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断

    {

        USART_ClearFlag(USART1, USART_FLAG_RXNE);

    }


}

//这是串口初始化,下面是esp8266的代码


#include "debug.h"


#include "esp8266.h"

#include "usart.h"

#include

#include

#define ESP8266_WIFI_INFO       "AT+CWJAP=\"IQOOneo5\",\"12345678\"\r\n"

unsigned char esp8266_buf[512];

unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;


void ESP8266_Clear(void)

{


    memset(esp8266_buf, 0, sizeof(esp8266_buf));

    esp8266_cnt = 0;


}



_Bool ESP8266_WaitRecive(void)

{


    if(esp8266_cnt == 0)                            //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数

        return REV_WAIT;


    if(esp8266_cnt == esp8266_cntPre)               //如果上一次的值和这次相同,则说明接收完毕

    {

        esp8266_cnt = 0;                            //清0接收计数


        return REV_OK;                              //返回接收完成标志

    }


    esp8266_cntPre = esp8266_cnt;                   //置为相同


    return REV_WAIT;                                //返回接收未完成标志


}



_Bool ESP8266_SendCmd(char *cmd, char *res)

{


    unsigned char timeOut = 200;


    Usart_SendString(USART3, (unsigned char *)cmd, strlen((const char *)cmd));


    while(timeOut--)

    {

        if(ESP8266_WaitRecive() == REV_OK)                          //如果收到数据

        {

            UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");

            if(strstr((const char *)esp8266_buf, res) != NULL)      //如果检索到关键词

            {

                ESP8266_Clear();                                    //清空缓存


                return 0;

            }

        }


        Delay_Ms(10);

    }


    return 1;


}




void ESP8266_SendData(unsigned char *data, unsigned short len)

{


    char cmdBuf[32];


    ESP8266_Clear();                                //清空接收缓存

    sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);      //发送命令

    if(!ESP8266_SendCmd(cmdBuf, ">"))               //收到‘>’时可以发送数据

    {

        Usart_SendString(USART3, data, len);        //发送设备连接请求数据

    }


}


unsigned char *ESP8266_GetIPD(unsigned short timeOut)

{


    char *ptrIPD = NULL;


    do

    {

        if(ESP8266_WaitRecive() == REV_OK)                              //如果接收完成

        {

            ptrIPD = strstr((char *)esp8266_buf, "IPD,");               //搜索“IPD”头

            if(ptrIPD == NULL)                                          //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间

            {

                //UsartPrintf(USART_DEBUG, "\"IPD\" not found\r\n");

            }

            else

            {

                ptrIPD = strchr(ptrIPD, ':');                           //找到':'

                if(ptrIPD != NULL)

                {

                    ptrIPD++;

                    return (unsigned char *)(ptrIPD);

                }

                else

                    return NULL;


            }

        }


        Delay_Ms(10);                                              //延时等待

    } while(timeOut--);


    return NULL;                                                        //超时还未找到,返回空指针


}


void ESP8266_Init(void)

{


    ESP8266_Clear();


    UsartPrintf(USART_DEBUG, "1. AT\r\n");

    while(ESP8266_SendCmd("AT\r\n", "OK"))

        Delay_Ms(500);


    UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");

    while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))

        Delay_Ms(500);


    UsartPrintf(USART_DEBUG, "3. AT+CWDHCP\r\n");

    while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))

        Delay_Ms(500);


    UsartPrintf(USART_DEBUG, "4. CWJAP\r\n");

    while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))

        Delay_Ms(500);


    UsartPrintf(USART_DEBUG, "5. ESP8266 Init OK\r\n");


}



void USART2_IRQHandler(void)

{


    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断

    {

        if(esp8266_cnt >= sizeof(esp8266_buf))  esp8266_cnt = 0; //防止串口被刷爆

        esp8266_buf[esp8266_cnt++] = USART3->DATAR;


        USART_ClearFlag(USART3, USART_FLAG_RXNE);

    }


}

image.png卡到连接第一步。


您好,下图圈出部分应该有问题,使用的是串口3 PB10、PB11,应该使能开启GPIOB的时钟,此外中断函数名称应该改为串口3的。此外注意中断函数要加中断声明。

image.png


您好,谢谢您的回复,使能时钟是我疏忽了,我按照您的提供修改了时钟与中断,结果好像没变化,是不是使用串口没用好呢


您好,中断函数注意加一下中断声明,参考下图。若方便,可将你的工程发我的邮箱(lzs@wch.cn)具体看一下

image.png


感谢您的回复,已解决问题


只有登录才能回复,可以选择微信账号登录