從原理圖PCB到移植RTOS【細說STM32】【一】
【前言】
iBox相關教材推出以來,不少朋友還希望針對軟體開發進行細緻講解。
為此,我們將陸續針對iBox的STM32的物聯網開發的一些細節,進行分享。
今天是第一章節,我們介紹一下如何移植標準的官網程式碼(裸機,無OS)到iBox開發板上,控制LED閃爍。如此簡單的試驗,還是希望給你不一樣的體驗。
【一、安裝編譯工具Keil】
1、為什麼選擇keil
在這個操作之前,原本應該解釋為什麼選擇“Cortex-M”,為什麼選擇“M3”、為什麼選擇“ST”。這樣容易扯遠了。所以簡單說下,原因無非以下幾個維度:
1、成本
2、功耗
3、開發工作量
4、生態
5、易學性、普及度
至於為什麼選擇Keil 沒選擇 IAR、GCC,是因為配置簡單。從支援的晶片的豐富度來說,IAR是不錯的選擇。對於熟練工來說,工具的差異不大;如同硬體熟練工一樣,繪圖工具差異不大。
KEIL 和 IAR Systems都是嵌入式領域系統開發工具和服務商(IDE)的供應商,前者成立於-1986年,總部在德國(如今已被大名鼎鼎的英國ARM公司收購);後者於成立1983年,公司總部位於北歐的瑞典。
二者的最著名的產品分別是 KEIL uVision IDE 和 IAR Embeded Workbench。
估計大部分的開發人員都用過。因為他們都可以很好的支援各種不同版本的MCU。對於不同的開發環境,用久了,便會日久生情。用得順不順手,快不快樂,或喜歡,或討厭等等,都因人而異的。然而我們不能不考慮這個問題:能選擇到最適合自己,更有效率的工具,才是最好的。
KEIL的IDE介面比較通俗易懂,屬於平易近人的那種。
IAR呢,介面簡潔明瞭,整體感覺——專業。入門不易,一旦入門還是盡在掌握的感覺。
我們選擇的KEIL版本是
2、下載安裝包
連結:https://pan.baidu.com/s/1u955P7trvFYMOAghlj0Y2w 密碼:y4gy
百度網盤自從“360網盤”停用,就開始限速。
所以我們可以使用其他不限速的下載工具進行下載。
將上面的內容存到自己的網盤,然後用下面這個工具進行下載。
pandownload 工具下載地址:
3、安裝
下載的壓縮包分成三個part,全部下載完成之後解壓縮,資料夾中有五個檔案。
先安裝MDK523這個737MB的安裝包,然後安裝MDKCM523的安裝包。
安裝過程沒有注意點,一路NEXT。
安裝完成之後,點選選單Project之Manage,選擇Pack Install
Pack Installer視窗開啟之後,選擇File選單之 Import,然後選擇匯入剛剛下載的三個PACK字尾名的檔案。
4、破解
安裝完成後,只剩下破解了。
破解工具只用於學習交流,不用於商業用途。
http://www.hw100k.com/forum.php?mod=viewthread&tid=3506&extra=
破解統共分7步
1、點選選單Flie ->License management 獲取CID
2、CID複製到破解工具中。
3、選擇Target 為ARM
4、點選Generate按鈕生成序列號
5、複製序列號
6、貼上到LIC空格中
7點選ADD LIC
完成破解。
重要,破解時,執行keil,需要用管理員身份執行。
如果你沒有破解,就急急忙忙執行工程,試圖編譯,則給你一個error,提示如下:
Check that your license details are correct in the License Management dialog of MDK. Additional information is available at:
http://www.keil.com/support/man/docs/license/license_management.htm
至此,安裝破解完成。
安裝好之後,我們就可以拿出我們的開發板硬體iBox了。
【二、下載和使用ST官方原始碼】
我們學習的過程,最好要學習使用官方的原始碼。其他開發板的程式碼,建議都只作為參考。因為每個人有每個人的編碼習慣,可能一些差異。
不同公司對程式碼規範、程式碼結構的要求會有不同。
所以,我們從官方程式碼作為開始。按照自己公司的要求,和自己能夠理解的習慣進行編碼,在實踐中提升。
總之,對程式碼還是要盡在掌握,熟練駕馭、不能囫圇吞棗。
1、MCU
簡單介紹一下我們的 iBox物聯網開發板的硬體系統:
核心晶片是STM32F103ZET6
原理圖pdf下載地址:
http://www.hw100k.com/forum.php?mod=viewthread&tid=3501&extra=page%3D1
2、使用 ST 官網
如果你很熟悉,可以跳過這個章節。但是根據本人觀察,很多長期使用STM32的工程師其實沒有仔細看過官網。
https://www.st.com 進入之後,我們進入Tool&Software去下載STM32標準庫
進入嵌入式軟體頁面之後,可以看到左下角 For STM32 MCUs
提醒:如果你沒有註冊、可以註冊賬號後登陸。下載程式碼,需要登陸之後才可以下載。
進入之後,在頁面最下面,有個“Download”。點選之後,可以下載。
點選“Download”之後,下載一個壓縮包。
檔名為:en.stsw-stm32054.zip
解壓縮之後,資料夾名稱:STM32F10x_StdPeriph_Lib_V3.5.0
你也可以用下面連結貼上到瀏覽器,直接下載:
選擇你對應的MCU類別,比如我們iBox選擇F1
現在我們就已經下載下來一個完整的STM32的官方標準外設庫檔案包。
我們現在直接進入MDK-ARM資料夾,開啟Keil的工程。
檔案目錄如下:
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\MDK-ARM
雙擊開啟。
我們可以嘗試一下編譯(Build)和下載程式(Download)
當我們電機 Download那個圖示時,我們發現下載不了,找不到你的下載工具。
3、使用Jlink進行程式碼燒寫
那麼,我們需要做幾個準備工作,才可以進行程式碼燒寫:
1、把Jlink連上
2、安裝Jlink
3、配置晶片等燒寫環境
1、看圖
2、首先我們安裝Jlink
下載安裝包,下載地址如下:
http://www.hw100k.com/forum.php?mod=viewthread&tid=3507&extra=
安裝注意事項:無;一路 next
測試一下,我們的工具是否可以連線上我們的MCU
點選開始選單:SEGGER- Jlink-FLASH
開啟JLINK軟體,它可能會提示建了工程,隨便建立一個就行
開啟配置頁面,點選Options->Project settings,會進入到配置頁面
配置頁面如下圖所示,下面進行選擇微控制器
點選CPU,選擇STM32微控制器
點選Target Connect 將JLINK和目標板進行連線。
如果連線成功,說明微控制器和Jlink燒寫器都是好的,驅動也安裝成功啦。
然後我們可以嘗試用Keil5裡面的Download試下,應該可以少寫了。
(至於用J-Flash如何燒寫,按下不表)
3、先別急,我們需要配置晶片,讓編譯工具和電腦知道我們電路板上面晶片的型號。
選擇Flash裡面的Configure Flash Tools
我們需要在Device裡面選擇我們的晶片型號,如下:
選擇Debug 選擇Jlink
選擇Utilities,選擇Jlink
點選Debug裡面的 右邊的Settings
選擇Debug裡面的Port 修改JTAG為 SW
現在,我們就可以下載啦。
4、修改原始碼,實現閃燈
4.1刪除不需要的功能
至此,我們並沒有關心官方的原始碼到底寫了什麼內容。
那麼我們看下main函式
這個工程是基於STM32 官方的EVM板,這套程式碼為了支援4套開發板,所以做了4組巨集定義,選擇。我們在此暫時忽略。
我們將UART、LCD等於我們實驗目的無關的程式碼刪除,則,只保留兩段程式碼,如下,一段是LEDInit、一段是LEDOn
我們根據函式的定義,可以顧名思議:LEDInit是LED初始化,LEDOn是LED點亮。
4.2 研究 一下LED相關的函式和變數
我們研究一下這STM_EVAL_LEDInit() LED初始化函式
滑鼠放在這個函式上面,右鍵選擇 跳轉到 “STM_EVAL_LEDInit”
跳轉過去之後,我們可以看到這個就是一個標準的GPIO初始化的函式。
我們去檢視一下這幾個陣列,是如何定義的。
由此,我們可以看到,在原始程式碼裡面定義了四個LED的控制GPIO,分別是:
F6、F7、F8、F9
我們檢視一下原理圖,看看iBox上面的控制LED的GPIO分別是哪幾個。
iBox上面一共有四個LED,紅色LED是電源指示燈,不能用GPIO控制。
我們可以看下原理圖:
紅色LED的正極接3V3,負極通過一個電阻接GND。
另外三個顏色的燈分別接到GPIO進行控制。
通過查閱MCU的管腳連線,我們可以看到
PE9控制綠燈
PE10控制黃燈
PE12控制白燈
我們可以修改程式碼裡面LED1、LED2、LED3的管腳號,對我們電路板上的LED控制GPIO進行控制。
將上面的LED1的幾個值修改為:
GPIOE
GPIO_Pin_9
RCC_APB2Periph_GPIOE
同樣方法,我們修改LED2、LED3
修改完成之後,我們的初始、以及對LED進行控制的程式碼,就是我們iBox電路板上面的幾個LED對應的管腳了。
研究完初始化程式碼之後,我們研究一下
STM_EVAL_LEDOn函式,我們用右鍵跳轉的方式,檢視函式定義。
STM32的每個GPIO埠都有兩個特別的暫存器,GPIOx_BSRR和GPIOx_BRR暫存器,通過這兩個暫存器可以直接對對應的GPIOx埠置’1’或置’0’。
GPIOx_BSRR的高16位中每一位對應埠x的每個位,對高16位中的某位置’1’則埠x的對應位被清’0’;暫存器中的位置’0’,則對它對應的位不起作用。
GPIOx_BSRR的低16位中每一位也對應埠x的每個位,對低16位中的某位置’1’則它對應的埠位被置’1’;暫存器中的位置’0’,則對它對應的埠不起作用。
此處,我們先簡單理解:
比如希望快速地對GPIOE的位7進行翻轉,則可以:
GPIOE->BSRR = 0x80; // 置’1’
GPIOE->BRR = 0x80; // 置’0’
庫檔案裡面已經對各個管腳進行了二進位制的對應位進行了定義。
所以,我們想讓GPIO為低,則執行
GPIO_PORT[Led]->BRR = GPIO_PIN[Led];
如果我們想讓GPIO為高,則執行
GPIO_PORT[Led]->BSRR = GPIO_PIN[Led];
按照我們的原理圖,我的GPIO為低時,LED亮、GPIO為高時,LED滅。
所以我們需要修改函式,如下:
編譯,燒錄。我們就可以看到,咱麼iBox上的LED按照我們的預期點亮。
至此,咱們的第一個實驗完成。
後一集,我們要用Keil建立一個全新的工程,然後利用官方庫檔案,裁剪掉不需要的內容,做一個屬於自己的第一個工程。
欲知後事如何,且聽下回分解。