STM32版代码学习笔记二:UART分析
本帖最后由 netlhx 于 2015-8-6 08:18 编辑WIFI模块通过串口与MCU通信,所以接下来就是初始化串口。
void UARTx_Init(void)
{
UART_GPIO_Init();
UART_Config();
NVIC_Configuration();
}串口代码分三步来实现
[*]初始化GPIO
[*]配置通信参数
[*]中断处理
由于GOKIT有几种版本,所以代码里面使用了宏定义来区分不硬件对应的UART,下面摘录部分代码来看看,hal_uart.h里面有一些定义
#define Open_UART1
#define Open_UART2
#define Open_UART3
这里分别定义了UART1到3,对应3个不同的串口,STM32版使用的是UART2,对应的GPIO为PA2及PA3
UART2参数配置
#if defined (Open_UART2)
USART_InitStructure.USART_BaudRate = 9600;
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(USART2, &USART_InitStructure);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_Cmd(USART2, ENABLE);通信波特率为9600,开启了接收中断,这些配置都比较简单,复杂的在下面,也就是对接收到的信息进行分析及处理。
extern UART_HandleTypeDef UART_HandleStruct;
extern Device_ReadTypeDef Device_ReadStruct;
void USART2_IRQHandler(void)
{
uint8_t vlue;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
// printf("**\r\n");
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
vlue = USART_ReceiveData(USART2);
if(UART_HandleStruct.Package_Flag ==0)
{
if(UART_HandleStruct.UART_Flag1 ==0)
{
if(vlue == 0xff)
{
UART_HandleStruct.UART_Count = 0;
UART_HandleStruct.UART_Buf=vlue;
UART_HandleStruct.UART_Count++;
UART_HandleStruct.UART_Flag1 = 1;
}
return ;
}
else if(UART_HandleStruct.UART_Flag2 ==0)
{
UART_HandleStruct.UART_Buf=vlue;
UART_HandleStruct.UART_Count++;
if(UART_HandleStruct.UART_Buf == 0xff)
{
UART_HandleStruct.UART_Flag2 = 1;
}
else
{
UART_HandleStruct.UART_Flag1 = 0;
}
return ;
}
else
{
UART_HandleStruct.UART_Buf = vlue;
if(UART_HandleStruct.UART_Count >=4 && UART_HandleStruct.UART_Buf == 0x55 && UART_HandleStruct.UART_Buf == 0xFF)
{}
else
UART_HandleStruct.UART_Count++;
if(UART_HandleStruct.UART_Count == 0x04)
{
UART_HandleStruct.UART_Cmd_len = UART_HandleStruct.UART_Buf*256+UART_HandleStruct.UART_Buf;
}
if(UART_HandleStruct.UART_Count ==(UART_HandleStruct.UART_Cmd_len + 4))
{
UART_HandleStruct.Package_Flag = 1;
UART_HandleStruct.UART_Flag1 = 0;
UART_HandleStruct.UART_Flag2 = 0;
// printf("Package_Flag =1 \r\n");
}
}
}
}
}
要想看懂这一段代码,就必须看通信协议了,这些通信协议都是官方定义好的,其实也不用完全看懂,照搬就是了。
这里附上官方的介绍
上面一段代码的作用,就是逐字符接收,根据收到的内容进行排重,直到接收到一个完整的协议包。
根据这一句的内容UART_HandleStruct.UART_Cmd_len = UART_HandleStruct.UART_Buf*256+UART_HandleStruct.UART_Buf; 发送过来的数据应该是大端格式。
协议看的有点迷糊,大致意思是通过串口中断收到数据,然后再组合 学习了,感谢分享!! 学习中,感谢分享
页:
[1]