完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
奇哉怪也!!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=2rn"; 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("接收的回馈为: %sn",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 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); }
|
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-27 09:38 , Processed in 0.544458 second(s), Total 68, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号