STM8單片機(jī)C語(yǔ)言編程技巧_第1頁(yè)
STM8單片機(jī)C語(yǔ)言編程技巧_第2頁(yè)
STM8單片機(jī)C語(yǔ)言編程技巧_第3頁(yè)
STM8單片機(jī)C語(yǔ)言編程技巧_第4頁(yè)
STM8單片機(jī)C語(yǔ)言編程技巧_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、如何分配變量到指定的地址舉例:unsigned char temp_A0x00; ame section 中Unsigned char data1;Unsigned int data2;(任何需要定義在.name section中的變量)#pragma section 注意: pragma 偽指令可以用來(lái)定位函數(shù),初始化變量或者未初始 化變量。這三者用不同的括號(hào)區(qū)分。(name):代碼 name :未初始化變量name:初始化變量如何在COSMIC或件中使用匯編語(yǔ)言在COSMIC或件中使用匯編語(yǔ)言常見(jiàn)的方法有如下兩種:使用 #asm - endasm組合格式或_asm(" "

2、;);單行格式。舉例 1 : unsigned char temp_A;Void func1(void) .#asmPUSH A LD A,(X)LD _temp_A,APOP A#endasm.注:在 C 嵌匯編環(huán)境下使用全局變量,要在該全局變量名稱(chēng)前加下劃線"_" 。舉例2:Void func1(void)._asm("rim");_asm("nop");.如何觀察RAM/FLASH/EEPROM最終分配情況在 Project->settings->linker 選項(xiàng)頁(yè)中,將 Category 選為 Output ,

3、再勾選 GenerateMap File 。點(diǎn)擊OK按鍵后,再次編譯鏈接該項(xiàng)目,如果成功則會(huì)在項(xiàng)目輸出目錄中(本例是在C:STM8_NewProject1debug 目錄下)生成.map文件。該文件詳細(xì)地列出 RAM/FLASH/EEPROM分配使用情況。如何生成hex格式的輸出文件在Project->settings->PostBuild選項(xiàng)頁(yè)中,在commands內(nèi)加入下行命令:chex - fi -o $(OutputPath)$(TargetSName).hex $(OutputPath)$(TargetSName).sm8再次編譯鏈接該項(xiàng)目,如果成功則會(huì)在項(xiàng)目輸出目錄中(

4、本例是在C:STM8_NewProject1debug 目錄下)生成.hex 文件。什么是 MEMORY MODELSTM8勺C編譯器支持多種存儲(chǔ)器模式。用戶(hù)可以根據(jù)應(yīng)用的需要選擇最適合的配置??梢愿鶕?jù)需要選擇采用 2個(gè)字節(jié)的尋址方式(僅適用于64k以?xún)?nèi)的程序)或者3字節(jié)的尋址 方式。也可以規(guī)定將變量默認(rèn)為定義在存儲(chǔ)器的哪一區(qū)域:zero page內(nèi),還是zero page外。下面對(duì)幾種供選擇的 MEMORY MODELS單說(shuō)明。在 Project->settings->C Complier選項(xiàng)頁(yè)中,將 Category 選為 General ,里面有一個(gè)Memory Models

5、選項(xiàng)欄如下:9在下拉菜單中共有 4種MEMORY MODEB選擇:程序地址空間在64K以?xún)?nèi)(即程序容量小于32K)mods。,modslO程序地址哦那個(gè)鍵在 64K以上(即程序容量大于 32K) modsmodslMODS0MODSLOMODSMODSL名稱(chēng)Stack Short短堆棧模式Stack Long長(zhǎng)堆棧模式Stack Short短堆棧模式Stack Long長(zhǎng)堆棧模式程序所用到的地址空間在64K范圍內(nèi)程序地址 空間程序所用到的地址空間超出64K范圍指針默認(rèn) 類(lèi)型函數(shù)指針和數(shù)據(jù)指針默認(rèn)為near (2 bytes)函數(shù)指針默認(rèn)為 far(地址為3字節(jié));數(shù)據(jù)指針默認(rèn)為near全局變量

6、 默認(rèn)類(lèi)型所有全局變量的地 址默認(rèn)為1個(gè)字節(jié)。對(duì)于 地址超出1個(gè)字節(jié)的變 量,必須用near定義所有全局變量默認(rèn) 為L(zhǎng)ong型。若要將變量 地址定義為1個(gè)字節(jié),必須用tiny定義所有全局變量的地址默認(rèn)為1個(gè)字節(jié)。對(duì)于地址超出1個(gè)字節(jié)的變量,必須用 near定義所有全局變量默 為L(zhǎng)ong型。若要將叁 地址定義為1個(gè)字節(jié) 須用tiny定義.lkf 文件的作用.lkf 文件在程序鏈接時(shí)決定如何具體分配RAM/ROMJ空間。在Project Settings -Linker - Category(Input)選項(xiàng)頁(yè)中,當(dāng)"Auto"選擇框被選中時(shí),由系統(tǒng)自動(dòng)生成 .LKF文件,否則

