轉載請註明: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
筆者做爲arm初學者,不能上來就搞大貨(好比xx開發套件,xx集成開發板),一是貴,二是不必。再三某寶後,最終選定了stm32最便宜的板子STM32f103c8t6,是國產的板子,應該是st受權過的板子,而後各類仿製。
筆者入的是塊黑色板子,以下圖:
這塊板子對於初學者來講太實惠了,RMB11,65536b(64kb)的flash和20480b(20kb)的sram,徹底夠用了,還有一個microUSB口,舒服!
固然,某寶上還有其餘各類顏色的板子,電路排布略有不一樣,但功能都不盡相同。架構
興致勃勃地拿了快遞,興致勃勃地拆了快遞,興致勃勃地拿USB線鏈接到了電腦,尷尬的是毫無反應,USB信息裏也沒有任何st字樣的項,因而開始查閱各類資料才發現,stm32f103x的microUSB口是用做電源和DFU燒錄用的,因而又查了DFU的資料,發現stm32f103x並無燒錄dfu的支持固件,因此不能用DFU燒錄,因此仍是要其餘燒錄方式!編輯器
在採坑#1後,我查到了stm32的另外兩種燒錄方式:JTag和st-link,JTag在某寶上的價格要幾十塊,而st-link則是10塊上下,可是JTag比st-link要好用,因而果斷選了st-link,便宜和愛折騰纔是王道(一位圖拉丁人說)。
因而在某寶上又入了一個st-link v2,RMB10.5。工具
拿到st-link後,才意識到stm板子上的引腳沒有焊接,因而就把swd引腳和跳線引腳給焊接上了。
而後照着板子上的swd的引腳說明,鏈接到st-link對應的引腳!
完美,一插上,板子上的貼片藍色LED就開始閃爍起來了(聽說藍燈閃爍是出場時候燒錄的測試程序,說明板子是正常工做的)。測試
在查閱資料的時候,發現大大多數開發者用的操做系統要麼是Windows要麼就是Linux的,而筆者用的macOS,又一個大坑漸漸浮現,我直接填一下吧。
須要材料:ui
而後就能夠愉快地玩耍了!
打開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
再運行,嘿,藍燈竟然不閃了,估計是燒錄成功了,由於紅色文子裏沒有什麼錯誤信息了。
而後開始看項目結構,根據筆者的經驗,用戶邏輯的入口確定是相似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呢?
STM32f103c8t6板載的藍色LED確定是能修改的,或者是有其餘用途的。經仔細查閱某寶的那個詳情後,找到了它的電路圖
在圖中,找到了兩個LED燈,一個是紅色LED,是接地的,常亮狀態,指示通電狀態。藍色LED則是接入到了PB12,意思就是能夠經過PB12的口來控制這個藍燈,因而,推斷一下就是GPIOB和GPIO_PIN_12這兩個參數了(實際上是經過屢次敲代碼,在只能提示候選列表中找到的)。
HAL_Delay天然就是延時等待多少毫秒的做用了!
代碼修改好了,再運行,吧唧,沒反應,藍燈沒有閃也沒有亮,咋回事?預期應該是狂閃的呀!
爲何操做GPIO沒有反應呢?依舊是查閱資料,網上說須要配置GPIO,否則用不了,而後給出了不少代碼,粘貼進來後,都是語法錯誤,什麼RCC沒有找到之類的錯誤,應該是庫沒有引入進來致使的,想include rcc庫,結果在項目中找不到rcc庫,因而又是一番查閱。
筆者這個時候就在想,我用的hal庫,會不會rcc也是相似hal的庫呢,果真不是!hal中也有rcc的部分實現,因此只是用hal庫應該沒什麼問題。
而後就擱置了一段時間!
我想一想看,能不能用調試功能,由於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一次再編譯就能開啓調試了!簡直完美!
可是調試發現,代碼很完美啊(其實內心也沒有底,仍是查了其餘文檔,懷疑板載的藍色LED並非PB12)。
偶然間想起來,在STM32CubeMX中配置調試的時候,好像在右側的芯片引腳圖看到了PB這個口子,果真,在芯片引腳圖上找到了PB12,甚是歡喜啊!
而後把PB12的引腳設置成GPIO_OUTPUT,而後generate code,再運行,終於,藍燈開始閃爍啦,舒服!
仔細查閱main.c,會發現,其實在配置引腳後,生成的代碼的MX_GPIO_Init中多了一些代碼,這些代碼就是配置引腳用的!
至此,板載藍色LED終於閃爍了,達成了目標!
其實,在整個填坑過程當中,不止上述的那些步驟,還有其餘不少坑,好比:
寫博怎麼不寫心得呢!
世上原本並無坑,只是完成教程太少,便有了坑!
其實在整個填坑過程當中,最多的是查閱資料和嘗試,身邊沒有朋友學過或正在從事相關的工做。