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

下載本文檔

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

文檔簡介

1、 如何分配變量到指定的地址 舉例: unsigned char temp_A0x00; /定義無符號(hào)變量temp_A,強(qiáng)制其地址為0x00 unsigned char temp_B0x100; /定義無符號(hào)變量temp_B,強(qiáng)制其地址為0x100 tiny unsigned char temp_C; /定義無符號(hào)變量temp_C,由編譯器自動(dòng)在地址小于0x100的RAM中為其分配一個(gè)地址 near unsigned char temp_D; /定義無符號(hào)變量temp_D,由編譯器自動(dòng)在地址大于0xFF的RAM中為其分配一個(gè)地址 另外也可以采用偽指令pragma將函數(shù)或者變量定義到指定的sect

2、ion中,例如: #pragma section name / 將下面定義的未初始化變量定義到.name section中 Unsigned char data1; Unsigned int data2; (任何需要定義在.name section中的變量) #pragma section / 返回到正常的section. 注意:pragma偽指令可以用來定位函數(shù),初始化變量或者未初始化變量。這三者用不同的括號(hào)區(qū)分。 (name):代碼 name :未初始化變量 name:初始化變量 如何在COSMIC C文件中使用匯編語言 在COSMIC C文件中使用匯編語言常見的方法有如下兩種:使用#as

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

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

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

6、下拉菜單中共有4種MEMORY MODEL可供選擇: ? 程序地址空間在64K以內(nèi)(即程序容量小于32K) mods0, modsl0 ? 程序地址哦那個(gè)鍵在64K以上(即程序容量大于32K) mods modsl MODS0 MODSL0 MODS MODSL 名稱 Stack Short 短堆棧模式 Stack Long 長堆棧模式 Stack Short 短堆棧模式 Stack Long 長堆棧模式 程序地址空間 程序所用到的地址空間在64K范圍內(nèi) 程序所用到的地址空間超出64K范圍 指針默認(rèn)類型 函數(shù)指針和數(shù)據(jù)指針默認(rèn)為near (2 bytes) 函數(shù)指針默認(rèn)為far(地址為3字節(jié))

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

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

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

10、prom # .bsct段服務(wù)于定義在0頁(地址小于0x100)以內(nèi)需要初始化的全局變量(如tiny char a = 9;) +seg .bsct -b 0x0 -m 0x100 -n .bsct # .ubsct段服務(wù)于定義在0頁(地址小于0x100)以內(nèi)不需要初始化的全局變量(如tiny char b;) +seg .ubsct -a .bsct -n .ubsct # .bit表示位域段,定義后即可在程序中使用_Bool變量(如_Bool c = 1;),-id表示該段需要初始化。 +seg .bit -a .ubsct -n .bit -id # 這是ST7時(shí)代(STM8是基于ST7

11、發(fā)展而來的)由于物理堆棧小,速度慢,使用內(nèi)存來模擬堆棧的變通手段。 +seg .share -a .bit -n .share -is # .data段服務(wù)于定義在0頁(地址大于0xFF)以外需要初始化的全局變量(如near char d = 8;) +seg .data -b 0x100 -m 0x1300 -n .data # .bss段服務(wù)于定義在0頁(地址大于0xFF)以內(nèi)不需要初始化的全局變量(如 near char e;) +seg .bss -a .data -n .bss # 段定義結(jié)束,下面放置的庫及Obj文件中的變量、常量、程序就按照上面的規(guī)定進(jìn)行分配。 #初始化程序 cr

12、tsi0.sm8 #用戶程序 Debugmain.o # 一些必要的cosmic庫 libis0.sm8 libm0.sm8 # 重定義常量段,開始于0x8000,用于放置中斷向量表(STM8硬件決定此位置) # k 用于程序冗余代碼優(yōu)化,詳情可參考cosmic用戶手冊。 +seg .const -b 0x8000 k # 中斷向量 Debugstm8_interrupt_vector.o #定義了三個(gè)變量,用于系統(tǒng)初始化 +def _endzp=.ubsct # end of uninitialized zpage +def _memory=.bss # end of bss segment

13、 +def _stack=0x17ff # 不同的芯片_stack內(nèi)容不同,由系統(tǒng)自動(dòng)生成 如何實(shí)現(xiàn)位操作 Cosmic C 編譯器支持位變量的操作,可以將其定義成 _Bool類型。_Bool類型的變量只包含兩種值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

14、變量也會(huì)被打包成字節(jié)形式。但是_Bool類型的參數(shù)會(huì)被擴(kuò)展成一個(gè)單字節(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 Debugexample.lkf:1 no default placement for segment .bit The command: clnk -lC:Program FilesCOSMICCXSTM8_16K_4.2.10Lib -o Debugexample.sm8 -mDebugexample.map -

溫馨提示

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

評論

0/150

提交評論