顯示包含「STM32」標籤的文章。顯示所有文章
顯示包含「STM32」標籤的文章。顯示所有文章

2021年8月8日星期日

[MicroPython] STM32F4 使用 MicroPython 應用

 緣起

STM32F401CE mini pyboard  開發板是基於 ST公司 的 STM32F401CE 高效能 ARM Contex-M4 為工作核心,並以 MicroPython 程式語言方向所設計的開發板。因此 SWIO/SWCLK 接腳內定會定為一般的 GPIO 來使用。開發板與電腦接口完全只依靠 STM32F401CE 本身的 USB Port 做為程式開發通訊手段。當然也可回歸於標準 C 語言開發模式。

STM32F401CE 的工作頻率達 84MHz ,並具有浮點單元(FPU) 。Flash Memory 空間為 512 Kbytes,SRAM 空間為 96 Kbytes。做為入門運用程式開發及驗證基本上已經足夠了。開發板電源有 Fuse 自恢復式保險絲做為基本電源保護。內部建置 LDO 3.3V 電源可供 600mA 輸出,並可使用電池 3.6V ~ 4.2V 電源外接輸入。如果同時接入 USB 5V,會自動以 USB 5V 為主。具有獨立外部 RTC 32kHz 振盪器,使 RTC 功能更為精確。

以下是接腳圖

micropython



安裝 MicroPython 方法

事先準備

  1. 準備 STM32F401_MiniPyBoard 
  2. 下載並 安裝 STM32CubeProgrammer ( 連結位置 )
  3. 開啟 Windows 的 裝置管理員
  4. 下載 firmware.hex  燒錄檔  (連結位置 )




開始動作

  1. 開發板上的  Micro USB  接入電腦的 USB 連接器。
  2. BOOT Key 按著不放 , 並按一下 RST Key 重啟。
  3. 1秒後放開  BOOT Key。
  4. 接著 在電腦裡的 裝置管理員 會出現 STM32 BOOTLOADER


  5. 打開 STM32CubeProgrammer
  6. 確認 STM32CubeProgrammer 右上。
    有抓到裝置



    沒抓到裝置, 關閉 STM32CubeProgrammer 並請重回到步驟 1



  7. 有抓到裝置後,點取 Connect

  8. 直接進入畫面



  9. 點一下 Open file Tab 並載入 firmware.hex
    載入成功後,可以直接點右上的 Download 按鈕。


  10. 開始燒錄。



  11. 燒錄成功。


  12. 結束USB 連線, Disconnect。



  13. Micro USB 重新接入,裝置管理員會出現新的 ComPort (如果沒有, 請參考如何安裝 PyBoard 的 Com Port), 並會出現新的磁碟


    micropython

  14. 成功。



測試小段程式


開啟 Thonny 輸入以下程式段。

from pyb import LED
import time

led = LED(1)
while True:
   led.toggle()
   time.sleep_ms(500)

這時候板上的 LED 應該會開始閃爍哦!


[MicroPython] 如何安裝 PyBoard 的 Com Port

在 Windows 系統接入 PyBoard 時 , 在裝置管理員的 Comport 可能會出現 問號裝置。這時候是因為沒有有安裝驅動。

接入 Pyboard 時, 會出現 " PYBFLASH" 磁碟機。打開磁碟機內容

micropython


pybcdc.ini 就是驅動文件檔案。

安裝方式。在裝置管理員在問號裝置,點滑鼠右鍵。選擇安裝驅動程式 或是 更新驅動程式。
使用瀏覽的方式。
micropython


選擇 PYBFLASH , 磁碟代號就依據 電腦系統 給的代號。

micropython


最後依序 按下一步 就可以安裝了。最後再確認裝置管理員 有沒有多出一個 ComPort。



2020年11月1日星期日