7、由用戶(hù)指定。當(dāng)"Auto”選擇框被勾選時(shí),.lkf文件會(huì)自動(dòng)生成在項(xiàng)目主目錄下的debug/和release/ 目錄中。下面以上圖所示 at45DBXX Project 的lkf文件為例,來(lái)進(jìn)一步理解.lkf。在.lkf中,以"#開(kāi)頭的行是注釋行,為方便用戶(hù)理解,將原注釋刪除,代之以中文注 釋如下:# 定義(+seg) 一個(gè)常量段(.const),開(kāi)始(b)于0x8080,最大分配(m)0x1ff80 個(gè)字節(jié)(即 不超過(guò)# 0X27FFF),為該段起名(n)為.const(和常量段的保留字同名),需要初始化的變量的 初始值存# 放于此段(-it)+seg .const -b

8、 0x8080 -m 0x1ff80 -n .const -it# 定義(+seg) 一個(gè)程序段(.text),緊跟(-a)在.const段后面(和.const共同位于 0x8080 -# 0x27FFF) ,為該段起名(n) 為 . text ( 和程序段的保留字同名) 。+seg .text -a .const -n .text# 定義(+seg) 一個(gè)EEPRO瞰(.eeprom),開(kāi)始(b)于0x4000,最大分配(m)0x800個(gè)字節(jié) ( 即不超# 過(guò)0x47FF),為該段起名(n)為.eeprom (和EEPRO瞰的保留字同名)。+seg .eeprom -b 0x4000 -m

9、0x800 -n .eeprom# .bsct 段服務(wù)于定義在0 頁(yè) ( 地址小于0x100) 以?xún)?nèi)需要初始化的全局變量( 如 tinychar a = 9;)+seg .bsct -b 0x0 -m 0x100 -n .bsct# .ubsct 段服務(wù)于定義在0 頁(yè) ( 地址小于0x100) 以?xún)?nèi)不需要初始化的全局變量( 如 tinychar b;)+seg .ubsct -a .bsct -n .ubsct# .bit 表示位域段,定義后即可在程序中使用_Bool 變量 ( 如 _Bool c = 1;), -id 表示該段需要初始化。+seg .bit -a .ubsct -n .bit

10、 -id# 這是ST7時(shí)代(STM8是基于ST7發(fā)展而來(lái)的)由于物理堆棧小,速度慢,使用內(nèi)存來(lái) 模擬堆棧的變通手段。+seg .share -a .bit -n .share -is# .data段服務(wù)于定義在 0頁(yè)(地址大于0xFF)以外需要初始化的全局變量(如nearchard = 8;)+seg .data -b 0x100 -m 0x1300 -n .data# .bss段服務(wù)于定義在 0頁(yè)(地址大于0xFF)以?xún)?nèi)不需要初始化的全局變量(如 nearchar e;)+seg .bss -a .data -n .bss# 段定義結(jié)束,下面放置的庫(kù)及Obj 文件中的變量、常量、程序就按照上

11、面的規(guī)定進(jìn)行分配。# 初始化程序# 用戶(hù)程序Debug # 一些必要的cosmic 庫(kù)# 重定義常量段,開(kāi)始于0x8000,用于放置中斷向量表(STM8硬件決定此位置)# - k用于程序冗余代碼優(yōu)化,詳情可參考cosmic用戶(hù)手冊(cè)。+seg .const -b 0x8000- k# 中斷向量Debug# 定義了三個(gè)變量,用于系統(tǒng)初始化+def _endzp=.ubsct # end of uninitialized zpage+def _memory=.bss # end of bss segment+def _stack=0x17ff #不同的芯片_stack 內(nèi)容不同,由系統(tǒng)自動(dòng)生成如何實(shí)

12、現(xiàn)位操作Cosmic C 編譯器支持位變量的操作,可以將其定義成_Bool 類(lèi)型。 _Bool 類(lèi)型的變量只包含兩種值true ( 1)或者 false ( 0)。若將一個(gè)表達(dá)式賦值給_Bool 變量,則編譯器會(huì)將表達(dá)式與0 做比較,然后將布爾值賦給_Bool 變量。因此,任何整型或者表達(dá)式的值都可以賦給 _Bool 變量。但是,布爾變量不能定義位數(shù)組,只能定義成結(jié)構(gòu)體或者聯(lián)合。而且,_Bool 變量會(huì)被打包成字節(jié)的形式。編譯器會(huì)將所有的全局_Bool 變量打包成字節(jié)形式,存放在 .bit section 中。 局部 _Bool變量也會(huì)被打包成字節(jié)形式。但是_Bool 類(lèi)型的參數(shù)會(huì)被擴(kuò)展成一個(gè)

13、單字節(jié)。具體的關(guān)于位變量的定義和使用可參考如下例子: 定義位變量:_Bool in_range;_Bool p_valid;char *ptr;使用位變量:in_range = (value >= 10) && (value <= 20);p_valid = ptr; /* p_valid is true if ptr not 0 */if (p_valid && in_在使用位變量時(shí),若程序編譯時(shí)提示如下錯(cuò)誤:# error clnk Debug:1 no default placement for segment .bitThe command:"clnk -l"C:Program FilesCOSMICCXSTM8_16K_4.2.10Lib" -o Debug -mDebug -sa Debug &quo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論