最近小弟学习STM32编程,购买了一个模块(WiFi-ESP8266),将引脚接入UART4来驱动,进行收发数据,后面发现,发出去的数据和接收的数据一模一样,感觉不对劲,因为按照模块说明收到数据后,返回值和发送的是有区别的,但是找了好多资料没有找到问题,请各位有经验的大哥指教;如下是代码:(使用的是STM32F103VET6芯片)
这个是UART4的初始化:
void UART4_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4,ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4,DISABLE);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART4, &USART_InitStructure); ;
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
//USART_ITConfig(UART4, USART_IT_TC, ENABLE);
USART_Cmd(UART4, ENABLE);
USART_ClearFlag(UART4, USART_FLAG_TC);
}
这个是发送函数
void WiFi_SendData(u8 *str,unsigned int count)
{
if(count>0)
{
Sendstr1 = str;
Send_Count1 = count;
//GPIO_SetBits(RS485_RTS_PORT, RS485_RTS);
USART_ITConfig(UART4, USART_IT_TXE, ENABLE);
}
}
中断函数:
void UART4_IRQHandler(void) //中断函数
{
unsigned char data=0;
unsigned char sbuf_temp = 0;
/******************/
if(uart.recetime == 0)
{
uart.len = 0;
uart.errorbit = 0 ;
RS485_Read_Count=0;
RS485_Read_OK=0;
}
uart.recetime = 100;//这个是作为是否接收完成的标示,在别的地方用一个定时器控制
/*******************/
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) //判断是否有接收到数据
{
data = USART_ReceiveData(UART4);
sbuf_temp = data;
uart.revice_buffer[uart.len] = sbuf_temp
uart.len++;
RS485_Receive_Time = 0;
if(uart.len > 80 -2)
{
uart.errorbit = 1 ;
uart.len = 76 ;//·¢ÏÖ′íÎó
}
}
if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET) //发送数据
{
if(Send_Count1)
{
USART_SendData(UART4,*Sendstr1++);
Send_Count1--;
}
else
{
USART_ITConfig(UART4, USART_IT_TXE, DISABLE);//发送完毕,停止发送
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//转变成,等等接收
RS485_Send_Time=1;//接收完成标示
}
}
if(USART_GetFlagStatus(UART4,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(UART4,USART_FLAG_ORE);
USART_ReceiveData(UART4);
}
}
|