[STM32] SDIO SD 卡讀寫測試

 SD 卡 (Secure Digital Memory Card) 在目前生活上應該是不陌生的媒體儲存載體,數位相機、手機、3D列印機.... 等。在做工控專案時常常透過 SD 卡當做機台紀錄的使用,以便了解設計的專案是否有按照既定行程走。這裡簡單介紹 透過 SDIO 介面 讀寫 SD 卡的方法。

這次使用 STM32F401RE 來執行 SD 讀寫功能,所以先來看STM32 規格手冊如何描述




大致來說支援 SDIO Card Specification Version 2.0  的版本且支援 1-bit 與 4-bit 資料寬度,版本 2 就是 SDHC 的版本也就是最大可支援 32GB 容量的 SD 卡 ,在選擇使用上就要注意一下。更多的資訊可以在 sdcard.org 找相關資料。

使用的是 MicroSD 卡,電路圖。

microSD
電路並沒有加提升電阻。除了 SDIO_CK 外,其餘訊號線可以加入 4.7K ~ 10K 的提升電阻。
如果需要自行購買連接器 DIY 接線的話,以下是 pin out 提示

Micro SD

Pin#NameFunction
1DATA2data bit 2
2DATA3data bit 3
3CMDcommand line
4VddSupply voltage
5CLKClock
6VSSGround
7DATA0data bit 0
8DATA1data bit 1

連接器 9 pin 可以為 SD Card 被裝入時的檢知訊號,預設是 Low 準位。

OK,開啟 STM32Cube。建立好專案後,在介面選擇項目中選好 SDIO


模式選擇 4-bit




在腳位顯示會出現 SDIO_D0、SDIO_D1、SDIO_D2,SDIO_D3,SDIO_CK,SDIO_CMD
剛好就是直接對應 線路上的訊號連接。



另外,在 PC2 選擇 GPIO_INPUT 做為SD CARD 裝入檢知訊號輸入腳。

SDIO








OK,硬體連接設定到這裡。因為我們要寫入文
件,所以要開啟 FATFS 第三方套件。


FATFS 是適合小型嵌入式系統的 FAT/exFAT 文件系統,程式碼由 C 組成。非常適合像 單晶片類的器件做開發,想要得到更多資訊可以到 http://elm-chan.org/fsw/ff/00index_e.html 查詢。
設定完成後,在 STM32Cube 產生原始碼並噵入IDE 中。

建立 WriteTest() 測試 functioin

extern FATFS SDFatFS;    /* File system object for SD logical drive */
extern char SDPath[4];   /* SD logical drive path */
extern FIL MyFile;       /* File object for SD */

