STM32從零開始 - 第二章:LED閃爍程式

CedarDiao發表於2020-11-17

概述

這一章中,我們基於之前用STM32CubeMX產生的專案,使用STM32CubeIDE環境來開發一個LED閃燈的簡單程式。

開啟預設專案

先開啟STM32CubeIDE,選擇File -> Open Projects from File System:

點選Dirctory選擇之前用STM32CubeMX產生的工程目錄。

然後點選Finish按鈕即可。

找到main函式

在左側的專案瀏覽視窗中,找到剛剛開啟的專案,在src/main.c中能找到main函式入口。

main函式是C語言的入口函式,至於main之前所做的事情,有興趣的可以自行去跟蹤。

編譯專案

在專案上右鍵選擇Build Project即可開始編譯專案。

控制LED燈閃爍

查詢控制LED燈的GPIO

在開發板的電路圖上找到LED燈的線路:

可以看到,LED0的控制引腳是PC13,當PC13輸出低電平時燈點亮,當PC13輸出高時燈熄滅。

新增GPIO初始化程式碼

在main函式前面新增下面的程式碼

static void led_init(void)
{
	// PC13 is LED control PIN
	GPIO_InitTypeDef gpiodef;

	gpiodef.Pin = GPIO_PIN_13;
	gpiodef.Mode = GPIO_MODE_OUTPUT_PP;
	gpiodef.Speed = GPIO_SPEED_FREQ_HIGH;

	HAL_GPIO_Init(GPIOC, &gpiodef);
}

新增LED控制介面

在main函式前面新增下面的程式碼

static void led_onoff(int onoff)
{
	if (onoff)
	{
		// PC13 = HIGH
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
	}
	else
	{
		// PC13 = LOW
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
	}
}

延時功能

在stm32f1xx_hal.c檔案裡,已經有一個延時函式:HAL_Delay,這個延時函式可以實現毫秒級的延時

這個延時是基於系統的節拍時鐘Tick計時器來實現的,有興趣的可以去百度查閱Tick時鐘相關的內容。

既然有了現成的介面,我們就不用再費勁去自己造輪子了,至少這個介面目前階段夠我們用了。

實現LED閃爍

在main函式的while(1)迴圈前加入led初始化程式碼,在while迴圈里加入閃爍的程式碼即可:

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  led_init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

	  led_onoff(1);
	  HAL_Delay(500);
	  led_onoff(0);
	  HAL_Delay(500);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

所謂閃爍,其實就是控制LED燈間歇性的點亮和熄滅反覆迴圈即可。

然後再次編譯,如果有語法錯誤,根據語法錯誤排查即可。

用串列埠下載程式

供電:將CH341的USB轉串列埠線拿出,將電平選擇為3.3V,然後就可以直接用串列埠線給開發板供電了。

串列埠:將CH341串列埠端的Rx/Tx分別連線STM32開發板上的PA9/PA10。另外,Rx/Tx如果接反了不會燒燬主機板,所以接反了沒關係,下載不成功再對調一下即可。

跳線:主機板上需要將BOOT0和3V用跳線帽短接起來,這樣上電後STM32會進入串列埠bootloader中以支援下載韌體(下圖的跳線帽是不對的,要將跳線帽改成紅色標記那樣才能進下載模式)。

工具:使用STM32CubeProgrammer即可

下載步驟:

  1. 在工具開啟後,右側連線方式選擇UART(1),將CH341插入到PC的USB口上,點選重新整理(2), 然後選擇對應的串列埠號(3),然後點選Connect(4)

    CH341的串列埠號,通過裝置管理器可以檢視到,下圖顯示的是:COM15.

  2. 點選Connect後再Log區域能看到連線日誌,如果不對,可以對主機板重新上電重試。
  3. 成功連線後工具會自動讀出FLASH中的資料,不用理睬它。
  4. 選擇左側的Erase & Programming頁,可以進入下載頁面:
  5. 在下載頁面裡,選擇要下載的程式,可以選擇elf檔案

    你可能會發現,當你選擇elf或hex型別的檔案時,不需要設定Start address,而選擇bin檔案則需要設定Start address。這是因為:ELF檔案及HEX檔案中已經攜帶了程式檔案的地址資訊,而BIN檔案則是純粹的機器語言程式,裡面是沒有地址資訊的,必需我們告訴下載程式將它下載到FLASH的哪個位置去才能正常執行,上圖右側就是FLASH的扇區資訊,可以看到FLASH的起始地址是0x08000000,通常我們預設編出來的程式燒錄的起始地址就是FLASH的起始地址0x08000000了。

    當然,FLASH裡如果已經有了一個系統(如:Arduino),就需要根據系統的要求將程式燒到指定位置了,此處按住不表。

  6. 按上圖設定號選項後,點選Start Programming開始燒錄,完成後會彈出提示框
  7. 在Log區域裡也能看到燒錄資訊:
  8. 燒錄完成後,將STM32CubeProgrammer工具關掉,然後斷開供電,將BOOT0與GND用跳線帽短接,再次上電後就是執行的剛剛燒錄進去的程式了。

程式執行效果如下:

STM32程式效果:閃燈

 

典型錯誤:

此錯誤可能需要檢查STM32開發板的BOOT0是否沒有上拉到3V3.

IDE環境配置

編譯輸出HEX檔案

在專案上右鍵點選 - 選擇Properties,然後選擇 C/C++ Build -> Settings -> MCU Post build outputs

將Intel Hex file這個選擇勾上:

Apply and close後,再次編譯專案即可得到HEX檔案,位於專案的Debug目錄下:

選擇編譯Debug/Release版本

上面我們看到編譯的東西在Debug版本里,因為專案預設編譯的是Debug配置,我們正式釋出產品是需要編譯Release版本的,通常Release版本具備更高的優化級別以及去掉了一些除錯及日誌相關的功能,IDE本身支援編譯Debug或Release版本的切換,類似VisualStudio那樣。

方法很多,如:

專案右鍵 -> Build Configurations -> Set Active -> Release

或:

選擇選單 Project -> Build Configurations -> Set Active -> Release

或者在Build時直接點選Build圖示右側三角形選擇Release即可:

上圖的小錘子就是Build圖示,直接點選這個小錘子就能編譯,點小錘子旁邊的箭頭則可以選擇編譯Debug或Release版本。

 

 

相關文章