![STM8單片機C語言編程技巧_第1頁](http://file4.renrendoc.com/view/bf02b70a5f7d63f34ce62e534bdc99d5/bf02b70a5f7d63f34ce62e534bdc99d51.gif)
![STM8單片機C語言編程技巧_第2頁](http://file4.renrendoc.com/view/bf02b70a5f7d63f34ce62e534bdc99d5/bf02b70a5f7d63f34ce62e534bdc99d52.gif)
![STM8單片機C語言編程技巧_第3頁](http://file4.renrendoc.com/view/bf02b70a5f7d63f34ce62e534bdc99d5/bf02b70a5f7d63f34ce62e534bdc99d53.gif)
![STM8單片機C語言編程技巧_第4頁](http://file4.renrendoc.com/view/bf02b70a5f7d63f34ce62e534bdc99d5/bf02b70a5f7d63f34ce62e534bdc99d54.gif)
![STM8單片機C語言編程技巧_第5頁](http://file4.renrendoc.com/view/bf02b70a5f7d63f34ce62e534bdc99d5/bf02b70a5f7d63f34ce62e534bdc99d55.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
如何分配變量到指定的地址舉例:unsignedchartemp_A@OxOO;〃定義無符號變量temp_A,強制其地址為0x00unsignedchartemp_B@0x100;〃定義無符號變量temp_B,強制其地址為0x100@tinyunsignedchartemp_C;/定義無符號變量temp_C,由編譯器自動在地址小于0x100的RAM中為其分配一個地址@nearunsignedchartemp_D;〃定義無符號變量temp_D,由編譯器自動在地址大于0xFF的RAM中為其分配一個地址另外也可以采用偽指令"pragma"將函數(shù)或者變量定義到指定的section中,例如:#pragmasection[name]//將下面定義的未初始化變量定義到.namesection中Unsignedchardata1;Unsignedintdata2; (任何需要定義在.namesection中的變量)#pragmasection[]//返回到正常的section.注意:pragma偽指令可以用來定位函數(shù),初始化變量或者未初始化變量。這三者用不同的括號區(qū)分。(name):代碼[name]:未初始化變量{name}:初始化變量如何在COSMICC文件中使用匯編語言在COSMICC文件中使用匯編語言常見的方法有如下兩種:使用#asm...#endasm組合格式或_asm("...");單行格式。舉例1:unsignedchartemp_A;Voidfunc1(void){#asmPUSHALDA,(X)LD_temp_A,APOPA#endasm}注:在C嵌匯編環(huán)境下使用全局變量,要在該全局變量名稱前加下劃線"_"。舉例2:Voidfunc1(void){_asm("rim");
_asm("nop");}如何觀察RAM/FLASH/EEPROM的最終分配情況在Project->settings->linker選項頁中,將Category選為Output,再勾選GenerateMapFile。ProjectSettings+ip]Bt45dbxxLirLkerp□st-BuildGeneraErrorF+ip]Bt45dbxxLirLkerp□st-BuildGeneraErrorFDefaijlUserHefirLHilComm:=ltli1>21nk$I'Tool£UserHefirLHilComm:=ltli1>21nk$I'Tool£etLibUpt弓)_o$(Ou+putP:=Lth)$(T:=Lt-getSlT:dJTie).sm8-mLugic:=lLAdiifessSjTTib>:冷Sj-ttiBolssortmdbyAlp]Physic:ilAdidi'esESt-ttibibjTTibolesorte>1byad'it點擊OK按鍵后,再次編譯鏈接該項目,如果成功則會在項目輸出目錄中(本例是在C:\STM8_NewProject1\debug目錄下)生成.map文件。該文件詳細地列出RAM/FLASH/EEPROM的分配使用情況。如何生成hex格式的輸出文件在Project->settings->PostBuild選項頁中,在commands欄內(nèi)加入下行命令:chex--o$(OutputPath)$(TargetSName).hex$(OutputPath)$(TargetSName).sm8再次編譯鏈接該項目,如果成功則會在項目輸出目錄中(本例是在C:\STM8_NewProject1\debug目錄下)生成.hex文件。什么是MEMORYMODELSTM8的C編譯器支持多種存儲器模式。用戶可以根據(jù)應用的需要選擇最適合的配置。可以根據(jù)需要選擇采用2個字節(jié)的尋址方式(僅適用于64k以內(nèi)的程序)或者3字節(jié)的尋址方式。也可以規(guī)定將變量默認為定義在存儲器的哪一區(qū)域:zeropage內(nèi),還是zeropage外。下面對幾種供選擇的MEMORYMODEL做簡單說明。在Project->settings->CComplier選項頁中,將Category選為General,里面有一個MemoryModels選項欄如下:
jlI*OKGeneralDebugMCU'Selactioncrsmi~P'llEtumiZGDefaiiltsMemoryCompilerMessages|ShortStack(+mod 〒|UserHefirLt:dComm:=ltli1CjlI*OKGeneralDebugMCU'Selactioncrsmi~P'llEtumiZGDefaiiltsMemoryCompilerMessages|ShortStack(+mod 〒|UserHefirLt:dComm:=ltli1C:=irLcelShoftStack〔+mod.£0)cCompilerXsseml_^+ljs]at45dbxxLungStack(+modslO)ShwtStack(+mods)LongStack(+modsl).cxetm8+modE0+debug~pxp_no_pp_1-i…\庫函\at45dbxx_i..\庫函數(shù)'?固1牛*pi~i..\庫函ProjectSettingsHisplayerrorsonly〒|IlebugIlebuggerCompatible〒|CL:=LrLpiageEntorceFutlctio:n£Fr▼|在下拉菜單中共有4種MEMORYMODEL可供選擇:程序地址空間在64K以內(nèi)(即程序容量小于32K)mods0,modsl0程序地址哦那個鍵在64K以上(即程序容量大于32K)modsmodslMODSOMODSL0MODSMODSL名稱StackShort短堆棧模式StackLong長堆棧模式StackShort短堆棧模式StackLong長堆棧模式程序地址空間程序所用到的地址空間在64K范圍內(nèi)程序所用到的地址空間超出64K范圍指針默認類型函數(shù)指針和數(shù)據(jù)指針默認為@near(2bytes)函數(shù)指針默認為@far(地址為3字節(jié));數(shù)據(jù)指針默認為@門ear全局變量默認類型所有全局變量的地址默所有全局變量默認為所有全局變量的地址默所有全局變量默認認為1個字節(jié)。對于地址Long型。若要將變量地認為1個字節(jié)。對于地址Long型。若要將變,超出1個字節(jié)的變量,必址定義為1個字節(jié),必須超出1個字節(jié)的變量,必址定義為1個字節(jié),須用@near定義 用@訕『定義 須用@near定義 用@訕『定義.lkf文件的作用」kf文件在程序鏈接時決定如何具體分配RAM/ROM的空間。在ProjectSettings-Linker-Category(lnput)選項頁中,當"Auto"選擇框被選中時,由系統(tǒng)自動生^丄KF文件,否則由用戶指定。當"Auto"選擇框被勾選時,」kf文件會自動生成在項目主目錄下的debug/和release/目錄中。下面以上圖所示at45DBXXProject的lkf文件為例,來進一步理解.Ikf。在.Ikf中,以"#"開頭的行是注釋行,為方便用戶理解,將原注釋刪除,代之以中文注釋如下:#定義(+seg)—個常量段(.const),開始(b)于0x8080,最大分配(m)0x1ff80個字節(jié)(即不超過0X27FFF),為該段起名(n)為.const(和常量段的保留字同名),需要初始化的變量的初始值存#放于此段(-it)+seg.const-b0x8080-m0x1ff80-n.const-it#定義(+seg)—個程序段(.text),緊跟(-a)在.const段后面(和.const共同位于0x8080-0x27FFF),為該段起名(n)為.text(和程序段的保留字同名)。+seg.text-a.const-n.text#定義(+seg)—個EEPROM段(.eeprom),開始(b)于0x4000,最大分配(m)0x800個字節(jié)(即不超#過0x47FF),為該段起名(n)為.eeprom(和EEPROM段的保留字同名)。+seg.eeprom-b0x4000-m0x800-n.eeprom.bsct段服務于定義在0頁(地址小于0x100)以內(nèi)需要初始化的全局變量(如@tinychara=9;)+seg.bsct-b0x0-m0x100-n.bsct.ubsct段服務于定義在0頁(地址小于0x100)以內(nèi)不需要初始化的全局變量(如@tinycharb;)+seg.ubsct-a.bsct-n.ubsct.bit表示位域段,定義后即可在程序中使用_Bool變量(如_Boolc=1;),-id表示該段需要初始化。+seg.bit-a.ubsct-n.bit-id#這是ST7時代(STM8是基于ST7發(fā)展而來的)由于物理堆棧小,速度慢,使用內(nèi)存來模擬堆棧的變通手段。+seg.share-a.bit-n.share-is.data段服務于定義在0頁(地址大于OxFF)以外需要初始化的全局變量(如@nearchard=8;)+seg.data-b0x100-m0x1300-n.data.bss段服務于定義在0頁(地址大于OxFF)以內(nèi)不需要初始化的全局變量(如@nearchare;)+seg.bss-a.data-n.bss#段定義結(jié)束,下面放置的庫及Obj文件中的變量、常量、程序就按照上面的規(guī)定進行分配。#初始化程序crtsi0.sm8#用戶程序Debug\main.o一些必要的cosmic庫libis0.sm8libm0.sm8#重定義常量段,開始于0x8000,用于放置中斷向量表(STM8硬件決定此位置)#-k用于程序冗余代碼優(yōu)化,詳情可參考cosmic用戶手冊。+seg.const-b0x8000-k中斷向量Debug\stm8_interrupt_vector.o#定義了三個變量,用于系統(tǒng)初始化+def__endzp=@.ubsct#endofuninitializedzpage+def__memory=@.bss#endofbsssegment+def__stack=0x17ff#不同的芯片__stack內(nèi)容不同,由系統(tǒng)自動生成如何實現(xiàn)位操作CosmicC編譯器支持位變量的操作,可以將其定義成_Bool類型。—Bool類型的變量只包含兩種值true(1)或者false(0)。若將一個表達式賦值給_Bool變量,則編譯器會將表達式與0做比較,然后將布爾值賦給-Bool變量。因此,任何整型或者表達式的值都可以賦給_Bool變量。但是,布爾變量不能定義位數(shù)組,只能定義成結(jié)構(gòu)體或者聯(lián)合。而且,—Bool變量會被打包成字節(jié)的形式。編譯器會將所有的全局_Bool變量打包成字節(jié)形式,存放在.bitsection中。局部_Bool變量也會被打包成字節(jié)形式。但是_Bool類型的參數(shù)會被擴展成一個單字節(jié)。具體的關(guān)于位變量的定義和使用可參考如下例子定義位變量:_Boolin_range;_Boolp_valid;char*ptr;使用位變量:in_range=(value>=10)&&(value<=20);p_valid=ptr;/*p_validistrueifptrnot0*/if(p_valid&&in_在使用位變量時,若程序編譯時提示如下錯誤:#errorclnkDebug\example.lkf:1nodefaultplacementforsegment.bitThecommand:"clnk-l"C:\ProgramFiles\COSMIC\CXSTM8_16K_4.2.10\Lib"-oDebug\example.sm8-mDebug\example.map-saDebug\example.lkf"hasfailed,thereturnedvalueis:1exitcode=1.實際上是由于,在項目中沒有定義.bitsection??砂凑杖缦虏襟E,手工添加.bitsection:打開項目鏈接配置窗口:Project-Settings-Linker,選擇Input目錄項ProjectSettingsAEseniblerFirm一LinkLinkerFoe+-Build+笹at4SdbxxIV
□VCategoryInputGener:=lLiInput?UutputTTTe-iraJTTFrom0x80800x40000x100Defaul0x47££0xf£0xl3f£Optclitk$(Tq^lsetLibOptsD-Q$(OutputFa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 居家養(yǎng)老服務合同范本
- 商業(yè)合作保密合同
- 知識產(chǎn)權(quán)許可合同書范本
- 維修工程合同范本
- 版權(quán)交易平臺服務合同
- 無人駕駛船舶技術(shù)革新與航運未來
- 我國合同法203條
- 安全生產(chǎn)法律法規(guī)和規(guī)章制度的直接執(zhí)行者是
- 基于IB-LBM的超橢球形顆粒曳力和傳熱特性數(shù)值模擬研究
- 公共就業(yè)服務職業(yè)規(guī)劃與職業(yè)生涯發(fā)展考核試卷
- 《工程力學》課程教學大綱
- 2024至2030年中國女裝行業(yè)市場發(fā)展監(jiān)測及投資前景展望報告
- 7.1.2 直觀圖的畫法-【中職專用】高一數(shù)學教材配套課件(高教版2021·基礎(chǔ)模塊下冊)
- 皮膚癬菌病的分子診斷工具
- SL+575-2012水利水電工程水土保持技術(shù)規(guī)范
- SYT 6968-2021 油氣輸送管道工程水平定向鉆穿越設(shè)計規(guī)范-PDF解密
- 人美版初中美術(shù)知識點匯總八年級全冊
- 迅雷網(wǎng)盤最最最全影視資源-持續(xù)更新7.26
- 普通話培訓班合作協(xié)議書
- 《西方思想經(jīng)典》課件
- 中醫(yī)診療設(shè)備種類目錄
評論
0/150
提交評論