痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
痞酷網_PIGOO 門戶 原創精選 查看內容

程式語言 C 與硬體的特性 -- 此說明以STM8S為例

2018-5-8 12:05 AM| 發佈者: wish| 查看: 2969| 評論: 0|原作者: jojoling

摘要: 大家好, 此篇文章是描述 C language 在硬體設計上最另人不懂的東西,且又容易搞混的。 這篇例子的由來,是因為最近 antlu 大一直在搞不定那顆溫溼度計而把我的 STM8S mini 開發模組拿了出來。 先放個完整的程式包 ...
大家好,

此篇文章是描述 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




相片 2014-12-12 上午3 03 28.jpg


此篇就不討論一些基本 ST 公司的開發工具了~
此包程式全帽為:
2014-12-12_003711.png


紅色框裏為利用 ST 公司出的 Standard peripherals library 檔案所建入的 lib 專案,此 lib 專案是為了產生
lib_stm8sxxx.lib 給實際上的專案使用。
2014-12-12_003329.png


此demo是需要安裝 COSMIC C compiler 32k 限制版,因為 8k 限制版裏,裏面不包含做 lib 的標準程式,被淹掉了。
2014-12-12_003833.png


一開始,抓下去後,需要重建所有的 .lib 檔案,請選 Build->Batch build 後,將 lib_xxx 的專案都打勾後並按下 "Build" 及可完成。
注意:輸出畫面不可有紅字產生或任何的錯誤~
2014-12-12_003925.png


底下是一個名叫 test 的專案,實際上只有 main.c , hw_config.h hw_init.c 與 stm8_interrupt_vector.c~
main.c 與 stm8_interrupt_vector.c是自動產生,另2隻是此設計加入的。
2014-12-12_004311.png

底下為 hw_init.c 的設計想法~
2014-12-12_004353.png

接著為 hw_config.h , 定義為硬體描述定義。
2014-12-12_004440.png

底下為 project setting 裏需要注意的,一個是加入 cpu 的定義讓 "庫" library 能正確依照 cpu 來產生。
另一個就是 list 檔, 可產生 C 與組語的對映關系,也是一個滿重要的,此為後續說明之。
如沒有產生,請把它打開及可。
2014-12-12_004621.png


此為這個設計,開一個非 library專案所必須加入的,因為 ST 公司是用其它家做 compiler,所以就需要多些步驟來設定一下。
另其結連到我們產生出來的 .lib ,需注意要連結到正確的 .lib 喔。
2014-12-12_004647.png


此張圖,是特別加注的,是給如果需要自己產生一個新的chip用的 library而寫的。
2014-12-12_004726.png


目前此 workspace 已建立常用的 STM8S 型號為 003/005/103/105/903/207。
2014-12-12_004828.png


此為 workspace 的目錄結構~
example 為等的要介紹的例子
port 為針對特定 cpu 需要寫的~
lib 裏面為產生的所有 .lib file
project 此為所有專案的放置處
最後是 STM8S_StdPeriph_Lib 是ST 公司的Stand peripherals firmware library
多使用這些標準的"庫",可以降低程式設計者的工作量。
2014-12-12_005254.png

因為開發工具的說明對於資料定義並沒有很詳細,所以就特別利用產生的組語來辯識實際常用的資料定義長度~
此虎可看到, list file 副檔名為 .ls
short int 為 16bits
int 為 16bits
char 為8 bits
long  為 32 bits
2014-12-12_005600.png


底下範例為如何在 c file 裏面,簡單的直接使用組合語言,此  cosmic 裏有3種格式。2與3只是定義語法不相同而以。
2014-12-12_005839.png

底下範例為 .C 與  .asm 的連結使用,此例是說明如何在 C 裏使用組語攥寫的數據。反之也是沒問題的。
2014-12-12_005954.png

底下為高階語言副程式的呼叫,實際在低階組語的表示,由此可見~第一個是透過暫存器X,其它是透過堆疊傳遞參數。
2014-12-12_010144.png

此圖為副程式如何取出傳入的資料,與如需傳回,傳回值是放在 reg(暫存器) X。
2014-12-12_010204.png

此例是說明了,如果寫的時後有正確的規範後,並將功能分割,未來移植上是很容易的。
2014-12-12_010548.png

實際上最後所產生的 .map檔,有時也是一個非常重要的數據,裏面記錄著所有產生的所有資訊~
如那些副程式,實際位於 flash 的那個位址偏移量。
2014-12-12_010809.png

hw_config.h 的特別說明~如同名稱,就是與專案的硬體有關。
2014-12-12_010931.png

port 底下的例子,此為專為 STM8S設計的 delay() 功能,所以我們只需另外為 AVR or STM32 設計一個 delay() 功能,
系統其它的地方就可以正確的使用 delay()相關功能。
2014-12-12_011019.png

底下為 delay() 功能的實際量測~程式為 20uS 與實際的量測 19.87us
2014-12-12_012134.png
相片 2014-12-12 上午1 22 31.jpg

設定為內部 RC 振盪,1Khz (1000ms), 實際量測  999.4ms
2014-12-12_012448.png
相片 2014-12-12 上午1 25 43.jpg

設定為外部 XTAL 振盪,1Khz (1000ms), 實際量測  999.9ms
2014-12-12_012650.png
相片 2014-12-12 上午1 28 16.jpg

此 delay() 內可設定為 polling(輪詢) 或 interrupt(中斷)~
初使設定為輪詢及可~不需用中斷的方法。
2014-12-12_012918.png

另外,這次忘了介紹一個很特別的東西:volatile
有機會再介紹吧~不然就自己 google一下


報告完畢~

PS: 此次玩耍 STM8S 應還會最少發另一或兩篇文章,敬請期待,也是另類的分析研究報告。




補充內容 (2014-12-12 11:00 AM):
圖上有字打錯 .h 檔為 header file~圖上誤植 hader file
6

鮮花

握手

雷人

路過

雞蛋

剛表態過的朋友 (6 人)

相關分類

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-12-23 11:12 AM , Processed in 0.054271 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.