找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7003|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32CubeMX移植機(jī)智云自動(dòng)生成代碼詳解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:137406 發(fā)表于 2017-12-28 13:48 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本文介紹如何使用STM32CubeMX將機(jī)智云自動(dòng)生成的stm32源碼程序移植到其他的MCU平臺(tái)。
STM32CubeMX工具請(qǐng)?jiān)?font style="color:rgb(74, 144, 226)">STM官網(wǎng)注冊(cè)賬號(hào)后自行下載安裝,本文不做詳細(xì)說明。
本示例使用在機(jī)智云自助開發(fā)中心生成的STM32F103源碼工程,通過STM32Cube 移植到 STM32L496ZGT6 平臺(tái)(其他STM32平臺(tái)的移植也與此相似),我們選擇的開發(fā)板為NUCLEO-L496ZG:
(NUCLEO-L496ZG是ST官方推出的Nucleo系列開發(fā)板NUCLEO144系列家族的新品,L4系列綜合了低功耗與高性能的優(yōu)勢(shì),其上集成了ST-LINK/V2-1,使用的是STM32L496ZGT6作為主控,具有超低功耗、豐富外設(shè)等特性。)
我們可以通過機(jī)智云自動(dòng)生成工具生成STM32F103平臺(tái)的工程源碼(詳情查看文檔:GoKit3二次開發(fā)-代碼自動(dòng)生成工具介紹),下面是生成的源碼目錄結(jié)構(gòu)說明:
[td]
文件名
說明
Driver
其中包含了所有的庫(kù)文件
Gizwits
機(jī)智云協(xié)議處理文件
Hal
外設(shè)驅(qū)動(dòng)文件
MDK-ARM
MDK 的工程文件
Inc
STM32源文件的頭文件
Src
STM32源文件的 C 文件
Utils
公用工具庫(kù)文件
.mxproject
STM32Cube 的配置文件
STM32F103C8.ioc
STM32CubeMX 的工程文件(已STM32F103C8平臺(tái)為例)
注:需要移植的目錄為Gizwits、Hal、Utils三個(gè)文件。
#移植到其他STM32平臺(tái)
移植分為以下幾步:
1.創(chuàng)建STM32CubeMX 工程文件
在STM32CubeMX中直接選擇您所使用的 MCU(比如這里我們選擇STM32L496ZGTx) ,如下:
點(diǎn)擊“Project → Setting”設(shè)置工程目錄位置以及相應(yīng)參數(shù)如下所示:
注:這里編譯器選擇為Keil 5
2.導(dǎo)入機(jī)智云模板配置文件
因?yàn)闄C(jī)智云自動(dòng)生成的源碼中已經(jīng)包含了對(duì)應(yīng)平臺(tái)的STM32CubeMX工程配置文件,相關(guān)驅(qū)動(dòng)參數(shù)已經(jīng)是配置過的,為方便開發(fā)者將STM32的源碼移植到其他的平臺(tái),我們可以使用STM32CubeMX的配置文件導(dǎo)入功能,將STM32F103平臺(tái)的配置參數(shù)導(dǎo)入到STM32L496ZGT6平臺(tái),如下:
選擇File > Import Project
選擇在“前言”中介紹過的STM32F103C8.ioc配置文件,如下圖所示:
點(diǎn)擊“OK”之后可以看到,在STM32L496ZGT6的工程中已經(jīng)導(dǎo)入的機(jī)智云預(yù)先完成的配置文件了。
3.特殊處理(只針對(duì)STM32 L系類的低功耗平臺(tái),其他平臺(tái)的開發(fā)可跳過此步)
由于NUCLEO-L496ZG開發(fā)板的USB串口默認(rèn)連接的是MCU上的低功耗串口(LPUART1),而不是我們?cè)贔103平臺(tái)上的UART1,故將配置中的UART1換為L(zhǎng)PUART1,如下圖:
注:需手動(dòng)將管腳PG8/PG7設(shè)置為L(zhǎng)PUART_RX/LPUART_TX類型
4.生成工程代碼
點(diǎn)擊Project > Generate Code或者點(diǎn)擊快捷圖標(biāo)生成工程代碼。
5.編譯并配置工程
點(diǎn)擊“rebuild”編譯工程
點(diǎn)擊下載到STM32L496ZGT開發(fā)板。如果提示錯(cuò)誤,可以點(diǎn)擊圖標(biāo)對(duì)Option for Target 的Dubug選項(xiàng)進(jìn)行修改。
注:圖上選的是ST-LINK
點(diǎn)擊Settings->Flash Download勾選 Reset and Run選項(xiàng)。這樣程序下載后自動(dòng)啟動(dòng)運(yùn)行,不用再按一下復(fù)位或者重新上電才能運(yùn)行。
點(diǎn)擊“DownLoad”燒錄按鈕如圖所示證明燒錄成功:
6.移植代碼
此時(shí)的工程中只有STM32L496ZGT相關(guān)的驅(qū)動(dòng)代碼,若要使用機(jī)智云的聯(lián)網(wǎng)能力就需要移植相關(guān)的協(xié)議源碼(即前文介紹的已自動(dòng)生成的STM32F103工程中的三個(gè)文件:Gizwits、Hal、Utils)
移植前的STM32L496ZGT工程目錄如下:
移植后(即從STM32F103中復(fù)制Gizwits、Hal、Utils到STM32L496ZGT下)如下:
接下來我們?cè)赟TM32L496ZGT的keill5工程中添加如下的目錄結(jié)構(gòu):
同理加入相應(yīng)的編譯路徑:
7.添加、修改代碼
首先,為了適配對(duì)應(yīng)的平臺(tái)應(yīng)在gizwits_product.h / hal_key.h 中替換為對(duì)應(yīng)平臺(tái)的頭文件,例如:
將原來F103C8平臺(tái)的頭文件 #include “stm32f1xx_hal.h”** 替換為L(zhǎng)496ZGT平臺(tái)的 **#include “stm32l4xx_it.h”
注:可以在根目錄下的 Drivers\STM32F1xx_HAL_Driver\Inc 中找到對(duì)應(yīng)平臺(tái)的頭文件。
接下來在main.c中添加與機(jī)智云協(xié)議處理相關(guān)的代碼:
  • 首先是引用的相關(guān)頭文件:
