痞酷網_PIGOO

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

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

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

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

謝謝!
查看: 7457|回復: 5

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

[複製鏈接]
發表於 2014-12-12 04:11:40 | 顯示全部樓層 |閱讀模式
大家好,

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




相片 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 應還會最少發另一或兩篇文章,敬請期待,也是另類的分析研究報告。

n_167|


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

評分

17

查看全部評分

發表於 2014-12-12 13:56:26 | 顯示全部樓層
你要發了啦 ... 4004  
我好像還沒看過Wish大在加分欄動手過,他竟然幫你加分,還頒發貢獻獎 ...
 樓主| 發表於 2014-12-12 15:32:48 | 顯示全部樓層
scottwang 發表於 2014-12-12 01:56 PM
你要發了啦 ... 4004  
我好像還沒看過Wish大在加分欄動手過,他竟然幫你加分,還頒發貢獻獎 ...  ...

報告scottwang大~

那只是論壇啟用新的機制取代以前的機制而以~
你寫一篇高壓power來看看,也會有的。~



發表於 2014-12-13 03:13:14 | 顯示全部樓層
jojoling 發表於 2014-12-12 03:32 PM
報告scottwang大~

那只是論壇啟用新的機制取代以前的機制而以~

喔,好啊,然後你就準備多養3個人 ...
因為發了帖之後,可能就要吃穿靠你了 ... n_060|
發表於 2014-12-14 01:02:01 | 顯示全部樓層
jojoling大:
    STM8已經摸了半年的以上,看了還是灰颯颯,有些懂但是大部分不太懂...資質魯鈍!!
 樓主| 發表於 2014-12-14 01:10:16 | 顯示全部樓層
antlu 發表於 2014-12-14 01:02 AM
jojoling大:
    STM8已經摸了半年的以上,看了還是灰颯颯,有些懂但是大部分不太懂...資質魯鈍!! ...

報告 antlu大,

這篇文章,裏面有幾個主題:
1. C 與低階語由實際的運作,為什麼大家說 C 能吃高又吃低的。並列出真實情況上,
程式設計師用C 在低階開發展品時,所會碰到的問題,來自於不了解這中間的連結與溝通。
2.多平台的支援是如何達成的。
3.如何善用 C 與 組語的優點,同時間存在。

這些都應該算是系統規畫的問題吧。
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

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

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

GMT+8, 2024-11-24 02:22 PM , Processed in 0.272592 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.