static void WriteTest(void)
{
	uint8_t wtext[30],rtext[30];
	uint32_t wdataten,rdataten;

	  if(f_mount(&SDFatFS, (TCHAR const*)SDPath, 0) == FR_OK)
	  {
		if(f_open(&MyFile, "file.txt", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK)
		{

			sprintf(wtext,"Write data test with FatFs");

			if(f_write(&MyFile,wtext,strlen(wtext),(void *)&wdataten) == FR_OK)
			{
				printf("write OK.\r\n");
			}


			f_close(&MyFile);
		}

		if(f_open(&MyFile, "file.txt", FA_READ) == FR_OK)
		{
			if(f_read(&MyFile, rtext, sizeof(rtext), (void *)&rdataten) == FR_OK)
			{
				printf("Read:%s\r\n",rtext);
			}

			f_close(&MyFile);

		}

		f_mount(NULL, (TCHAR const*)"", 0);
	  }
}


第一段寫入 "Write data test with FatFs" 並關閉 Myfile。
第二段讀出 file.txt 檔案,並顯示出來



2020年3月3日星期二

[STM32] M0 系列的 IAP 程式跳轉-2

在前面一篇介紹(M0 系列的 IAP 程式跳轉-1)我們已經完成 IAP 和 主程式 2 個 Project,在還沒完成 IAP 下載功能前是否可以先驗證 ? 答案是可以的。

首先,要將前面產出的 hex 檔案 轉換成 bin 檔案。在 compile 時可以直接設定 bin 產出,我這裡是使用 gcc compiler 所以我這裡在 Post-build steps 項目中需要設定

arm-none-eabi-objcopy -S -O binary "${ProjName}.elf" "${ProjName}.bin"
就會自動產出 bin 檔案。

OK,現在需要一個 Hex editor 工具軟體 (網址: https://mh-nexus.de/en/)。下載並安裝完成後,我們先開啟 IAP 的 bin 檔案。

在 File / Open... 載入 bin 檔案,並將拉到最後。我們要找最後位址點

STM32 IAP

以這張截圖來說就是 20 後面,在 Offset 顯示 1CE8。因為前面設定 SRAM 的位置是 0h ~ 3FFFh ,所以兩值要相減就會得到填滿的數值。以這裡會得到 2318。

在 Edit / Insert bytes , 這樣就可以填滿到 3FFFh。另存新名稱 IAPBoot.bin。

STM32 IAP

這時候可以關掉 Hex Editor 軟體。而主程式名稱改成 mainAP.bin
接下來 開啟 cmd 命令列視窗。下二條指令

copy IAPBoot.bin APALL.bin
type mainAP.bin >> APALL.bin

意思是 新增一個 APALL.bin , 然後緊接著 mainAP.bin 主程式。 這樣就完成了
再透過 ST-LINK 將 APALL.bin 作為燒錄檔案,來驗證是否會跳到主程式段。


[STM32] M0 系列的 IAP 程式跳轉-1

STM32 IAP

之前有個案子指定要使用 STM32 M0 ,而在這個專案上又要有 IAP 功能。雖然 STM32 已經有 Embedded bootloader ,可惜的是不符合實際需求。 實做的時候發現 M0 沒有VTOR 暫存器,這點並沒有像 M3/M4 方便。在這裡做個紀錄

首先,我選定晶片的是 STM32F0xx 系列,在硬體上有三個啟動區塊,透過 Boot0 腳位可以選擇。分別是 Main Flash memory,System memory,Embedded SRAM。雖然如此,有沒有可能透過軟體的方式繞過 Boot0 ?


有的,這也是會提到的部分。

在 Reference manual 提到以下,


簡單說 boot 會從 0x0000 0000 開始,而 Flash memory 為主要的啟動空間 。 0x0000 0000 與 0x0800 0000 可以當成同一個位置。

以下的敘述就是這今天題目的重點。



在程式軟體區塊可以選擇 boot 區塊,必需透過 SYSCFG configuration register 的 MEM_MODE 做設定。M0 並不像 M3/M4 有支援 vector table relocation 。 我們可以在程式段設定不同的開機位置。要做的是要將 vector table 抄寫到 SRAM 裡,並將 SRAM Remap 到 0x0000 0000 的位置。

OK,現在要做 2 個 Project 分別是 IAP 和 主程式。首先是 flash memory 區塊選擇,以這次的例子是 IAP 0x0800 0000 ~ 0x0800 3FFF ,主程式段開始從 0x0800 4000。這個劃分沒有一定是這樣做,但是一定要按照 Sector 區塊做選擇。畢竟 Erase 是以 Sector 為最小單位來算,最好在  Reference manual 確認,因為不同型號有可能不相同。

I




AP 程式段會是 程式下載或接收 及 Flash 相關的 Write 與 Erase 等程式。 這次的例子先做如何跳轉到主程式段。以下是開始修改程式過程。


IAP 程式段 - Project 1

在 Define 程式段落加入

#define APP_FLASHADDR 0x08004000
typedef void (*JmpFunction)(void);
APP_FLASHADDR 是主程式的 開始位址, JmpFunction 是 function pointer 宣告。

在 Private variables 區塊加入

uint32_t JumpAddress;
JmpFunction Jump_To_Application;

在 main() 內加入

uint32_t ApplicationAddress = APP_FLASHADDR;

if(((*(__IO uint32_t*)ApplicationAddress); 0x2FFE0000 ) == 0x20000000)
{
 /* Jump to user application */
 JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
 Jump_To_Application = (JmpFunction) JumpAddress;
 /* Initialize user application's Stack Pointer */
 __set_MSP(*(__IO uint32_t*) ApplicationAddress);
 Jump_To_Application();
}
if 判斷式確認是否有程式碼在程式段,如果就執行跳轉的程序。

主程式 - Project 2

首先,先編輯 Linker script。找出 STM32xxx.ld 檔案。尋找下列文字

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 8K
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
}

修改成

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000400, LENGTH = 7K
FLASH (rx)      : ORIGIN = 0x8004000, LENGTH = 48K
SRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 1k
}

