stm32填坑之旅一 - stm32f103c8t6點亮板載貼片藍色LED

轉載請註明:http://www.javashuo.com/article/p-ccrgjusf-dc.htmlhtml

開篇

沒有時間只是本身找的藉口罷了!
開篇必定要精彩,否則路人不理睬!下述是筆者做爲arm小白的填坑之旅python

沒錯,這個以前一直從事軟件開發的筆者,開始搞硬件了,固然僅僅是數電!模電須要有很紮實的電路基礎,而筆者有的只有「紮實」的邏輯基礎。
那爲何筆者要開始搞硬件呢?
其實早在大學期間,筆者所在專業(計算機科學與技術)中就有一門課就專門講了硬件-軟件的鏈接以及實現,只怪當初沒有好好學,只是心中有那麼個印象,就是時鐘驅動邏輯電路去處理每個指令而後完成整個邏輯(固然,這個印象很重要,在arm中,時鐘就是它的心臟!)。
畢業後若干年,物聯網行業開始興起,因而手癢癢了,僅憑這一印象,開始入手了人生中的第一塊板子——樹莓派3B,用來作了一些小玩意兒,但那都是在linux的基礎上作的,和軟件開發沒什麼區別,因而乎,這塊樹莓派至今都在吃灰。
第二塊板子即是arduino,比樹莓派稍微有點難度了,沒有OS,且ram也只有幾百KB,作了幾個demo後,發現太依賴arduino的環境了,也不是C開發,並無真正接觸底層,因而這塊arduino跟樹莓派正在一塊兒吃灰中。
筆者的主開發語言是js,出於對腳本語言的熟練,我偶然間發現了NodeMCU這個東西,發現是塊能夠用lua腳本寫邏輯的板子,甚是歡喜,後來還燒錄了espruino固件和micropython固件,把玩了許久後終於仍是去吃灰了!
看來IoT行業並無那麼簡單,因而收收心搞主業了!直到上個月手頭沒啥業務了,又開始手癢癢,查閱了avr和arm的利弊後,最終選擇了arm,畢竟大佬的意見是想挑戰就選arm(其實arduino板就是使用了avr架構的atmega芯片)!因而開始某寶之路。linux

選材#1 STM32f103c8t6

筆者做爲arm初學者,不能上來就搞大貨(好比xx開發套件,xx集成開發板),一是貴,二是不必。再三某寶後,最終選定了stm32最便宜的板子STM32f103c8t6,是國產的板子,應該是st受權過的板子,而後各類仿製。
筆者入的是塊黑色板子,以下圖:

這塊板子對於初學者來講太實惠了,RMB11,65536b(64kb)的flash和20480b(20kb)的sram,徹底夠用了,還有一個microUSB口,舒服!
固然,某寶上還有其餘各類顏色的板子,電路排布略有不一樣,但功能都不盡相同。架構

踩坑#1 燒錄

興致勃勃地拿了快遞,興致勃勃地拆了快遞,興致勃勃地拿USB線鏈接到了電腦,尷尬的是毫無反應,USB信息裏也沒有任何st字樣的項,因而開始查閱各類資料才發現,stm32f103x的microUSB口是用做電源和DFU燒錄用的,因而又查了DFU的資料,發現stm32f103x並無燒錄dfu的支持固件,因此不能用DFU燒錄,因此仍是要其餘燒錄方式!編輯器

選材#2 st-link v2

在採坑#1後,我查到了stm32的另外兩種燒錄方式:JTag和st-link,JTag在某寶上的價格要幾十塊,而st-link則是10塊上下,可是JTag比st-link要好用,因而果斷選了st-link,便宜和愛折騰纔是王道(一位圖拉丁人說)。
因而在某寶上又入了一個st-link v2,RMB10.5。工具

踩坑#2 跑起來了

拿到st-link後,才意識到stm板子上的引腳沒有焊接,因而就把swd引腳和跳線引腳給焊接上了。
而後照着板子上的swd的引腳說明,鏈接到st-link對應的引腳!