[size=1.33333em]/* USER CODE BEGIN Includes */

#include "hal_key.h"
#include "gizwits_product.h"
#include "common.h"

/* USER CODE END Includes */
  • 接下來是相關(guān)全局變量:
[size=1.33333em]/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/
#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;   

/* USER CODE END PV */
  • 下面是長(zhǎng)短按按鍵回調(diào)函數(shù)的定義:
[size=1.33333em]/* USER CODE BEGIN 0 */

/**
* 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);
}

/* USER CODE END 0 */
  • 接下來是對(duì)相關(guān)驅(qū)動(dòng)模塊以及機(jī)智云協(xié)議模塊的初始化:**
[size=1.33333em]/* USER CODE BEGIN 2 */

  timerInit();
  uartInit();

  userInit();
  gizwitsInit();
  keyInit();
  GIZWITS_LOG("MCU Init Success \n");

/* USER CODE END 2 */
  • 最后是在main函數(shù)中的循環(huán)處理函數(shù)調(diào)用:
[size=1.33333em]/* USER CODE BEGIN 3 */

      userHandle();
      gizwitsHandle((dataPoint_t *)¤tDataPoint);
}

/* USER CODE END 3 */
以下是針對(duì)L496ZGT平臺(tái)的特殊修改,其他非低功耗STM32平臺(tái)可跳過以下內(nèi)容
由于NUCLEO-L496ZG 串口使用了LPUART1,而不是我們?cè)贔103平臺(tái)上的UART1,故需在部分代碼。
將“Gizwits/gizwits_product.c”中的兩處 ”huart1” 改為main.c中已自動(dòng)生成的 ”hlpuart1”
7.編譯源碼燒錄測(cè)試
移植完畢相關(guān)代碼后我們運(yùn)行編譯,編譯無錯(cuò)后燒錄到NUCLEO-L496ZG開發(fā)板。根據(jù)CubeMX工程配置文件可知串口波特率為:115200。
進(jìn)而我們可以連接日志輸出管腳來進(jìn)一步調(diào)試我們的源碼。

#進(jìn)階開發(fā)
##應(yīng)用相關(guān)開發(fā)
完成STM32相關(guān)平臺(tái)的移植后,我們可以使用機(jī)智云提供的各種工具來開發(fā)自己的項(xiàng)目,相關(guān)介紹請(qǐng)查看機(jī)智云文檔中心中的Gokit-MCU發(fā)開教程等相關(guān)章節(jié)。
##驅(qū)動(dòng)相關(guān)開發(fā)
當(dāng)硬件配置需要更改時(shí),可以使用STM32CubeMX進(jìn)行相關(guān)硬件驅(qū)動(dòng)的配置開發(fā),進(jìn)而最大限度的減少源碼上的重復(fù)開發(fā),提高開發(fā)效率,這里以按鍵IO配置為例:
在源碼根目錄打開對(duì)應(yīng)平臺(tái)的STM32CubeMX工程文件
在管腳配置(Pinout)界面修改管腳IO配置,例如將原先的KEY1(PB10)改為PE3,類型為GPIO_Input。
進(jìn)入配置選項(xiàng)(Configuration),將新配置的管腳名稱與之前的名稱保持一致(這樣就不需要更改源碼中的宏定義),再選擇OK
最后點(diǎn)擊源碼生成按鈕,更新源碼中的IO驅(qū)動(dòng)(并不會(huì)影響到之前添加的代碼)
由于NUCLEO-L496ZG硬件連接的方式與F103中的方式不同(下拉),要修改部分按鍵驅(qū)動(dòng)中的程序,在 ” Hal/hal_key.c ”中,將:
改為:
if(HAL_GPIO_ReadPin((GPIO_TypeDef\*)keyS->singleKey.keyPort,keyS->singleKey.keyGpio))
編譯燒錄后,測(cè)試按鍵效果。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表