|
大家好,
此篇文章是描述 C language 在硬體設計上最另人不懂的東西,且又容易搞混的。
這篇例子的由來,是因為最近 antlu 大一直在搞不定那顆溫溼度計而把我的 STM8S mini 開發模組拿了出來。
先放個完整的程式包上來,因為內含 ST 的 Standard peripherals firmware library 所以大了一點點~
因為要確保完整的路徑,所以在第一版就放上了,以後如有放第2版後就不再加入,那時需自行上 ST 網站上抓。
STM8.part01.rar
(1.86 MB, 下載次數: 80)
STM8.part02.rar
(1.86 MB, 下載次數: 77)
STM8.part03.rar
(1.86 MB, 下載次數: 59)
STM8.part04.rar
(1.86 MB, 下載次數: 54)
STM8.part05.rar
(1.86 MB, 下載次數: 70)
STM8.part06.rar
(1.86 MB, 下載次數: 66)
STM8.part07.rar
(32.54 KB, 下載次數: 55)
此篇就不討論一些基本 ST 公司的開發工具了~
此包程式全帽為:
紅色框裏為利用 ST 公司出的 Standard peripherals library 檔案所建入的 lib 專案,此 lib 專案是為了產生
lib_stm8sxxx.lib 給實際上的專案使用。
此demo是需要安裝 COSMIC C compiler 32k 限制版,因為 8k 限制版裏,裏面不包含做 lib 的標準程式,被淹掉了。
一開始,抓下去後,需要重建所有的 .lib 檔案,請選 Build->Batch build 後,將 lib_xxx 的專案都打勾後並按下 "Build" 及可完成。
注意:輸出畫面不可有紅字產生或任何的錯誤~
底下是一個名叫 test 的專案,實際上只有 main.c , hw_config.h hw_init.c 與 stm8_interrupt_vector.c~
main.c 與 stm8_interrupt_vector.c是自動產生,另2隻是此設計加入的。
底下為 hw_init.c 的設計想法~
接著為 hw_config.h , 定義為硬體描述定義。
底下為 project setting 裏需要注意的,一個是加入 cpu 的定義讓 "庫" library 能正確依照 cpu 來產生。
另一個就是 list 檔, 可產生 C 與組語的對映關系,也是一個滿重要的,此為後續說明之。
如沒有產生,請把它打開及可。
此為這個設計,開一個非 library專案所必須加入的,因為 ST 公司是用其它家做 compiler,所以就需要多些步驟來設定一下。
另其結連到我們產生出來的 .lib ,需注意要連結到正確的 .lib 喔。
此張圖,是特別加注的,是給如果需要自己產生一個新的chip用的 library而寫的。
目前此 workspace 已建立常用的 STM8S 型號為 003/005/103/105/903/207。
此為 workspace 的目錄結構~
example 為等的要介紹的例子
port 為針對特定 cpu 需要寫的~
lib 裏面為產生的所有 .lib file
project 此為所有專案的放置處
最後是 STM8S_StdPeriph_Lib 是ST 公司的Stand peripherals firmware library
多使用這些標準的"庫",可以降低程式設計者的工作量。
因為開發工具的說明對於資料定義並沒有很詳細,所以就特別利用產生的組語來辯識實際常用的資料定義長度~
此虎可看到, list file 副檔名為 .ls
short int 為 16bits
int 為 16bits
char 為8 bits
long 為 32 bits
底下範例為如何在 c file 裏面,簡單的直接使用組合語言,此 cosmic 裏有3種格式。2與3只是定義語法不相同而以。
底下範例為 .C 與 .asm 的連結使用,此例是說明如何在 C 裏使用組語攥寫的數據。反之也是沒問題的。
底下為高階語言副程式的呼叫,實際在低階組語的表示,由此可見~第一個是透過暫存器X,其它是透過堆疊傳遞參數。
此圖為副程式如何取出傳入的資料,與如需傳回,傳回值是放在 reg(暫存器) X。
此例是說明了,如果寫的時後有正確的規範後,並將功能分割,未來移植上是很容易的。
實際上最後所產生的 .map檔,有時也是一個非常重要的數據,裏面記錄著所有產生的所有資訊~
如那些副程式,實際位於 flash 的那個位址偏移量。
hw_config.h 的特別說明~如同名稱,就是與專案的硬體有關。
port 底下的例子,此為專為 STM8S設計的 delay() 功能,所以我們只需另外為 AVR or STM32 設計一個 delay() 功能,
系統其它的地方就可以正確的使用 delay()相關功能。
底下為 delay() 功能的實際量測~程式為 20uS 與實際的量測 19.87us
設定為內部 RC 振盪,1Khz (1000ms), 實際量測 999.4ms
設定為外部 XTAL 振盪,1Khz (1000ms), 實際量測 999.9ms
此 delay() 內可設定為 polling(輪詢) 或 interrupt(中斷)~
初使設定為輪詢及可~不需用中斷的方法。
另外,這次忘了介紹一個很特別的東西:volatile
有機會再介紹吧~不然就自己 google一下
報告完畢~
PS: 此次玩耍 STM8S 應還會最少發另一或兩篇文章,敬請期待,也是另類的分析研究報告。
n_167|
補充內容 (2014-12-12 11:00 AM):
圖上有字打錯 .h 檔為 header file~圖上誤植 hader file |
評分
-
17
查看全部評分
-
|