2018年8月17日 星期五

[STM32] printf 後記

在上一個分享貼文,其實漏交代一個部分。
那就是 標準函式庫 newlib ,因為這裡介紹的是 GCC 方案 所以得說明一下
在上個範例中,我使用的是 內存只有 32K 的 M0 。所以在最後編譯的時候
同學可能會遇到這樣的問題

region `FLASH' overflowed by 3572 bytes

有點糗了。
我也很好奇,當時並沒有發現這個問題。實際上也成功可以 printf 列印到 電腦端 Console。

在網路搜尋 newlib 會有多關於它的背景說明,這裡就跳過。不過我分享這個連結
https://community.arm.com/iot/embedded/b/embedded-blog/posts/shrink-your-mcu-code-size-with-gcc-arm-embedded-4-7

大意是 使用 printf 函式會需要 37K bytes 的 FLASH 及 5K bytes 的 RAM,對於 MCU 來說 真是沉重的負擔。
但使用 newlib 可以削減很多非必要性的功能。使程式碼更有效率....等。

OK,如何做?

因為我們已經安裝整套的 GCC ARM Embedded ,在之前已經安裝好了。
在 Eclipse 的 Project / Properties 對話框 裡
找到 C/C++ Build / Settings / GUN ARM Cross C Linker / Miscellaneous 選項
同學會找到 use newlib-nano 的 Checkbox ,使它 enable 打勾。
在下一個 use float with nano printf 也可以一併打勾,如果需要列印浮點數 最好是使用它。



將範例修改成


double _x1 = 3.1415926;
float _x2 = 3.1415926;

printf("Hello!\r\n");
printf("Double value:%f,sizeof:%lu\r\n",_x1,sizeof(double));
printf("Float value:%f,sizeof:%lu\r\n",_x2,sizeof(float));




列出結果是

Hello!
Double value:3.141593,sizeof:8
Float value:3.141593,sizeof:4

如果將 use float with nano printf 給取消,會減少不少的 code size
但是無法列印浮點數,所以這部分要斟酌一下

Hello!
Double value:,sizeof:8
Float value:,sizeof:4


2018年6月2日 星期六

[STM32] printf 重定向到 UART

一般要開發使用像 STM32 這類的單片機,如果要做 Debug 將訊息往外輸出 最常用的就是 UART 串口。我想也是大部分朋友的習慣,這一篇就來介紹 STM32 如何重定向 printf

其實在 ST 範例包中就可以找到範例,我找了一下 在 STM32F411RE-Nucleo 裡的 UART 有一項 UART_printf  專案。

只要在 main.c 裡加兩段程式碼,在 Define 自變數 段加入以下


#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


然後再任一處 加入以下這個 Function , 我的習慣是放在 SystemClock_Config(void) 前


PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}

huart1是在程式定義 UART 自變數,依你的環境做適當調整。
這樣就完成了。
在 main() 不免俗的來一下 Hello
printf("Hello!\r\n");
..... 等等。 如果你是使用 GCC cross compiler 的朋友,你會發現編譯過程中產生一個錯誤
undefined reference to `_sbrk'
OK,在TrueSTUDIO 範例裡有 syscall.c 檔案, 直接複製到你的專案裡然後重新 Compiler 

在最近的 STM32CUBE 版本中已經加入了 syscall.c 可以不用再手動加入。  

範例連結

https://github.com/cold63/STM32F031x6Project/tree/master/UARTPrintf

相關連結

printf 後記
https://www.makdev.net/2018/08/stm32-printf.html


2018年2月23日 星期五

[STM32] 如何在 Windows 作業系統 建立 STM32CubeMX + Eclipse 開發環境 之 三

STM32CubeMX

