大家好, 此篇文章是描述 C language 在硬體設計上最另人不懂的東西,且又容易搞混的。 這篇例子的由來,是因為最近 antlu 大一直在搞不定那顆溫溼度計而把我的 STM8S mini 開發模組拿了出來。 先放個完整的程式包上來,因為內含 ST 的 Standard peripherals firmware library 所以大了一點點~ 因為要確保完整的路徑,所以在第一版就放上了,以後如有放第2版後就不再加入,那時需自行上 ST 網站上抓。 STM8.part01.rarSTM8.part02.rarSTM8.part03.rarSTM8.part04.rar STM8.part05.rarSTM8.part06.rarSTM8.part07.rar 此篇就不討論一些基本 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 應還會最少發另一或兩篇文章,敬請期待,也是另類的分析研究報告。 補充內容 (2014-12-12 11:00 AM): 圖上有字打錯 .h 檔為 header file~圖上誤植 hader file |
GMT+8, 2024-11-22 10:49 PM , Processed in 0.092429 second(s), 26 queries , Gzip On.
Powered by Discuz! X3.4 Licensed
© 2001-2023 Discuz! Team.