在最後一行 .ARM.attributes 0 : { *(.ARM.attributes) } 後面再 新增

.RAMVectorTable : {*(.RAMVectorTable)} >SRAM AT> FLASH
為了要放 Vector table,所以要修改記憶體組織架構

在 main.c 頭段放入

#define APPLICATION_ADDRESS 0x08004000

#if   (defined ( __CC_ARM ))
  __IO uint32_t VectorTable[188] __attribute__((at(0x20000000)));
#elif (defined (__ICCARM__))
#pragma location = 0x20000000
  __no_init __IO uint32_t VectorTable[188];
#elif defined ( __GNUC__ )
  __IO uint32_t VectorTable[188] __attribute__((section(".RAMVectorTable")));
#endif

在 main() 加入

  /* USER CODE BEGIN 1 */
 uint32_t i=0;
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Copy the vector table from the Flash (mapped at the base of the application
load address 0x08004000) to the base address of the SRAM at 0x20000000. */
for(i = 0; i < 188; i++)
{
  VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2 code="">

複製 vector table 內容到 SRAM。關於 vector table 部分,在這裡算是一段落。我找出 datasheet 裡部分內容,因為表格太長就截最後一段。可能會因為型號不同而有所不同,遇到不同的在這裡做調整。


最後, 在 Initialize configured peripherals 前,加入

  /* Enable the SYSCFG peripheral clock*/
  __HAL_RCC_SYSCFG_CLK_ENABLE();

  /* Remap SRAM at 0x00000000 */
  __HAL_SYSCFG_REMAPMEMORY_SRAM();

以上,跳轉部分已完成。 如果要驗證是否是正常運作,可以在 while loop 加入以下程式。看看是否會直接跳轉到這裡。

HAL_Delay(250);
HAL_GPIO_TogglePin(GPIOC,LD4_Pin);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOC,LD3_Pin);

相關連結

M0 系列的 IAP 程式跳轉-2
https://www.makdev.net/2020/03/stm32-m0-iap-2.html


2019年12月17日星期二

[STM32]MicroPython 快速建立與初體驗

其實前陣子就想要測試看看 MicroPython,今天想趁著快要跨年了儘早把這事兒完成吧。

MicroPython

是以 Python 3 程式語言語法一種精簡軟體的實現,其中包含 Python標準庫的一部分。並且經過優化可在微控制器和受限環境中運行。雖然如此,它也包含了 Python 的 REPL 交互式提示符的操作模式,可以立即執行語法合法的命令。

MicroPython 支援的開發版