在 ST 網站 ( http://www.st.com )搜尋並下載  STM32CubeMX

建立 STM32F031F6Px 做示範,選好 Device Type 後設定需要的功能。



點選 選單列的 Project/Settings


在 Project Name 設定好名稱,在 Toolchain 務必選定 TrueSTUDIO  今年的STM32CUBE版本可以改選 SW4STM32  ,然後 點 OK 離開。
還有進階的 Clock Configuration 及 Configuration 等標籤設定功能,這待後續有機會再分享,現在可以產生原始碼。

點選 Project/Generate Code 開始產生程式碼,完成後 會彈出


請點選 Open Folder 會自動開啟檔案總管 ,就會看到 STM32CubeMX 產生的程式碼。

這段程式碼有在 Github 分享,有興趣的朋友可以到 這個網址 (https://github.com/cold63/STM32F031x6Project) 下載。


Eclipse IDE

請到 https://www.eclipse.org/downloads/eclipse-packages/ 下載 Eclipse 軟體,目前版本是 OXYGEN。 在下載的項目中選擇 C/C++ Package 版本 ,依據您的系統選擇 32 bit 或是 64bit
,並安裝它。



安裝完成後,點選選單列 Help / Install new Software


點選 Add 後,


欄位 Name 填入 

GNU MCU Eclipse Plug-ins
欄位 Location 填入 

http://gnu-mcu-eclipse.netlify.com/v4-neon-updates

點 OK 儲存離開。

回到 Available Software , 在 Work with  下拉選單 選擇剛剛新增的 GNU MCU Eclipse Plug-ins 就會自動下載檔案清單。



初學可以全選打勾, 點選 Next 繼續安裝流程。



安裝完成後,繼續剛剛的 STM32F031F6Px 專案。

首先,先複製 剛剛從 STM32CubeMX 產生的程式碼 連同資料夾 複製到 Eclipse 的 Workspace。

在 資料夾 startup 有個 startup_stm32f031x6.s 文件 ,將它副檔名更名為 asm

startup_stm32f031x6.asm

回到 Eclipse 。

點 File / New / Project... 選擇 C Project


在 Project Name填入剛剛複製的資料夾名稱, 會出現 Directory with specified name already exists. 可以不理會它,點 Next 繼續下一步。


我的習慣將 Debug 取消 , 當然也可以保留。 Next 下一步


會自動帶入 Toolchain 路徑。 Finish 完成

有警告訊息


OK 繼續。
在 Eclipse 的 Project Explorer 出現 STM32F031F6PBoard 的 Project 資料夾



將游標移到 STM32F031F6PBoard 上面按滑鼠 右鍵 , 選擇 Properties



選擇 C/C++ General / Paths and Symbols / Symbols 標籤

按照 ST 的規範 分別建立兩個 Symbols

USE_HAL_DRIVER
STM32F031x6

 Add 加入。將

Add to all configurations
Add to all languages

前面的 checkbox 打勾,建立完成後


選擇 C/C++ General / Paths and Symbols / Includes 標籤
加入 4 個 Include 路徑, 分別是

Drivers/CMSIS/Device/ST/STM32F0xx/Include

Drivers/CMSIS/Include

Drivers/STM32F0xx_HAL_Driver/Inc

Inc

點 Add ,選擇 Workspace... 分別選擇 加入。
一樣將
Add to all configurations
Add to all languages

前面的 checkbox 打勾

Is  a workspace path 不要打勾

Root 名稱要從原本的 STM32F031F6PBoard 改為 ${PathDirPath} 變數,這是 Eclipse 的常規變數。完成後點 Apply



選擇 C/C++ Build / Settings / Tool Settings 標籤
在 Target Processor 項目 的 ARM family 選擇 cortex-m0

移到 GUN ARM Cross C Linker 項目 的 General 加入 STM32F031F6_FLASH.ld 文件


點 OK 後 回到 Properties 設定頁面。再點 Apply and Close
現在已完成基本設定,可以測試 Build 。

在 專案名稱上 點 滑鼠右鍵 找到 Build Project  及 Clean Project

兩個要搭配使用。

執行 Build Project 後 , 在 底下的 Console 視窗開始有 編譯的訊息出現,直到 出現

Finished building: STM32F031F6PBoard.hex
 
Invoking: GNU ARM Cross Print Size
arm-none-eabi-size --format=berkeley "STM32F031F6PBoard.elf"
   text    data     bss     dec     hex filename
   6172    1088    1856    9116    239c STM32F031F6PBoard.elf
Finished building: STM32F031F6PBoard.siz
已經大功告成。現在可以開始繼續您的程式,這只是初步可以編譯
後續再分享其他使用經驗。

2018年1月21日 星期日

[STM32] 如何在 Windows 作業系統 建立 STM32CubeMX + Eclipse 開發環境 之 二


接下來的第二部分是 要開始安裝 Build Tools 及 OpenOCD 這兩個 軟體工具。兩個皆是用手動安裝方式


Build Tools

主要是要安裝 Windows 版本的 make & rm 兩個工具程式,在編譯時會用到
請到 GitHub Releases 這裡下載 ,請找最新版本來下載即可。 我下載的版本是

gnu-mcu-eclipse-build-tools-2.10-20180103-1919-win64.zip 

請依據您的 作業系統 選擇是 32bit 還是 64bit 版本

它是 zip 壓縮 , 所以請用對應工具解開 , 會發現有個資料夾

將它解開後,建議放在

C:\Users\xxx\AppData\Roaming\GUN MCU Eclipse

"xxx" 是您的電腦名稱。

當然也可以放在電腦任何位置,但 Eclipse 插件會優先從這裡開始找起。

這樣就安裝好了。

OpenOCD

也是個開源項目,它可以連接 JTAG 相關工具。 在這裡 就是要連接 ST-LINK 可做燒錄或是除錯的軟體工具。 請到這裡 GitHub Release 下載,也是請自行找適合系統的版本。我下載的版本是

gnu-mcu-eclipse-openocd-0.10.0-6-20180112-1448-win64.zip

使用 zip 工具解開後,會發現和 Build Tools 一樣的資料夾名稱。

OK, 這裡也是放在一樣的資料夾,所以在 GNU MCU Eclipse 資料夾會有 Build Tools 及 OpenOCD

就這樣安裝完成, 簡單吧。
接下來就是主角要上陣了


[STM32] 如何在 Windows 作業系統 建立 STM32CubeMX + Eclipse 開發環境 之 一

在去年12月中 ST 收購了 Atollic 專業開發工具軟體商, 旗下的 TrueSTUDIO IDE 非常有機會成為 STM32 免費的 開發工具。在做為韌體開發工程師及開發公司來說,可說是好消息;因為有多了選擇。雖然如此,先將目前我的開發工具先記錄下來,畢竟也使用很久的時間了。就算要轉換也需要時間適應。
TrueSTUDIO 是使用 Eclipse IDE 架構而延伸的產品, 我在這裡直接使用 Eclipse , 看如何與 STM32CubeMX 組合

首先,列出軟體清單。

  • GNU Arm Embedded Toolchain
     (https://developer.arm.com/open-source/gnu-toolchain/gnu-rm)
  • Windows Build Tools
  • OpenOCD
  • Eclipse IDE for C/C++ Developers
    (https://www.eclipse.org/)
  • STM32CubeMX
    (http://www.st.com)
開始從 Gun Arm Embedded Toolchain 開始 , 透過 Browser 開啟 https://developer.arm.com/open-source/gnu-toolchain/gnu-rm  , 進入首頁後, 在右下角很明顯會看到 Download 。 所以給它點下去。



我選擇這個 , 剛好是 2017 年的最後一版

gcc-arm-none-eabi-7-2017-q4-major-win32.exe

下載後,正常安裝. 不過最後的

取消勾勾, 不需要加入系統環境變數

Add path to environment variable
Add registry infomation
即使加入也沒問題,若同時安裝不同開發環境時。會需要斟酌這一點。

以上是 GUN Arm Toolchain 的安裝過程