STM32從零開始 - 第二章:LED閃爍程式
概述
這一章中,我們基於之前用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即可
下載步驟:
- 在工具開啟後,右側連線方式選擇UART(1),將CH341插入到PC的USB口上,點選重新整理(2), 然後選擇對應的串列埠號(3),然後點選Connect(4)
CH341的串列埠號,通過裝置管理器可以檢視到,下圖顯示的是:COM15.
- 點選Connect後再Log區域能看到連線日誌,如果不對,可以對主機板重新上電重試。
- 成功連線後工具會自動讀出FLASH中的資料,不用理睬它。
- 選擇左側的Erase & Programming頁,可以進入下載頁面:
- 在下載頁面裡,選擇要下載的程式,可以選擇elf檔案
你可能會發現,當你選擇elf或hex型別的檔案時,不需要設定Start address,而選擇bin檔案則需要設定Start address。這是因為:ELF檔案及HEX檔案中已經攜帶了程式檔案的地址資訊,而BIN檔案則是純粹的機器語言程式,裡面是沒有地址資訊的,必需我們告訴下載程式將它下載到FLASH的哪個位置去才能正常執行,上圖右側就是FLASH的扇區資訊,可以看到FLASH的起始地址是0x08000000,通常我們預設編出來的程式燒錄的起始地址就是FLASH的起始地址0x08000000了。
當然,FLASH裡如果已經有了一個系統(如:Arduino),就需要根據系統的要求將程式燒到指定位置了,此處按住不表。
- 按上圖設定號選項後,點選Start Programming開始燒錄,完成後會彈出提示框
- 在Log區域裡也能看到燒錄資訊:
- 燒錄完成後,將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版本。
相關文章
- c51控制led閃爍
- Arduino 初級使用 單LED等閃爍UI
- 51微控制器程式框架之LED閃爍_方法1框架
- 國內的 Stduino IDE 基於 STM32 的串列埠通訊與 LED 燈閃爍UIIDE串列埠
- 1(5)led燈閃爍、常見ip核介紹
- (4)8個led每0.5s閃爍(跑馬燈)
- 1、51微控制器實現LED燈的閃爍
- 從零開始
- 使用CCS10新建TMS320F28335工程並閃爍LED(流水燈)程式S3
- 不怕從零開始,只怕從未開始!
- 微控制器小白學習之路(四)---led燈的閃爍
- STC89C52以1HZ頻率閃爍LED
- FPGA程式設計從零開始 使用VerilogFPGA程式設計
- 從零開始學習如何部署程式碼
- flutter 從零開始-1Flutter
- 從零開始學PythonPython
- js閃爍效果JS
- Photon物聯網程式設計從零開始程式設計
- uni-app 小程式從零開始的開發流程APP
- 從零開始--webpack 4 配置Web
- 從零開始學 Spring BootSpring Boot
- 線段樹從零開始
- 從零開始學正則
- 從零開始認識 SparkSpark
- 從零開始學習laravelLaravel
- 幾何庫從零開始
- 從零開始學習KafkaKafka
- 【ROS】從零開始學ROSROS
- 併發程式設計從零開始(十一)-Atomic類程式設計
- 【51程式設計經驗筆記】第三節:累計主迴圈次數使LED燈閃爍程式設計筆記
- 從零開始開發一個 WebpackWeb
- 從零開始dumpdecrypted砸殼解析
- 從零開始機器學習機器學習
- 從零開始的fgg--htmlHTML
- 從零開始搭建腳手架
- 從零開始學golang之TCPGolangTCP
- 從零開始的Flutter之旅: NavigatorFlutter
- 從零開始認識堆排序排序