STM32CubeMX移植機智雲自動生成代碼詳解

本文介紹如何使用STM32CubeMX將機智雲自動生成的stm32源碼程序移植到其他的MCU平台。STM32CubeMX工具請在STM官網註冊賬號后自行下載安裝,本文不做詳細說明。

本示例使用在機智雲自助開發中心生成的STM32F103源碼工程,通過STM32Cube 移植到 STM32L496ZGT6 平台(其他STM32平台的移植也與此相似),我們選擇的開發板為NUCLEO-L496ZG:

(NUCLEO-L496ZG是ST官方推出的Nucleo系列開發板NUCLEO144系列家族的新品,L4系列綜合了低功耗與高性能的優勢,其上集成了ST-LINK/V2-1,使用的是STM32L496ZGT6作為主控,具有超低功耗、豐富外設等特性。)

Advertisements

我們可以通過機智雲自動生成工具生成STM32F103平台的工程源碼(詳情查看文檔:GoKit3二次開發-代碼自動生成工具介紹),下面是生成的源碼目錄結構說明:

[td]

文件名

說明

Driver

其中包含了所有的庫文件

Gizwits

機智雲協議處理文件

Hal

外設驅動文件

MDK-ARM

MDK 的工程文件

Inc

STM32源文件的頭文件

Src

STM32源文件的 C 文件

Utils

公用工具庫文件

.mxproject

STM32Cube 的配置文件

STM32F103C8.ioc

STM32CubeMX 的工程文件(已STM32F103C8平台為例)

註:需要移植的目錄為Gizwits、Hal、Utils三個文件。

#移植到其他STM32平台

Advertisements

移植分為以下幾步:

1.創建STM32CubeMX 工程文件

在STM32CubeMX中直接選擇您所使用的 MCU(比如這裡我們選擇STM32L496ZGTx) ,如下:

點擊「Project → Setting」設置工程目錄位置以及相應參數如下所示:

註:這裡編譯器選擇為Keil 5

2.導入機智雲模板配置文件

因為機智雲自動生成的源碼中已經包含了對應平台的STM32CubeMX工程配置文件,相關驅動參數已經是配置過的,為方便開發者將STM32的源碼移植到其他的平台,我們可以使用STM32CubeMX的配置文件導入功能,將STM32F103平台的配置參數導入到STM32L496ZGT6平台,如下:

選擇File > Import Project

選擇在「前言」中介紹過的STM32F103C8.ioc配置文件,如下圖所示:

點擊「OK」之後可以看到,在STM32L496ZGT6的工程中已經導入的機智雲預先完成的配置文件了。

3.特殊處理(只針對STM32 L系類的低功耗平台,其他平台的開發可跳過此步)

由於NUCLEO-L496ZG開發板的USB串口默認連接的是MCU上的低功耗串口(LPUART1),而不是我們在F103平台上的UART1,故將配置中的UART1換為LPUART1,如下圖:

註:需手動將管腳PG8/PG7設置為LPUART_RX/LPUART_TX類型

4.生成工程代碼

點擊Project > Generate Code或者點擊快捷圖標生成工程代碼。

5.編譯並配置工程

點擊「rebuild」編譯工程

點擊下載到STM32L496ZGT開發板。如果提示錯誤,可以點擊圖標對Option for Target 的Dubug選項進行修改。

註:圖上選的是ST-LINK

點擊Settings->Flash Download勾選 Reset and Run選項。這樣程序下載后自動啟動運行,不用再按一下複位或者重新上電才能運行。

點擊「DownLoad」燒錄按鈕如圖所示證明燒錄成功:

6.移植代碼

此時的工程中只有STM32L496ZGT相關的驅動代碼,若要使用機智雲的聯網能力就需要移植相關的協議源碼(即前文介紹的已自動生成的STM32F103工程中的三個文件:Gizwits、Hal、Utils)

移植前的STM32L496ZGT工程目錄如下:

移植后(即從STM32F103中複製Gizwits、Hal、Utils到STM32L496ZGT下)如下:

接下來我們在STM32L496ZGT的keill5工程中添加如下的目錄結構:

同理加入相應的編譯路徑:

7.添加、修改代碼

首先,為了適配對應的平台應在gizwits_product.h / hal_key.h 中替換為對應平台的頭文件,例如:

將原來F103C8平台的頭文件 #include 「stm32f1xx_hal.h」** 替換為L496ZGT平台的 **#include 「stm32l4xx_it.h」

註:可以在根目錄下的 Drivers\STM32F1xx_HAL_Driver\Inc 中找到對應平台的頭文件。

