netlhx 发表于 2015-8-5 22:43:39

STM32版代码学习笔记一:主框架分析

本帖最后由 netlhx 于 2015-8-5 22:47 编辑

想把GOKIT上面的扩展板插到NUCLEO F411上面,得仔细研究下源代码。

今天只看下主框架,做到对程序主要功能了解的程度,打工MAIN.C文件,首先是一堆变量定义
UART_HandleTypeDef                                       UART_HandleStruct;
Pro_Wait_AckTypeDef                     Wait_AckStruct;
Device_WirteTypeDef                                             Device_WirteStruct;                  
Device_ReadTypeDef                Device_ReadStruct;

Pro_M2W_ReturnInfoTypeDef                                  Pro_M2W_ReturnInfoStruct;
Pro_CommonCmdTypeDef                                       Pro_CommonCmdStruct;
Pro_W2D_WifiStatusTypeDef                      Pro_W2D_WifiStatusStruct;   
Pro_CommonCmdTypeDef                                              Pro_M2WResetCmdStruct;                  
Pro_D2W_ConfigWifiTypeDef               Pro_D2WConfigCmdStruct;                  
Pro_D2W_ReportDevStatusTypeDef         Pro_D2W_ReportStatusStruct;
KEY_StatusTypeDef                                                               KEY_Status;
uint8_t                                                                                                               SN;   
uint32_t SystemTimeCount = 0;
uint32_t ReportTimeCount = 0;

uint8_t Set_LedStatus = 0;
这些变量大部分都是WIFI与设备交换信息用的结构体定义,只是这些变量的名称还不太清楚,下面都是自己猜的,后面再来慢慢验证:
Pro: Product?
Device_WriteXXX: 可写类型外设,电机速度等?
Device_ReadXXX: 只读类型外设,如温、湿度等?
M2W: MCU to WIFI?
D2W:???
W2D:???

不知道谁熟悉这些变量的含义,希望能解释一下哈。

先放一放,看主要功能框架。


int main(void)
{
      SystemInit();
      UARTx_Init();
      Printf_SystemRccClocks();
      RTC_Init();
      Hal_Init();
      McuStatusInit();
      
      while(1)
      {
                MessageHandle();
                KEY_Handle();               
                IR_Handle();
                DHT11_Read_Data(&Device_ReadStruct.Temperature, &Device_ReadStruct.Humidity);
                ReportDevStatusHandle();
      }
}
从代码看,主框架主要实现如下功能:


[*]SystemInit()主要完成系统硬件初始化,特别是时钟树的初始化
[*]UARTx_Init()这个应该是初始化串口,WIFI模块就是通过串口与MCU交换信息的
[*]RTC_Init() 初始化实时时钟
[*]Hal_Init() 完成外设扩展板上外设的初始化
[*]McuStatusInit()这个就是对上面那一堆变量的初始化了
[*]接下来是任务处理部分代码,完成消息处理、按键处理等,最后报告设备状态

基本上的功能就是如此。

代码本身是用STD库实现的,也许官方负责这个工程的人也熟悉HAL库的开发,所以添加的一些功能就使用了类似HAL库的风格。这种STD及HAL混用风格的代码看着实在关疼!

上面有个这样的类型定义
__packed      typedef struct      
{
      uint8_t                                                      Package_Flag;                                     //ÅжÏÊÇ·ñ½ÓÊÕµ½Ò»¸öÍêÕûµÄ´®¿ÚÊý¾Ý°ü         
      uint8_t                                                      UART_Flag1;
      uint8_t                                                      UART_Flag2;
      uint16_t                                                 UART_Count;                                                                //´®¿Ú»º³åÇø¼ÆËãÊý¾Ý³¤¶È      
      uint8_t                                                         UART_Cmd_len;                                                      //Ö¸Á¶È      
      uint8_t                                                 UART_Buf;               //´®¿Ú»º³åÇø
      uint8_t             Message_Buf; //´¦Àí½ÓÊÕµ½Ö¸ÁîµÄBuf
      uint8_t             Message_Len;                  //´¦ÀíÐÅÏ¢³¤¶È
      
}UART_HandleTypeDef;

只是HAL库里也有个这样的定义


typedef struct
{
USART_TypeDef               *Instance;      /*!< UART registers base address      */

UART_InitTypeDef            Init;             /*!< UART communication parameters      */

uint8_t                     *pTxBuffPtr;      /*!< Pointer to UART Tx transfer Buffer */

uint16_t                      TxXferSize;       /*!< UART Tx Transfer size            */

uint16_t                      TxXferCount;      /*!< UART Tx Transfer Counter         */

uint8_t                     *pRxBuffPtr;      /*!< Pointer to UART Rx transfer Buffer */

uint16_t                      RxXferSize;       /*!< UART Rx Transfer size            */

uint16_t                      RxXferCount;      /*!< UART Rx Transfer Counter         */

DMA_HandleTypeDef             *hdmatx;          /*!< UART Tx DMA Handle parameters      */
   
DMA_HandleTypeDef             *hdmarx;          /*!< UART Rx DMA Handle parameters      */

HAL_LockTypeDef               Lock;             /*!< Locking object                     */

__IO HAL_UART_StateTypeDef    State;            /*!< UART communication state         */

__IO uint32_t               ErrorCode;      /*!< UART Error code                  */

}UART_HandleTypeDef;

过一段时间后,这种定义还真是头疼,希望新版改进一下吧。STD就不要用HAL风格,HAL也不要用STD风格。

上面是就设备本身的功能来分析。

实际上还有个APP,APP通过网络(路由器或3G/4G网络)将信息发送给透传模块,模块再通过UART与MCU通信。同时MCU定期将设备状态再通过透传模块发送给APP,这样就实现了双向通信。

框架就分析到这里,下面的笔记再来研究具体的功能.


爱篮 发表于 2015-8-5 22:48:50

沙发沙发,楼主顶一下,那代码表示看不懂……多谢楼主解释

netlhx 发表于 2015-8-5 22:52:02

爱篮 发表于 2015-8-5 22:48
沙发沙发,楼主顶一下,那代码表示看不懂……多谢楼主解释

我也看不懂,都是猜的:lol

wambob 发表于 2015-8-6 21:43:57

看了 下主代码,有点聊解

波风水门 发表于 2015-8-8 19:39:31

今天刚拿到板子,试试
页: [1]
查看完整版本: STM32版代码学习笔记一:主框架分析