新手小白求助,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;? ? ? ? //無(wú)硬件流控

? ? usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;? ? ? ? ? ? ? ? ? ? ? ? //接收和發(fā)送

? ? usart_initstruct.USART_Parity = USART_Parity_No;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //無(wú)校驗(yàn)

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

? ? usart_initstruct.USART_WordLength = USART_WordLength_8b;? ? ? ? ? ? ? ? ? ? ? ? ? ? //8位數(shù)據(jù)位

? ? 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;? ? ? ? //無(wú)硬件流控

? ? usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;? ? ? ? ? ? ? ? ? ? ? ? //接收和發(fā)送

? ? usart_initstruct.USART_Parity = USART_Parity_No;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //無(wú)校驗(yàn)

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

? ? usart_initstruct.USART_WordLength = USART_WordLength_8b;? ? ? ? ? ? ? ? ? ? ? ? ? ? //8位數(shù)據(jù)位

? ? 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++);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//發(fā)送數(shù)據(jù)

? ? ? ? while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);? ? ?//等待發(fā)送完成

? ? }


}


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)? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果接收計(jì)數(shù)為0 則說(shuō)明沒(méi)有處于接收數(shù)據(jù)中,所以直接跳出,結(jié)束函數(shù)

? ? ? ? return REV_WAIT;


? ? if(esp8266_cnt == esp8266_cntPre)? ? ? ? ? ? ? ?//如果上一次的值和這次相同,則說(shuō)明接收完畢

? ? {

? ? ? ? esp8266_cnt = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? //清0接收計(jì)數(shù)


? ? ? ? return REV_OK;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //返回接收完成標(biāo)志

? ? }


? ? esp8266_cntPre = esp8266_cnt;? ? ? ? ? ? ? ? ? ?//置為相同


? ? return REV_WAIT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //返回接收未完成標(biāo)志


}



_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)? ? ? ? ? ? ? ? ? ? ? ? ? //如果收到數(shù)據(jù)

? ? ? ? {

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

? ? ? ? ? ? if(strstr((const char *)esp8266_buf, res) != NULL)? ? ? //如果檢索到關(guān)鍵詞

? ? ? ? ? ? {

? ? ? ? ? ? ? ? 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);? ? ? //發(fā)送命令

? ? if(!ESP8266_SendCmd(cmdBuf, ">"))? ? ? ? ? ? ? ?//收到‘>’時(shí)可以發(fā)送數(shù)據(jù)

? ? {

? ? ? ? Usart_SendString(USART3, data, len);? ? ? ? //發(fā)送設(shè)備連接請(qǐng)求數(shù)據(jù)

? ? }


}


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)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果沒(méi)找到,可能是IPD頭的延遲,還是需要等待一會(huì),但不會(huì)超過(guò)設(shè)定的時(shí)間

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //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);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //延時(shí)等待

? ? } while(timeOut--);


? ? return NULL;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //超時(shí)還未找到,返回空指針


}


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卡到連接第一步。


您好,下圖圈出部分應(yīng)該有問(wèn)題,使用的是串口3 PB10、PB11,應(yīng)該使能開(kāi)啟GPIOB的時(shí)鐘,此外中斷函數(shù)名稱應(yīng)該改為串口3的。此外注意中斷函數(shù)要加中斷聲明。

image.png


您好,謝謝您的回復(fù),使能時(shí)鐘是我疏忽了,我按照您的提供修改了時(shí)鐘與中斷,結(jié)果好像沒(méi)變化,是不是使用串口沒(méi)用好呢


您好,中斷函數(shù)注意加一下中斷聲明,參考下圖。若方便,可將你的工程發(fā)我的郵箱(lzs@wch.cn)具體看一下

image.png


感謝您的回復(fù),已解決問(wèn)題


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频