[HowTo] STM32新手上路 使用Keil和JLink 教學

805427

大家好 今天我要跟各位初步介紹如何使用Keil來開發ST的STM32 ARM微處理器 那麼我們就廢話不多說 直接進入話題吧!

還是說一下廢話好了 ㄏㄏ STM32總共分有F0, F1, F2, F3, F4五個系列 每個系列的用途不同 所以功能也不同 我想各位應該也猜到越後面的能力就越強吧 至於選擇F1系列的原因是因為他的功能已經非常強了 舉個例,Sony的PlayStation Move裡面就使用了STM32F103VB這顆晶片 由此可知他的應用

當然很多控制的應用也可以取代8051 但這恐怕就有點殺雞焉用牛刀的感覺了 總之要看應用就是了 順道一提 用8051不如用AVR 封裝大小從PDIP8到PDIP28都有 我也還沒開始學 先玩STM32一陣子吧

首先呢 各位需要安裝Keil-MDK 這將會是我們的IDE(integrated development environment) 這套軟體把文字編輯器、編譯器、下載燒錄、及除錯全部包裝在一起 非常好用也省事

安裝的部分沒有什麼好解釋的 請各位自行先裝好 也請裝好JLink的驅動 如果有任何問題就留言發問吧

現在我們有了一切需要的工具 當然也少不了硬體啦 我用的是很簡易的開發板 對岸稱為最小系統板 這裡有個重要的事情要注意 就是你的STM32是哪個系列的哪個型號 例如我的是STM32F103RB 意味著他是F1係列的03RB 其功能我想各位自己讀讀datasheet就可以瞭解 我這就不多說了 唯一要注意的就是你的晶片是HD還是MD 這是什麼勒?就是裡面的flash記憶體大小 這個大小就是我們程式最大的容量 關於怎麼樣才是HD怎麼樣才是MD這個分別我有點點忘了 總之根記憶體大小有關就是了

對一位新手(我也是) 要學習STM32依據本人的經驗 他的學習曲線非常的陡 為什麼呢?因為相關的教學資料少之又少 書也沒幾本 我一開始學的時候停頓了超久才開竅 因為其實 他根本不用書就可以學了!一切的資料都在datasheet和reference manual(RM0008)內 只要能掌握這兩本(還有std_peripheral使用說明,但我不常用)就可以輕輕鬆鬆學會了STM32!

好啦~講了那麼多廢話…我們開始吧!首先我們需要建構好Keil的環境 各位可以來下載我事先做好的空白範本 因為其實ST也是希望大家這樣開發 不然每次都要重新設定路徑有的沒的 不省事

各位應該已經確認自己的晶片是HD還是MD 我的是MD 所以就複製一個範本 然後命個名好了之後就請開啓Project.uvproj吧 應該會長這樣

圖一

之後請按兩下開啟main.c

圖二

在main函數裡面就是我們寫主程式的地方 這和其他晶片是沒有兩樣的 現在裡面只有一個while的dummy回圈 沒啥用 等等我會講解STM32程式的開發的流程 因為這會和ARM的架構有點關係 所以我先稍稍講一下他的架構(這個時候你應該有RM0008和晶片的datasheet都打開 隨時都可以參考 這很重要) 我們來看看datasheet(以我的為例 也就是ST的CD00161566)的第11頁的block diagram 這大約就是我這顆晶片的運作方塊圖 看到下半邊 有一堆功能 ADC, GPIO, TIM, USART…etc. 等 這些都是我這顆晶片所擁有的功能 我們要啓用它 來使用他們,給他們clock 就可以使用了 當然我們還要進一步的填入這個功能的初始參數 例如你要啓用GPIOA 而裡面的參數有mode, pin,和speed 這些參數就和8051一樣 都有對應的register來作設定 STM32功能強大的地方來了 因為ARM的結構非常的複雜 所以ST已經寫好了一整套的Library 把所有低階的程式都抽象化掉了 這個Libray稱為Standart Peripheral Libray或Firmware Library中文我們就叫做硬體庫吧(因為我也不知道怎麼翻) 而這個library又建構於ARM公司所發行的CMSIS這個library 在這我只是簡介一番 因為實際我們在開發的時候 根本不用理會 只要知道怎麼寫C還有使用硬體庫就好了

整合一下剛剛所說的,如果我今天想要用GPIOA (General Purpose Input/Output,通用輸入/輸出 A的意思是A區塊 有A就有B 有B就有C 以此類推 已GPIO來講 一個區塊有16個輸入輸出單位) 我可以用下列的函數來進行設定

GPIO_InitTypeDef GPIO_InitStructure; //定義資料形態
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //啟用APB2 Peripheral的clock(這個是翻成”外設”?)

/*以下為GPIO參數設定*/
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0; //設定Pin_0也就是GPIOA的P0
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_out_PP; //設定為輸出push-pull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始

