netlhx 发表于 2015-8-5 23:18:23

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;         发送过来的数据应该是大端格式。

wambob 发表于 2015-8-6 21:46:16

协议看的有点迷糊,大致意思是通过串口中断收到数据,然后再组合

QH_飞蓬 发表于 2015-8-7 22:40:33

学习了,感谢分享!!

波风水门 发表于 2015-8-10 07:54:25

学习中,感谢分享
页: [1]
查看完整版本: STM32版代码学习笔记二:UART分析