接下來在main.c中添加與機智雲協議處理相關的代碼:

  • 首先是引用的相關頭文件:

[size=1.33333em]

#include "hal_key.h"

#include "gizwits_product.h"

#include "common.h"

  • 接下來是相關全局變數:

[size=1.33333em]

#define GPIO_KEY_NUM 2 ///< Defines the total number of key member

keyTypedef_t singleKey[GPIO_KEY_NUM]; ///< Defines a single key member array pointer

keysTypedef_t keys;

  • 下面是長短按按鍵回調函數的定義:

[size=1.33333em]

/**

* key1 short press handle

* @param none

* @return none

*/

void key1ShortPress(void)

{

GIZWITS_LOG("KEY1 PRESS ,Production Mode\n");

gizwitsSetMode(WIFI_PRODUCTION_TEST);

}

/**

* key1 long press handle

* @param none

* @return none

*/

void key1LongPress(void)

{

GIZWITS_LOG("KEY1 PRESS LONG ,Wifi Reset\n");

gizwitsSetMode(WIFI_RESET_MODE);

}

/**

* key2 short press handle

* @param none

* @return none

*/

void key2ShortPress(void)

{

GIZWITS_LOG("KEY2 PRESS ,Soft AP mode\n");

#if !MODULE_TYPE

gizwitsSetMode(WIFI_SOFTAP_MODE);

#endif

}

/**

* key2 long press handle

* @param none

* @return none

*/

void key2LongPress(void)

{

//AirLink mode

GIZWITS_LOG("KEY2 PRESS LONG ,AirLink mode\n");

#if !MODULE_TYPE

gizwitsSetMode(WIFI_AIRLINK_MODE);

#endif

}

/**

* Key init function

* @param none

* @return none

*/

void keyInit(void)

{

singleKey[0] = keyInitOne(NULL, KEY1_GPIO_Port, KEY1_Pin, key1ShortPress, key1LongPress);

singleKey[1] = keyInitOne(NULL, KEY2_GPIO_Port, KEY2_Pin, key2ShortPress, key2LongPress);

keys.singleKey = (keyTypedef_t *)&singleKey;

keyParaInit(&keys);

}

  • 接下來是對相關驅動模塊以及機智雲協議模塊的初始化:**

[size=1.33333em]

timerInit();

uartInit();

userInit();

gizwitsInit();

keyInit();

GIZWITS_LOG("MCU Init Success \n");

  • 最後是在main函數中的循環處理函數調用:

[size=1.33333em]

userHandle();

gizwitsHandle((dataPoint_t *)¤tDataPoint);

}

以下是針對L496ZGT平台的特殊修改,其他非低功耗STM32平台可跳過以下內容

由於NUCLEO-L496ZG 串口使用了LPUART1,而不是我們在F103平台上的UART1,故需在部分代碼。

將「Gizwits/gizwits_product.c」中的兩處 」huart1」 改為main.c中已自動生成的 」hlpuart1」

7.編譯源碼燒錄測試

移植完畢相關代碼后我們運行編譯,編譯無錯后燒錄到NUCLEO-L496ZG開發板。根據CubeMX工程配置文件可知串口波特率為:115200。

進而我們可以連接日誌輸出管腳來進一步調試我們的源碼。


#進階開發

##應用相關開發

完成STM32相關平台的移植后,我們可以使用機智雲提供的各種工具來開發自己的項目,相關介紹請查看機智雲文檔中心中的Gokit-MCU發開教程等相關章節。

##驅動相關開發

當硬體配置需要更改時,可以使用STM32CubeMX進行相關硬體驅動的配置開發,進而最大限度的減少源碼上的重複開發,提高開發效率,這裡以按鍵IO配置為例:

在源碼根目錄打開對應平台的STM32CubeMX工程文件

在管腳配置(Pinout)界面修改管腳IO配置,例如將原先的KEY1(PB10)改為PE3,類型為GPIO_Input。

進入配置選項(Configuration),將新配置的管腳名稱與之前的名稱保持一致(這樣就不需要更改源碼中的宏定義),再選擇OK

最後點擊源碼生成按鈕,更新源碼中的IO驅動(並不會影響到之前添加的代碼)

由於NUCLEO-L496ZG硬體連接的方式與F103中的方式不同(下拉),要修改部分按鍵驅動中的程序,在 」 Hal/hal_key.c 」中,將:

改為:

[size=1.33333em]if(HAL_GPIO_ReadPin((GPIO_TypeDef\*)keyS->singleKey.keyPort,keyS->singleKey.keyGpio))

編譯燒錄后,測試按鍵效果。

Advertisements

你可能會喜歡