完美,一插上,板子上的貼片藍色LED就開始閃爍起來了(聽說藍燈閃爍是出場時候燒錄的測試程序,說明板子是正常工做的)。測試

踩坑#3 開發環境搭建

在查閱資料的時候,發現大大多數開發者用的操做系統要麼是Windows要麼就是Linux的,而筆者用的macOS,又一個大坑漸漸浮現,我直接填一下吧。
須要材料:ui

  1. 安裝STM32CubeMX
  2. 安裝homebrew
  3. 安裝stlink命令行工具:brew install stlink
  4. 安裝open-ocd命令行工具:brew install openocd
  5. 安裝Clion2019,筆者比較喜歡jetbrains系列的IDE。記住,必定要安裝新版本,老闆沒有適配和安裝Embedded MCU Development plugin,這個插件能簡化不少操做!

而後就能夠愉快地玩耍了!
打開clion,新建一個項目,選嵌入式stm32的那個

建立項目後,會自動打開STM32CubeMX,或者手動打開項目中的ioc文件,在編輯區會有一個連接能打開STM32CubeMX。

它默認建立的是STM32f030f4px的芯片,在下面的操做中修改芯片

而後在project manager中修改

路徑修改了一次就不能修改了哦!最後點擊右上角的generate code。
返回clion後,就會同步文件,發現代碼都生成了,點擊編譯,竟然絕不費力地成功了,甚是歡喜!

而後燒錄,點擊運行,clion竟然報錯了

原來是編輯器板子的配置文件沒有選定,須要再run/debug configuration中配置


這時,筆者找遍了整個列表都沒找到stm32f103字樣的項,因而去各類查閱,網上說並無stm32f1discovery的項,這個low-level的板子太雜了,須要用board/st_nucleo_f103rb.cfg才行。
而後再點擊運行,嘿,竟然一堆紅色的文子,看得頭皮發麻

而後又是各類查閱,原來要修改board/st_nucleo_f103rb.cfg的配置google

  • 把接口改爲stlink-v2,原來是stlink-v2-1,筆者買的是stlink-v2,若是你買的是v2-1,那這個不用修改
  • 把最後一行註釋掉 #reset_config srst_only

再運行,嘿,藍燈竟然不閃了,估計是燒錄成功了,由於紅色文子裏沒有什麼錯誤信息了。
而後開始看項目結構,根據筆者的經驗,用戶邏輯的入口確定是相似src,main之類字樣的文件中的,果真,在Src/main.c中找到了入口。
裏面有不少註釋,主要是用於STM32CubeMX生成代碼所標記的,不要亂改這些註釋,不然會對代碼生成產生影響的,你須要修改的就USER CODE字樣註釋範圍內。
果真找到了藍燈不閃爍的緣由了,原來是main方法裏的while裏是空的,致使沒有對藍燈沒有作任何處理,藍燈默認是滅的。
因而開始查閱stm32有關GPIO的文檔,可使用hal庫來操做lua

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
    HAL_Delay(100);
  }

HAL_GPIO_TogglePin方法是切換io口的狀態,第一個參數是io口的集合,第二個參數是具體集合中那個口。那爲何是GPIOB和GPIO_PIN_12呢?

採坑#4 GPIO

STM32f103c8t6板載的藍色LED確定是能修改的,或者是有其餘用途的。經仔細查閱某寶的那個詳情後,找到了它的電路圖

在圖中,找到了兩個LED燈,一個是紅色LED,是接地的,常亮狀態,指示通電狀態。藍色LED則是接入到了PB12,意思就是能夠經過PB12的口來控制這個藍燈,因而,推斷一下就是GPIOB和GPIO_PIN_12這兩個參數了(實際上是經過屢次敲代碼,在只能提示候選列表中找到的)。
HAL_Delay天然就是延時等待多少毫秒的做用了!
代碼修改好了,再運行,吧唧,沒反應,藍燈沒有閃也沒有亮,咋回事?預期應該是狂閃的呀!