由上可知,這個硬體庫都是使用自己的資料形態 然後使用者在來定義內部的欄位 就可以進行register的設定 簡單吧!現在GPIOA已經設定完了 我們現在要怎麼使用他勒?讓我們看下去

如果想要Set某支腳我們只要呼叫這個函數

GPIO_SetBits(GPIOA , GPIO_Pin_0);

如果想要Reset某支腳

GPIO_ResetBits(GPIOA , GPIO_Pin_0);

當然要注意電路的設計 是sink還是source

所謂sink 就是電流是由外部“流入”晶片 反之,source就是晶片“提供”電流給外部 這有什麼差勒?差可大囉!

如果我電路想接一顆LED 我可以把LED的正極直接接到晶片的輸出腳(當然要限流電阻) 然後晶片只要給high的訊號(3.3v or 3v3)LED就會亮了 對吧?但想想喔 如果他要提供電流 這隻腳 晶片就會有負載 有了負載溫度就高 若電流更大 就推不動了

但如果我們用sink,我們將腳設low (0v, GND)電流是從外部流入晶片到地 所以晶片沒有消耗到功率 大部份的驅動 都是採sink的方式 但如果一定要由晶片提供high訊號(七段顯示器掃描,LED陣列掃描) 我們會使用電子開關 例如在飽和區的BJT

剛剛介紹完怎麼啟用某個功能 我們現在就來看看怎麼作出一個LED流水燈吧!流水燈聽起來有點拔辣 這也是對岸的講法 其實就是某幾顆LED互相交替點亮熄滅 等同於控制晶片的Hello World

延續剛剛的main函數內 我們先創一個叫做GPIOA_Init(void)的函數吧 裡面我們會初始化GPIO這個功能

然後在main裡呼叫他 進行初始化 然後依序點亮和熄滅

圖三

我的板子LED剛好在PB0上 而且使用了source 所以我這樣寫

之後就按下”Build”來編譯 沒有問題後”Downoad”來下載到晶片內 因為我設定下載後自動reset所以功能在下載完成後馬上就可以動作了!這個功能 看每個人喜好 在一些比較複雜的應用我會想要自己按板子上的Reset扭來重設 這個設定可以在”Target Options”(有一個魔術棒的圖樣) 裡面的”Utilities”內的”Settings”內的”Download Options”找到 “Reset and Run”

圖四

我想初步介紹STM32及開發的方法到這邊就告一段落了 相信各位都覺得不難 因為真的不難!我自己卡關大部份都是在程式的流程設計還有資料的處理這方面卡關 但這些問題都是因為寫的程式不多所造成的 無聊的時候就想個功能 挑戰挑戰自己 經驗日積月累 就可以越來越厲害了!希望各位有學到東西 或者如果我有哪裡和你的認知不同請都提出來讓我們一起解決 畢竟我也是新手 只是比你們早玩罷了 請多指教囉~謝謝!

檔案:

Keil Project Templates

LED Demo Project

12 thoughts on “[HowTo] STM32新手上路 使用Keil和JLink 教學

  1. Kotomine

    謝謝 寫的蠻清楚易懂的 我也是個初心者
    大大還有再繼續研究這塊晶片嗎?

    Reply
    1. applefreak111 Post author

      謝謝,能幫助到你是我的榮幸。
      我目前比較頃向網路服務開發,STM32其實也就只是這樣而已,idea比較重要我覺得。最近物聯網興起,要懂網路還有嵌入式Linux才能掌握全局啊。網誌內有關於OpenWRT的文章,也推薦閱讀。雖然這些都是我很久以前寫的,但應該都還算OK。最近玩Arch Linux比較多,若是有興趣我可以考慮寫關於他的東西。謝謝!

      Reply
  2. spot

    你好,我也正在學習stm32的開發
    想請問一下要如何建構Keil的開發環境呢
    雖然板主題供的模板很方便,但我想更深入的了解一下,謝謝

    Reply
    1. applefreak111 Post author

      其實我也是參考對岸資料得到這個結論的。這裏有四本秘笈,雖然裡面有些程式不太對(例如nRF24L01的那篇),但參考價值還是頗高。希望這對你有幫助。
      關於建置環境的資料在初級篇裡面。

      Reply
  3. Kimlee

    剛接觸STM32, 請問是否只要有KELI和USB CABLE就可以將代碼刷入STM32嗎? 還是要像以的8051系列那樣用專用的燒錄機進行刷寫? 謝謝

    Reply
  4. Kimlee

    寫得很好. 請問想要向STM32 寫入或讀出BIN 或HEX程序, 是不是一定要用JLINK設備? 如果STM32已連好USB, 可不可以直接刷寫?

    Reply
    1. applefreak111 Post author

      如果你是買ST原廠的Discovery Board系列,他有內建ST-Link可以直燒入。但如果你都沒有任何下載器,你可以去找一個東西,我沒有試過,但我知道有。就是ST的DFUSE,好像是可以直接用UART燒入,上網找找吧!

      Reply

Leave a reply to Kimlee Cancel reply