Fig 1. stm32f4discovery |
the 1st edition: 20130405 the 2nd edition: 20150119 the 3rd edition: 20160913 the 4th edition: 20161221
簡體中文網站:
stm8, stm32 社區
這個系列累積了不少篇幅, 以下是所有系列的文章目錄:
bare-metal for stm32f4 discovery board content
在《作業系統之前的程式》這又稱為 bare-metal 程式, 該系列紀錄 x86 os kernel 開發的學習經驗, 我想依樣畫葫蘆拿到 arm 的學習上, 重新學習一個完全不一樣的平台。
這是一個辛苦的開始, 縱使有了 x86 的學習經驗, 也無法帶來太多的助益, 仍然需要閱讀大量的資料, 甚至去找到相關資料也是個難題, 而程式的撰寫也只是最基本的練習。
你看我從 20130405 撰寫這篇文章開始到現在, 還沒開發出這平台的 os kernel 就知道
但在開始第一個作業系統之前的程式 for stm32f4discovery 之前, 得先來打造開發環境, 這是與 x86 native toolchain 不同的地方, 別小看這部份, 這可不是一件容易的事, 最主要的部份就是 arm toolchain (cross compiler) 和燒錄程式碼到 stm32f4discovery flash 的工具。
目前市面上琳琅滿目的開發板, 要從中挑選實在不容易。Fig 1 是 stm32f4discovery, jserv 的《進階嵌入式系統開發與實作》課程 (201209~201301) 就是使用這塊開發板, 以 700 NT 購得。因為參加了這個課程, 所以才選定這塊開發板, 照著課程的資源來學習, 最是省事。
後來 stm32 出了不少系列有 stm32f429, stm32f7 ...
提供了 non-mmu linux 的支援
選擇板子時會有一個問題, 怎麼把程式碼燒錄到那塊板子上呢? 這是個大問題。而這塊開發板珍貴的地方就是內建 ST-LINK/V2, 可以將程式碼燒錄到 flash, 再也不怕燒爛 flash; 更珍貴的地方是: 還可以使用類似 jtag 的方式 debug, 不用另外買個 jtag, 當然這些都需要搭配的軟體才能運作, openocd 或是 st-util 都可以做到, 這是開發 os 等級程式碼的利器。我知道還有一塊版子也有類似的功能, freescale m0+ 系列, 使用的是 opensda, 不過我不確定 openocd 是不是可以支援 opensda。
而我後來開發了 sd card boot, 可以方便撰寫測試程式, 不一定要寫到 flash, 紀錄在《作業系統之前的程式 for stm32f4discovery (18.3) - 載入並執行 sd card 上的 elf》
而 stm32 提供了 bootloader 的方式, 就算沒有 st-link 也可以燒錄程式, 但還要調整 jmp, 不是很方便。有興趣可參考: stm32f4discovery system memory - boot loader
Arduino 或是 Intel Galileo 這種開發版主打快速、簡單、好開發。看看這些書名就可窺探一二:
這些書籍都會有一些很有趣的實作專題, 例如驅動馬達、機器人互動裝置等等 ... 這些很有趣, 能做出來會有一定的成就感。不過我志不在此, 我想研究最底層的秘密, 而不是作組合積木的事情, 例如上電之後怎麼執行第一支程式, 某個 gpio 該怎麼使用? 那個按鈕要能發揮作用需要做什麼事情 ... 所以我會需要有類似 jtag 功能的版子, 這種等級的除錯很難避免, 也很難靠 printf 來除錯, 甚至要自己寫 printf。
不過偶爾看到別人用這些東西做出很好玩的東西, 例如機器手臂、機器人, 自己卻和 datasheet, c/asm code, debugger 打交道, single step 錯誤的程式碼, 而終端機畫面只有一些簡易的文字訊息, 還真是有些落漠之感, 我也想做出一些有趣的裝置。
《maker 雜誌中文版》有更多類似這樣的作品, 每一件都很能吸引人。
回到 stm32, stm32f4 mcu 全系列可參考這裡。
這是以 ARM Cortex-M4 為核心的開發版。沒有 mmu, 所以不能練習 page mapping, 這是我覺得比較可惜的部份; 但有個記憶體保護單元 (MPU), 可以保護某個記憶體區塊。這塊板子用的是 stm32 的 STM32F407VG, 其基本規格:
時脈: 168 MHz
flash & ram size:
STM32F407VGT6 microcontroller featuring 1 MB of Flash memory, 192 KB of RAM in an LQFP100 package.
以下的連結可以下載 firmware, 方便寫程式, 不用辛苦的對付暫存器。
Part Number | Description |
---|---|
STM-STUDIO | STM Studio run-time variables monitoring and visualization tool for STM8 and STM32 microcontrollers |
STM32CubeF4 | Embedded software for STM32 F4 series (HAL low level drivers, USB, TCP/IP, File system, RTOS, Graphic - coming with examples running on ST boards) |
STSW-STM32068 | STM32F4DISCOVERY board firmware package, including 22 examples (covering USB Host, audio, MEMS accelerometer and microphone) (AN3983) |
STSW-STM32142 | Using STM32F4 MCU power modes with best dynamic efficiency (AN4365) |
我還真不習慣只有 192KB 的記憶體。
usb 有兩邊, 插上 CN1 (如 Fig 1 白色 usb 線) 接到 pc 後, 就可看到 led 燈的閃爍效果 (如 Fig 1), 代表這是一塊正常的板子。開發程式, 燒錄程式也都是接在 CN1 上, 這是 ST-LINK/V2 chip 提供的功能。
這塊板子相關的 datasheet 和 sample code: datasheet for stm32f4 discovery
這 3 本的厚度不輸給 intel 那 3 本, 真的很厚, 有得看了。
stm32f4 - discovery 用的是 STM32F407VGT6, 詳細的 mcu 資訊要找這顆的 datasheet。
stm32f407 datasheet: http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/DM00031020.pdf
以下連結已經失效:
datasheet 竟然有中文版本, 我嚇傻了!!
http://www.stmcu.org/document/detail/index/id-200614
中文官網:
http://www.stmcu.org/
除了開發環境之外, 文件的閱讀/尋找也是一個難題, 並不是只讀 stm32f407 datasheet 這份就足夠。
AN2606 Application note 提到 system memory 的 bootloader。
UM0462 在介紹 flash loader demonstrator 的用法。
AN3155 Application note 介紹 USART protocol used in the STM32 bootloader。
除了 stm32 提供的文件, arm 原廠的文件要讀嗎? 這份 ARM®v7-M Architecture Reference Manual 要讀嗎? 你可以只看官方的 datasheet 就能開發程式了嗎? 也許你可以, 但是我不行, 所以我還買了這些書籍。
在 linux 上的開發方式:
toolchain & qemu stm32 模擬器: http://wiki.csie.ncku.edu.tw/embedded/Lab1
如果你喜歡從原始碼建立編譯器工具組的話可以參考以下連結, toolchain build from source:
- https://github.com/jsnyder/arm-eabi-toolchain (fb 顏 sir 提供)
- http://cu.rious.org/make/compiling-the-arm-cortex-m4-toolchain-yourself/
- https://github.com/cccc/STM32-Toolchain (gcc-4.8.0)
- STM32F4 – Build Your Own GNU ARM Cross-Toolchain From Scratch (cross compiler gcc 4.9 我使用 gcc 4.7 的版本才建構的出來)
(cross compiler gcc 5.1 我使用 gcc 4.9/5.2 的版本才建構的出來)
我自己準備了 4.7, 4.8, 4.9.2 (從上述第四個修改而來) 三個版本。
arm-2013.05-23-arm-none-eabi.src.tar.bz2 (上述第一個 url) 這個版本, 需要使用 makeinfo 4.13 (texinfo-4.13.tar.gz) 才可以正確編譯 binutils doc 目錄, 在我的 debian makeinfo 是 5.2 會在編譯 binutils 出問題。目前的版本已經修正這問題。
我會準備一個 script 用來載入 toolchain PATH 環境變數:
用 . 來載入它
$ . env_stm32_gcc-51.softfp
PS1 的改變會帶來很明顯的提示符號, 知道自己目前是在 cortex m3 的開發環境。
使用 openocd/stlink 來將程式寫到 stm32f4discovery flash (openocd/stlink/serialusb) :
http://wiki.csie.ncku.edu.tw/embedded/Lab6
Bus 002 Device 003: ID 0483:3748 SGS Thomson Microelectronics ST-LINK/V2
若不需要 gui 的版本, 不用加入 --with-gtk option, 也不需要安裝 libgtk-3-dev, 就不會編譯 stlink-gui。
20160913 補充:
stlink 好像改成 cmake 了,
cmake . make即可。
new git url: git://git.code.sf.net/p/openocd/code
openocd 不是很好上手的工具, 設定也不容易。
openocd 需要設定檔, 長這樣:
這是給 STM32F4Discovery 用的, 若是使用其他 jtag 設備或是其他開發版, 設定會不同, 這個不好設定, 需要 jtag 相關知識。
openocd/share/openocd/scripts/* 有很多類似的設定檔。
執行 openocd:
openocd -f openocd2.cfg
若你也把 Programming STM32 F2, F4 ARMs under Linux: A Tutorial from Scratch 裡頭的程式跑過一次, 就可體會整個開發流程了。上表就是這連結的內容。
這個 gdb script 可以減輕打字份量。
arm-none-eabi-gdb -x g1.sh
https://github.com/texane/stlink 的 readme 有些有用的資訊, 可瀏覽一下。
有個 free ide 可以參考:
http://www.coocox.org/index.html
原來 arm 除了 armcc 還有 arm gcc。
ref: https://launchpad.net/gcc-arm-embedded/+download
function reference:
STM32F10x Standard Peripherals Library
有了模擬器就不一定要把程式寫到版子上的 flash, flash 壽命有限, 減少讀寫次數不是壞主意。不過模擬器模擬的是 stm32-p103, 我使用的是 stm32f4 discovery, IO 部份可能有些不同, 僅能用來練習 arm coretex m 系列不含 IO 的程式, 而 qemu 似乎沒有模擬 svc, 我在測試有關 svc 的部份時, 都是使用真實開發板。若真要寫 stm32f4 開發版的程式, 最後還是得寫入 flash/ram 來測試, 只能在模擬器執行的程式, 那有什麼意思呢!
中文教學文件: http://wiki.csie.ncku.edu.tw/embedded/2012w7
恭喜! 看完這些文件和打造工作環境就去了半條命了吧!在 linux 下打造這些環境就要花上不少時間。如果你用 MDK5 就不用管這些事情, install MDK5 就可以了。
而真正的困難現在才剛開始, 先來練習模擬器上的程式, 不需要 st-link, openocd。
簡單的版本很簡單, 難的版本很難, 跟著 http://wiki.csie.ncku.edu.tw/embedded/Lab1 把 main.c compile 起來吧!
文件中的模擬器在這裡 https://github.com/beckus/qemu_stm32, 可自行更新。
這個簡單的程式隱藏了很多很多的細節, 會讓我們誤以為寫個 mcu 程式很簡單, 塞個 main 在裡頭就可以了。使用廠商給的 library 來開發有點像在 os 下寫應用程式, 也不是壞事, 只不過這標題是作業系統之前的程式, 自然不用這樣的開發方式, 得把隱藏在 library 下的秘密挖出來, 不過光是打造開發環境就很辛苦了, 先讓自己輕鬆一下。
這支程式不能在 stm32f4 - discovery 正確執行, 別浪費時間寫到 flash 中, 在模擬器練習即可, 這是暖身用的。
用這樣的方式來啟動 qemu stm32 模擬器
qemu_stm32/arm-softmmu/qemu-system-arm -M stm32-p103 -kernel mymain.bin -S -gdb tcp::1234 qemu-system-arm -M lm3s6965evb -kernel list.bin -S -gdb tcp::1234
紅色的部份不加入, 就是直接執行 mymain.bin, 沒有 debug 功能。
開啟另外一個終端機:
這樣就像是在 x86-pc/linux 下使用 gdb。
lm3s6965evb 是 ti 的版子, 官方 qemu 即內建, 不用另外找 patch, 在我測試 cm3 和週邊無關的程式碼時, 相當方便。
ref:
http://www.techtraining.eng.br/files/uploads/2013/04/18/lm3s6965-evm.pdf
openocd load file to memory:
> load_image /home/descent/git/jserv-course/stm32_prog/factorial.bin 0x20000000 24 bytes written at address 0x20000000 downloaded 24 bytes in 0.008389s (2.794 KiB/s) > mdb 0x20000000 24 0x20000000: 00 08 00 20 09 00 00 00 0a 20 00 21 09 18 01 38 7f f4 fc af ff f7 fe bf
這樣就可以不用寫到 flash, 直接 load 到 sram 測試。
ref: http://openocd.sourceforge.net/doc/html/General-Commands.html
openocd 似乎有些問題, 若遇到奇怪的問題可使用 st-util 配合 gdb 來 debug, 也有可能需要重新開機。
arm-none-eabi-gdb
target remote localhost:4242
也可以指定 gdb port
root@w-linux:descent# st-util -p 1234
arm-none-eabi-gdb
target remote localhost:1234
blackmagic (類似 openocd, st-util 的 tool):
https://github.com/blacksphere/blackmagic/wiki
http://embdev.net/articles/STM_Discovery_as_Black_Magic_Probe
STM32Cube (新版的 library): http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897
ref:
- http://wiki.csie.ncku.edu.tw/embedded/2012w7
- http://wiki.csie.ncku.edu.tw/embedded/Lab6
- HowTo_ToolChain_STM32_Ubuntu
- http://cms.mcuapps.com/techinfo/emulators/st-link/
- http://forum.ubuntu.org.cn/viewtopic.php?t=384021&p=2839453
- http://www.amobbs.com/forum-3020-1.html
- STM32 的 BOOT 概述
- Flashing programs to STM32. Embedded Bootloader
- Getting Started with the STM32F4 and GCC
- STM32 BOOT 位理解及设置
- Programming STM32 F2, F4 ARMs under Linux: A Tutorial from Scratch
- http://www.waveshare.net/shop/STM32F4DISCOVERY.htm
- STM32 笔记(七)IAR 平台,在内存中调试 STM32
- ARM9 2410 移植之在 Linux 下, 用 OpenJTAG+OpenOCD 燒寫 NAND Flash
- x86 版的 Arduino 來了,Intel Galileo 開發板的體驗、分析和應用
- STM32F4 DISCOVERY入手——功耗大解密
- book: Eclipse,OpenOCD,OpenJTAGv3.3 嵌入式开发教程
很好的文章喔,幾乎每次看版主的文章都能有收獲.
回覆刪除謝謝
讚!最近我也買了一片來玩,跟我以前用過的東西比起來性能好太多!話說我在debian下是直接編arm toolchain跟stlink然後用官方template寫code,win7直接用Keil ARM,不過玩不到兩個禮拜不知道能不能STM32F4 & STM32F1的code修改head就能通用?我昨天也弄一片STM32F1不過連怎麼用serial port傳code上去都不知道XD
回覆刪除https://dl.dropbox.com/u/16634624/IMAG0551.jpg
cam11505: 這只是把課程內容做個整理, 拾人牙慧而已。
回覆刪除GCY: 有沒機會來 mosut 介紹一下 Keil ARM, 讓我們看看除了 gnu 原始人之外的開發工具。
STM32F1 是你自己製作的開發版嗎?
其實我主要也都是vim + arm-gcc XD話說那STM32F1我今天搭一個最基本運作電路看起來可以成功走uart把程式上傳上去
回覆刪除http://gcyrobot.blogspot.tw/2013/04/no100.html
您好:
回覆刪除請問一下在qemu底下有uart的demo我需要設定什麼才能看到uart的輸出
感謝
小銕: 不是在 qemu, uart 的範例程式是在 stm32_p103_demos/demos/uart_echo
回覆刪除是的我是在stm32_p103_demos/demos底下執行但是uart輸出的訊息要從哪邊看
回覆刪除感謝
ctrl+alt+2 可以切換 qemu 的畫面 (uart output), ctrl+alt+1 會切回原來的畫面。
回覆刪除感謝大大,受益良多。
回覆刪除我QEMU環境是使用 https://github.com/beckus/qemu_stm32
測試code https://github.com/beckus/stm32_p103_demos
我發現照著你的教學,在跑GDB時 connect refused :1234。
看了demos的makefile,修改一下參數
arm-softmmu/qemu-system-arm -M stm32-p103 -gdb tcp::3333 -S -kernel mytest.bin
這樣就行了
感謝回報, 因為修改了好幾版, 有些環境有變。
回覆刪除辛苦了, 凌晨2點還在努力學習。
不會^^,您的文章對我有很大幫助。從keil轉過來openOCD還在適應中......
刪除收穫很多!
回覆刪除