採坑#5 hal庫和rcc庫

爲何操做GPIO沒有反應呢?依舊是查閱資料,網上說須要配置GPIO,否則用不了,而後給出了不少代碼,粘貼進來後,都是語法錯誤,什麼RCC沒有找到之類的錯誤,應該是庫沒有引入進來致使的,想include rcc庫,結果在項目中找不到rcc庫,因而又是一番查閱。
筆者這個時候就在想,我用的hal庫,會不會rcc也是相似hal的庫呢,果真不是!hal中也有rcc的部分實現,因此只是用hal庫應該沒什麼問題。
而後就擱置了一段時間!

採坑#6 調試

我想一想看,能不能用調試功能,由於st-link仿真器是有調試功能,因而又開始搗騰!
奈何怎麼調試沒用,GDB調試器始終沒法鏈接st-link:Error: init mode failed (unable to connect to the target)。可是在HAL_Init()上的斷點就能斷到,每次都是HAL_Init()過不去,而後一步一步跟蹤進去調試,發如今__HAL_AFIO_REMAP_SWJ_NOJTAG這個方法過不去了,再升入就不行了,因而按照__HAL_AFIO_REMAP_SWJ_NOJTAG關鍵詞閱資料發現,stm的調試是須要在STM32CubeMX中配置的,配置點在:SYS>Debug中

默認是No Debug,選擇Serial Wire後generate code一次再編譯就能開啓調試了!簡直完美!

採坑#7 引腳配置

可是調試發現,代碼很完美啊(其實內心也沒有底,仍是查了其餘文檔,懷疑板載的藍色LED並非PB12)。
偶然間想起來,在STM32CubeMX中配置調試的時候,好像在右側的芯片引腳圖看到了PB這個口子,果真,在芯片引腳圖上找到了PB12,甚是歡喜啊!

而後把PB12的引腳設置成GPIO_OUTPUT,而後generate code,再運行,終於,藍燈開始閃爍啦,舒服!
仔細查閱main.c,會發現,其實在配置引腳後,生成的代碼的MX_GPIO_Init中多了一些代碼,這些代碼就是配置引腳用的!

完結

至此,板載藍色LED終於閃爍了,達成了目標!
其實,在整個填坑過程當中,不止上述的那些步驟,還有其餘不少坑,好比:

  • stlink命令行工具怎麼都打印不出stm板子的信息,甚至把stlink的源碼clone下來,調試看了log,果真不是stlink的問題!最後在其issue中找到了答案,原來經過swd鏈接st-link的時候,須要將boot0置1,就是要把boot0的跳線帽鏈接右側,boot1隨意

    包括燒錄程序,首次鏈接都須要上圖的鏈接,不然會報初始化失敗的錯誤!
  • clion沒法調試c的項目,查找後原來是筆者升級了macOS catalina 10.15版本,致使GDB調試器出錯沒法調試,升級到最新版本便可!
  • 爲何要把#reset_config srst_only這行註釋掉呢,由於對於STM32f103這樣的的low-level的板子,並不支持reset,因此怎麼都不能重置板子,在燒錄成功,st-link會自動重置板子,因此依舊能達到重置板子的效果!
  • ……想不起來了

心得

寫博怎麼不寫心得呢!
世上原本並無坑,只是完成教程太少,便有了坑!
其實在整個填坑過程當中,最多的是查閱資料和嘗試,身邊沒有朋友學過或正在從事相關的工做。

  • 查閱資料就是baidu+google,雙劍合璧,baidu查中文,google查英文,幾乎都能找到!
  • STM32f103c8t6這塊板子的flash聽說有10w次的擦寫壽命,因此幾乎徹底用不完,多嘗試,多失敗,才能達到最終的成功!

以上

相關文章
相關標籤/搜索