官方有支援很多的開發版,可以自行到官方網站 (https://store.micropython.org/) 瞧瞧。這裡介紹的是使用 ST 的開發板及快速應用,官方版本也許將來有機會再做說明嘍。

在官方網站上有提供已經編譯好了的 dfu 格式燒錄檔,只要用 dfu 燒錄方法就可以導入 MicroPython 。目前提供以下 。



剛好之前有購入 L476RG 的開發板, 正好可以拿來用。所以如果您也剛好有上面的開發板,也可以直接下載 對應的 dfu 燒錄檔使用。


1.開始前

  • 下載 NUCLEO_L476RG-20190529-v1.11.dfu 檔案
  • STM32 DFU 下載軟體 STSW-STM32080 並安裝。如同安裝軟體般 按 Next 繼續,最後會有DfuSeDemo 這個程式。 
  • 準備 終端軟體 , 如 PUTTY 或是 Xshell 等相同軟體。

2.如何連接

連接方式要用 USB 當做主要的連接方法, 而 NUCLEO-L476RG 這個開發板的 USB 接口是 ST-LINK,實際上並沒有直接連接 USB 的接口必須自行做連接。

我手邊只有 USB B type 的連接器 , 我直接焊上排針。 這樣就方便用杜邦線與開發板做連接。 Power 部份我會用 ST-LINK 所帶過來的 5V ,這裡我就不重複接上了。只接 3 PIN


USB
L476RG
D+
PA12
D-
PA11
GND
GND
DFU 模式燒錄和 串口燒錄一樣, STM32 必須要進入系統儲存器啟動模式。上電之前要將 BOOT0=1 ,BOOT1(PB2)= 0 。不過這個開發板只用 BOOT0 所以我預先將 BOOT0 用短接 JUMP 設給 VDD。

所以最後是長這個樣子,參考一下


3.開始燒錄

確認好前面接線是正確的及BOOT0 要設定好後 ,先接入 ST-LINK 讓開發板先上電之後連接 USB B type 端。在裝置管理員會多出一個新的設備出現 "STM Device in DFU Mode" 表示開發板已經有進入 dfu 模式了並準備好燒錄狀態。


打開 DfuSeDemo 軟體 , 並選好之前下載好的檔案 "NUCLEO_L476RG-20190529-v1.11.dfu"。


 點擊 Upgrade 開始執行燒錄。
燒錄完成後,將 ST-LINK 先移除斷電,BOOT0 短接解除。再重新將 ST-LINK 連接上電。
打開串口終端軟體,我使用的是 Xshell 。並選擇好 ST-LINK 所帶出來的虛擬串口。

裝置管理員

Xshell ,注意 Baud Rate 要設定為 115200


按一下開發板的復位鍵,會出現以下 Python 的 REPL 訊息。



寫小段程式碼測試一下



這一段程式碼會將開發版上的 LED 做出明滅閃爍狀態。以上就先做這樣的介紹,其他細節有機會再做分享了。


相關文章


2019年9月27日星期五

[STM32]如何使用 UART 接收不定長度的資料

有很多情況接收UART 時會遇到未知長度的資料,例如 Modbus , AT Command...。而HAL function 卻沒有直接提供相對應的方法。這裡介紹簡單的範例,此時要利用 UART IDLE 中斷才能實現。
在 main.c 定義相關變數

uint8_t RxBuffer[1024];
uint8_t UartReady;
uint8_t RxCount;

在 while(1) 前定義 ,啟動 IDEL 中斷功能  並使用 UART 接收中斷

__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, 1024);

因為是使用 UART 中斷 所以 改寫 IRQHandler function


extern uint8_t UartReady;
extern uint8_t RxCount;

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

 if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET)
 {
  RxCount = 1024 - huart2.RxXferCount;
  __HAL_UART_CLEAR_IDLEFLAG(&huart2);
  HAL_UART_AbortReceive_IT(&huart2);

  UartReady = SET;
 }
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}

因為是靠 UartReady 做接收資料檢知, 所以必需要另外做一個獨立 loop 來處理接收進來的 Data。


while(1)
{
 if(UartReady == SET)
 {
  //RxBuffer do something.....
  
  UartReady = RESET;
  HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, 1024);  
 }
 HAL_Delay(100);
}

此時的 RxBuffer 就可以丟給後端程式解析處理了,RxCount 也順便計算出此次接收的資料長度。





2018年8月18日星期六

[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月24日星期六

[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
已經大功告成。現在可以開始繼續您的程式,這只是初步可以編譯
後續再分享其他使用經驗。