STM8的C語(yǔ)言編程_第1頁(yè)
STM8的C語(yǔ)言編程_第2頁(yè)
STM8的C語(yǔ)言編程_第3頁(yè)
STM8的C語(yǔ)言編程_第4頁(yè)
STM8的C語(yǔ)言編程_第5頁(yè)
已閱讀5頁(yè),還剩28頁(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、精品文檔                                    STM8的C語(yǔ)言編程1根本程序與啟動(dòng)代碼分析 現(xiàn)在幾乎所有的單片機(jī)都能用C語(yǔ)言編程了,采用C語(yǔ)言編程確實(shí)能帶來(lái)很多好處,至少可讀性比匯編語(yǔ)言強(qiáng)多了。在STM8的開(kāi)發(fā)環(huán)境中

2、,可以通過(guò)新建一個(gè)工程,自動(dòng)地建立起一個(gè)C語(yǔ)言的框架,生成后開(kāi)發(fā)環(huán)境會(huì)自動(dòng)生成2個(gè)C語(yǔ)言的程序,一個(gè)是main.c,另一個(gè)是stm8_interrupt_vector.c。main.c中就是一個(gè)空的main()函數(shù),如下所示: /* MAIN.C file *  * Copyright (c) 2002-2005 STMicroelectronics */  main()       while (1); 而在stm8_interrupt_vector.c中,就是聲

3、明了對(duì)應(yīng)該芯片的中斷向量,如下所示:/*    BASIC INTERRUPT VECTOR TABLE FOR STM8 devices *   Copyright (c) 2007 STMicroelectronics */ typedef void far (*interrupt_handler_t)(void); struct interrupt_vector        unsigned char interrupt_instruct

4、ion;       interrupt_handler_t interrupt_handler; far interrupt void NonHandledInterrupt (void)       /* in order to detect unexpected events during development,           it is recommended to se

5、t a breakpoint on the following instruction       */       return; extern void _stext();     /* startup routine */ struct interrupt_vector const _vectab =        0x82, (interrupt_h

6、andler_t)_stext, /* reset */       0x82, NonHandledInterrupt, /* trap  */       0x82, NonHandledInterrupt, /* irq0  */       0x82, NonHandledInterrupt, /* irq1  */     &#

7、160; 0x82, NonHandledInterrupt, /* irq2  */       0x82, NonHandledInterrupt, /* irq3  */       0x82, NonHandledInterrupt, /* irq4  */       0x82, NonHandledInterrupt, /* irq5  */  

8、     0x82, NonHandledInterrupt, /* irq6  */       0x82, NonHandledInterrupt, /* irq7  */       0x82, NonHandledInterrupt, /* irq8  */       0x82, NonHandledInterrupt, /* irq9&

9、#160; */       0x82, NonHandledInterrupt, /* irq10 */       0x82, NonHandledInterrupt, /* irq11 */       0x82, NonHandledInterrupt, /* irq12 */       0x82, NonHandledInterrupt, /*

10、irq13 */       0x82, NonHandledInterrupt, /* irq14 */       0x82, NonHandledInterrupt, /* irq15 */       0x82, NonHandledInterrupt, /* irq16 */       0x82, NonHandledInterrupt, /*

11、irq17 */       0x82, NonHandledInterrupt, /* irq18 */       0x82, NonHandledInterrupt, /* irq19 */       0x82, NonHandledInterrupt, /* irq20 */       0x82, NonHandledInterrupt, /*

12、irq21 */       0x82, NonHandledInterrupt, /* irq22 */       0x82, NonHandledInterrupt, /* irq23 */       0x82, NonHandledInterrupt, /* irq24 */       0x82, NonHandledInterrupt, /*

13、irq25 */       0x82, NonHandledInterrupt, /* irq26 */       0x82, NonHandledInterrupt, /* irq27 */       0x82, NonHandledInterrupt, /* irq28 */       0x82, NonHandledInterrupt, /*

14、irq29 */;在stm8_interrupt_vector.c中,除了定義了中斷向量表外,還定義了空的中斷效勞程序,用于那些不用的中斷。當(dāng)然在自動(dòng)建立時(shí),所有的中斷效勞都是空的,因此,除了第1個(gè)復(fù)位的向量外,其它都指向那個(gè)空的中斷效勞函數(shù)。生成框架后,就可以用Build菜單下的Rebuild All對(duì)工程進(jìn)行編譯和連接,生成所需的目標(biāo)文件,然后就可以加載到STM8的芯片中,這里由于main()函數(shù)是一個(gè)空函數(shù),因此沒(méi)有任何實(shí)際的功能。不過(guò)我們可以把這個(gè)框架對(duì)應(yīng)的匯編代碼反出來(lái),看看C語(yǔ)言生成的代碼,這樣可以更深入地了解C語(yǔ)言編程的特點(diǎn)。生成的代碼包括4個(gè)局部,如圖1、圖2、圖3、圖4所示。

15、                              圖1                    

16、60;     圖2                       圖3                 圖4    圖1顯示的是從內(nèi)存地址8000H開(kāi)始的中斷向

17、量表,中斷向量表中的第1行82021083H為復(fù)位后單片機(jī)運(yùn)行的第1跳指令的地址。從表中可以看出,單片機(jī)復(fù)位后,將從8083H開(kāi)始運(yùn)行。其它行的中斷向量都指向同一個(gè)位置的中斷效勞程序80D0H。   圖2顯示的是3個(gè)字節(jié),前2個(gè)字節(jié)8083H為復(fù)位后的第1條指令的地址,第3個(gè)字節(jié)是一個(gè)常量0,后面的啟動(dòng)代碼要用到。   圖3顯示的是啟動(dòng)代碼,啟動(dòng)代碼中除了初始化堆棧指針外,就是初始化RAM單元。由于目前是一個(gè)空的框架,因此在初始化完堆棧指針設(shè)置成0FFFH后,由于8082H單元的內(nèi)容為0,因此程序就跳到了80B1H,此處是一個(gè)循環(huán),將RAM單元從0到5初

18、始化成0。然后由于存放器X設(shè)置成0100H,就直接通過(guò)CALL main進(jìn)入C的main()函數(shù)。   圖4顯示的是main()函數(shù)和中斷效勞函數(shù),main()函數(shù)對(duì)應(yīng)的代碼就是一個(gè)無(wú)限的循環(huán),而中斷效勞函數(shù)就一條指令,即中斷返回指令。    通過(guò)分析,可以看出用C語(yǔ)言編程時(shí),比匯編語(yǔ)言編程時(shí),就是多出了一段啟動(dòng)代碼。                   &

19、#160;                STM8的C語(yǔ)言編程2 變量空間的分配 采用C這樣的高級(jí)語(yǔ)言,其實(shí)可以不用關(guān)心變量在存儲(chǔ)器空間中是如何具體分配的。但如果了解如何分配,對(duì)編程還是有好處的,尤其是在調(diào)試時(shí)。例如下面的程序定義了全局變量數(shù)組buffer和一個(gè)局部變量i,在RAM中如何分配的呢?/* MAIN.C file *  * Copyright (c) 2002-2005 STMicroelectronics

20、0;*/ unsigned char buffer10;      / 定義全局變量 main()    unsigned char i;           / 定義局部變量            for(i=0;i<10;i+)       

21、;     bufferi = 0x55;            我們可以通過(guò)DEBUG中的反匯編窗口,看到如下的對(duì)應(yīng)代碼: 從這段代碼中可以看到,全局變量buffer被分配到空間從地址0000H到0009H。而局部變量i那么在堆??臻g中分配,通過(guò)PUSH A指令,將堆棧指針減1,騰出一個(gè)字節(jié)的空間,而SP+1指向的空間就是分配給局部變量使用的空間。由此可以得出初步的結(jié)論,對(duì)于全局變量,內(nèi)存分配是從低地址0000H開(kāi)始向上分配的。而局部變量那么是

22、在堆??臻g中分配。另外從上一篇文章中,可以知道堆棧指針初始化時(shí)為0FFFH。而根據(jù)PUSH指令的定義,當(dāng)壓棧后堆棧指針減1。因此堆棧是從上往下使用的。因此根據(jù)內(nèi)存分配和堆棧使用規(guī)那么,我們?cè)诔绦蛟O(shè)計(jì)時(shí),不能定義過(guò)多的變量,免得沒(méi)有空間給堆棧使用。換句話(huà)說(shuō),當(dāng)定義變量時(shí),一定要考慮到堆??臻g,尤其是那些復(fù)雜的系統(tǒng),程序調(diào)用層數(shù)多,這樣就會(huì)占用大量的堆??臻g??傊?,在單片機(jī)的程序設(shè)計(jì)時(shí),由于RAM空間非常有限,要充分考慮到全局變量、局部變量、程序調(diào)用層數(shù)和中斷效勞調(diào)用對(duì)空間的占用。          

23、0;          STM8的C語(yǔ)言編程3 GPIO輸出 與前些日子寫(xiě)的用匯編語(yǔ)言進(jìn)行的實(shí)驗(yàn)一樣,從今天開(kāi)始,要在ST的三合一開(kāi)發(fā)板上,用C語(yǔ)言編寫(xiě)程序,進(jìn)行一系列的實(shí)驗(yàn)。首先當(dāng)然從最簡(jiǎn)單的LED指示燈閃爍的實(shí)驗(yàn)開(kāi)始。開(kāi)發(fā)板上的LED1接在STM8的PD3上,因此要將PD3設(shè)置成輸出模式,為了提高高電平時(shí)的輸出電流,要將其設(shè)置成推挽輸出方式。這主要通過(guò)設(shè)置對(duì)應(yīng)的DDR/CR1/CR2存放器實(shí)現(xiàn)。利用ST的開(kāi)發(fā)工具,先生成一個(gè)C語(yǔ)言程序的框架,然后修改其中的main.c,修改后的代碼

24、如下。編譯通過(guò)后,下載到開(kāi)發(fā)板,運(yùn)行程序,可以看到LED1在閃爍,且閃爍的頻率為5HZ。 /* MAIN.C file *  * Copyright (c) 2002-2005 STMicroelectronics */ #include "STM8S207C_S.h" / 函數(shù)功能:延時(shí)函數(shù)/ 輸入?yún)?shù):ms - 要延時(shí)的毫秒數(shù),這里假設(shè)CPU的主頻為2MHZ/ 輸出參數(shù):無(wú)/ 返 回 值:無(wú)/ 備    注:無(wú)void DelayMS(unsigned int ms) 

25、unsigned char i;  while(ms != 0)      for(i=0;i<250;i+)            for(i=0;i<75;i+)            ms-;          / 函數(shù)功能:主函數(shù)/    

26、       初始化GPIO端口PD3,驅(qū)動(dòng)PD3為高電平和低電平/ 輸入?yún)?shù):ms - 要延時(shí)的毫秒數(shù),這里假設(shè)CPU的主頻為2MHZ/ 輸出參數(shù):無(wú)/ 返 回 值:無(wú)/ 備    注:無(wú)main()  PD_DDR = 0x08;  PD_CR1 = 0x08;              / 將PD3設(shè)置成推挽輸出  PD_CR2 = 0x00

27、;  while(1)      PD_ODR = PD_ODR | 0x08;   / 將PD3的輸出設(shè)置成1    DelayMS(100);             / 延時(shí)100MS    PD_ODR = PD_ODR & 0xF7;   / 將PD3的輸出設(shè)置成0    Dela

28、yMS(100);             / 延時(shí)100MS                                     需要注意的是,

29、當(dāng)生成完框架后,為了能方便使用STM8的存放器名字,必須包括STM8S207C_S.h,最好將該文件拷貝到C:Program FilesSTMicroelectronicsst_toolsetinclude目錄下,拷貝到工程目錄下?;蛘邔⒃撀窂教顚?xiě)到該工程的Settings中的C Compiler選項(xiàng)Preprocessor的Additional include中,這樣編譯時(shí)才會(huì)找到該文件。                  

30、   STM8的C語(yǔ)言編程4 GPIO輸出和輸入 今天要進(jìn)行的實(shí)驗(yàn),是利用GPIO進(jìn)行輸入和輸出。在ST的三合一開(kāi)發(fā)板上,按鍵接在GPIO的PD7上,LED接在GPIO的PD3上,因此我們要將GPIO的PD7初始化成輸入,PD3初始化成輸出。關(guān)于GPIO的引腳設(shè)置,主要是要初始化方向存放器DDR,控制存放器1CR1和控制存放器2CR2,存放器的每一位對(duì)應(yīng)GPIO的每一個(gè)引腳。具體的設(shè)置功能定義如下:DDR   CR1   CR2     引腳設(shè)置0  &#

31、160;    0     0        懸浮輸入0       0     1        上拉輸入0       1     0    &#

32、160;   中斷懸浮輸入0       1     1        中斷上拉輸入1       0     0        開(kāi)漏輸出1       1  

33、   0        推挽輸出1       X     1        輸出最快速度為10MHZ另外,輸出引腳對(duì)應(yīng)的存放器為ODR,輸入引腳對(duì)應(yīng)的存放器為IDR。下面的程序是檢測(cè)按鍵的狀態(tài),當(dāng)按鍵按下時(shí),點(diǎn)亮LED,當(dāng)按鍵抬起時(shí),熄滅LED。同樣也是利用ST的開(kāi)發(fā)工具,先生成一個(gè)C語(yǔ)言程序的框架,然后修改其中的main.c,修改后的

34、代碼如下。編譯通過(guò)后,下載到開(kāi)發(fā)板,運(yùn)行程序,按下按鍵,LED就點(diǎn)亮,抬起按鍵,LED就熄滅了。另外,要注意,將STM8S207C_S.h拷貝到當(dāng)前工程的目錄下。 / 程序描述:檢測(cè)開(kāi)發(fā)板上的按鍵,假設(shè)按下,那么點(diǎn)亮LED,假設(shè)抬起,那么熄滅LED/           按鍵接在MCU的GPIO的PD7上/           LED接在MCU的GPIO的PD3上 #inclu

35、de "STM8S207C_S.h" main()  PD_DDR = 0x08;  PD_CR1 = 0x08;              / 將PD3設(shè)置成推挽輸出  PD_CR2 = 0x00;   while(1)              

36、      / 進(jìn)入無(wú)限循環(huán)      if(PD_IDR & 0x80) = 0x80)   / 讀入PD7的引腳信號(hào)          PD_ODR = PD_ODR & 0xF7;   / 如果PD7為1,那么將PD3的輸出設(shè)置成0,熄滅LED        else    &

37、#160;         PD_ODR = PD_ODR | 0x08;   / 否那么,將PD3的輸出設(shè)置成1,點(diǎn)亮LED                                  

38、60;   STM8的C語(yǔ)言編程58位定時(shí)器應(yīng)用之一 在STM8單片機(jī)中,有多種定時(shí)器資源,既有8位的定時(shí)器,也有普通的16位定時(shí)器,還有高級(jí)的定時(shí)器。今天的實(shí)驗(yàn)是用最簡(jiǎn)單的8位定時(shí)器TIM4來(lái)進(jìn)行延時(shí),然后驅(qū)動(dòng)LED閃爍。為了簡(jiǎn)單起見(jiàn),這里是通過(guò)程序查詢(xún)定時(shí)器是否產(chǎn)生更新事件,來(lái)判斷定時(shí)器的延時(shí)是否結(jié)束。同樣還是利用ST的開(kāi)發(fā)工具,生成一個(gè)C程序的框架,然后修改其中的main.c,修改后的代碼如下。編譯通過(guò)后,下載到開(kāi)發(fā)板,運(yùn)行程序,可以看到LED在閃爍,或者用示波器可以在LED引腳上看到方波。在這里要特別提醒的是,從ST給的手冊(cè)上看,這個(gè)定時(shí)器中的計(jì)數(shù)器是一個(gè)

39、加1計(jì)數(shù)器,但本人在實(shí)驗(yàn)過(guò)程中感覺(jué)不太對(duì),經(jīng)過(guò)反復(fù)的實(shí)驗(yàn),我認(rèn)為應(yīng)該是一個(gè)減1計(jì)數(shù)器也許是我拿的手冊(cè)不對(duì),或許是理解上有誤。例如,當(dāng)給定時(shí)器中的自動(dòng)裝載存放器裝入255時(shí),產(chǎn)生的方波頻率最小,就象下面代碼中計(jì)算的那樣,產(chǎn)生的方波頻率為30HZ左右。假設(shè)初始化時(shí)給自動(dòng)裝載存放器裝入1,那么產(chǎn)生的方波頻率最大,大約為3.9K左右。也就是說(shuō)實(shí)際的分頻數(shù)為ARR存放器的值+1。 /  程序描述:通過(guò)初始化定時(shí)器4,進(jìn)行延時(shí),驅(qū)動(dòng)LED閃爍/            LED接在

40、MCU的GPIO的PD3上 #include "STM8S207C_S.h" main()  / 首先初始化GPIO  PD_DDR = 0x08;  PD_CR1 = 0x08;              / 將PD3設(shè)置成推挽輸出  PD_CR2 = 0x00;   / 然后初始化定時(shí)器4      &#

41、160;                          TIM4_IER = 0x00;            / 禁止中斷  TIM4_EGR = 0x01;      &#

42、160;     / 允許產(chǎn)生更新事件  TIM4_PSCR = 0x07;           / 計(jì)數(shù)器時(shí)鐘=主時(shí)鐘/128=2MHZ/128                         &#

43、160;                                  / 相當(dāng)于計(jì)數(shù)器周期為64uS              TIM4_ARR

44、 = 255;             / 設(shè)定重裝載時(shí)的存放器值,255是最大值  TIM4_CNTR = 255;            / 設(shè)定計(jì)數(shù)器的初值                 &#

45、160;            / 定時(shí)周期=(ARR+1)*64=16320uS  TIM4_CR1 = 0x01;            / b0 = 1,允許計(jì)數(shù)器工作               

46、60;              / b1 = 0,允許更新                              / 設(shè)置控制器,啟動(dòng)定時(shí)器   

47、; while(1)                    / 進(jìn)入無(wú)限循環(huán)      while(TIM4_SR1 & 0x81) = 0x00);      / 等待更新標(biāo)志    TIM4_SR1 = 0x00;     &#

48、160;                 / 去除更新標(biāo)志    PD_ODR = PD_ODR 0x08;                / LED驅(qū)動(dòng)信號(hào)取反        &

49、#160;                                  / LED閃爍頻率=2MHZ/128/255/2=30.63            

50、;                    STM8的C語(yǔ)言編程68位定時(shí)器應(yīng)用之二 今天進(jìn)行的實(shí)驗(yàn)依然是用定時(shí)器4,只不過(guò)改成了用中斷方式來(lái)實(shí)現(xiàn),由定時(shí)器4的中斷效勞程序來(lái)驅(qū)動(dòng)LED的閃爍。實(shí)現(xiàn)中斷方式的關(guān)鍵點(diǎn)有幾個(gè),第一個(gè)關(guān)鍵點(diǎn)就是要翻開(kāi)定時(shí)器4的中斷允許位,在定時(shí)器4的IER存放器中有定義。第二個(gè)關(guān)鍵點(diǎn),就是翻開(kāi)CPU的全局中斷允許位,在匯編語(yǔ)言中,就是執(zhí)行RIM指令,在C語(yǔ)言中,用以下語(yǔ)句實(shí)

51、現(xiàn):_asm("rim");第3個(gè)關(guān)鍵點(diǎn)就是中斷效勞程序的框架或?qū)懛?,中斷效勞程序的?xiě)法如下:far interrupt void TIM4_UPD_OVF_IRQHandler (void)    / 下面是中斷效勞程序的實(shí)體                           

52、;  第4個(gè)關(guān)鍵點(diǎn)就是要設(shè)置中斷向量,即將中斷效勞程序的入口填寫(xiě)到中斷向量表中,如下所示,將IRQ23對(duì)應(yīng)的中斷效勞程序的入口填寫(xiě)成TIM4_UPD_OVF_IRQHandlerstruct interrupt_vector const _vectab =       0x82, (interrupt_handler_t)_stext, /* reset */      0x82, NonHandledInterrupt, /* trap  */  

53、60;   0x82, NonHandledInterrupt, /* irq0  */      0x82, NonHandledInterrupt, /* irq1  */      0x82, NonHandledInterrupt, /* irq2  */      0x82, NonHandledInterrupt, /* irq3  */   &

54、#160;  0x82, NonHandledInterrupt, /* irq4  */      0x82, NonHandledInterrupt, /* irq5  */      0x82, NonHandledInterrupt, /* irq6  */      0x82, NonHandledInterrupt, /* irq7  */    

55、;  0x82, NonHandledInterrupt, /* irq8  */      0x82, NonHandledInterrupt, /* irq9  */      0x82, NonHandledInterrupt, /* irq10 */      0x82, NonHandledInterrupt, /* irq11 */      0x82,

56、NonHandledInterrupt, /* irq12 */      0x82, NonHandledInterrupt, /* irq13 */      0x82, NonHandledInterrupt, /* irq14 */      0x82, NonHandledInterrupt, /* irq15 */      0x82, NonHandledInterrupt, /*

57、irq16 */      0x82, NonHandledInterrupt, /* irq17 */      0x82, NonHandledInterrupt, /* irq18 */      0x82, NonHandledInterrupt, /* irq19 */      0x82, NonHandledInterrupt, /* irq20 */  

58、0;   0x82, NonHandledInterrupt, /* irq21 */      0x82, NonHandledInterrupt, /* irq22 */   0x82, TIM4_UPD_OVF_IRQHandler,/* irq23 */      0x82, NonHandledInterrupt, /* irq24 */      0x82, NonHandledInterrup

59、t, /* irq25 */      0x82, NonHandledInterrupt, /* irq26 */      0x82, NonHandledInterrupt, /* irq27 */      0x82, NonHandledInterrupt, /* irq28 */      0x82, NonHandledInterrupt, /* irq29 */;解決了以上4個(gè)關(guān)鍵

60、點(diǎn),我們就能很輕松地用C語(yǔ)言實(shí)現(xiàn)中斷效勞了。同樣還是利用ST的開(kāi)發(fā)工具,生成一個(gè)C程序的框架,然后修改其中的main.c,修改后的代碼如下。另外還要修改stm8_interrupt_vector.c。編譯通過(guò)后,下載到開(kāi)發(fā)板,運(yùn)行程序,可以看到LED在閃爍,或者用示波器可以在LED引腳上看到方波。   修改后的main.c如下:/  程序描述:通過(guò)初始化定時(shí)器4,以中斷方式驅(qū)動(dòng)LED閃爍/            LED接在MCU的GPIO的PD3上

61、0;#include "STM8S207C_S.h" main()  / 首先初始化GPIO  PD_DDR = 0x08;  PD_CR1 = 0x08;              / 將PD3設(shè)置成推挽輸出  PD_CR2 = 0x00;   / 然后初始化定時(shí)器4         &

62、#160;                       TIM4_IER = 0x00;            / 禁止中斷  TIM4_EGR = 0x01;         &

63、#160;  / 允許產(chǎn)生更新事件  TIM4_PSCR = 0x07;           / 計(jì)數(shù)器時(shí)鐘=主時(shí)鐘/128=2MHZ/128                            &

64、#160;                               / 相當(dāng)于計(jì)數(shù)器周期為64uS              TIM4_ARR = 255; 

65、0;           / 設(shè)定重裝載時(shí)的存放器值,255是最大值  TIM4_CNTR = 255;            / 設(shè)定計(jì)數(shù)器的初值                   &#

66、160;          / 定時(shí)周期=(ARR+1)*64=16320uS  TIM4_CR1 = 0x01;            / b0 = 1,允許計(jì)數(shù)器工作                  &#

67、160;           / b1 = 0,允許更新                              / 設(shè)置控制器,啟動(dòng)定時(shí)器  TIM4_IER = 0x01;  

68、;          / 允許更新中斷  _asm("rim");                / 允許CPU全局中斷   while(1)              

69、      / 進(jìn)入無(wú)限循環(huán)                                   / 函數(shù)功能:定時(shí)器4的更新中斷效勞程序/ 輸入?yún)?shù):無(wú)/ 輸出參數(shù):無(wú)/ 返 回 值:無(wú)far interrupt void TI

70、M4_UPD_OVF_IRQHandler (void)    TIM4_SR1 = 0x00;          / 去除更新標(biāo)志    PD_ODR = PD_ODR 0x08;   / LED驅(qū)動(dòng)信號(hào)取反                  &#

71、160;           /LED閃爍頻率=2MHZ/128/255/2=30.63                                   &

72、#160;        修改后的stm8_interrupt_vector.c如下:/*    BASIC INTERRUPT VECTOR TABLE FOR STM8 devices *   Copyright (c) 2007 STMicroelectronics */ typedef void far (*interrupt_handler_t)(void); struct interrupt_vector  

73、60;     unsigned char interrupt_instruction;       interrupt_handler_t interrupt_handler; far interrupt void NonHandledInterrupt (void)       /* in order to detect unexpected events during development,   &

74、#160;       it is recommended to set a breakpoint on the following instruction       */       return; extern void _stext();     /* startup routine */extern far interrupt void TIM4_UPD_OVF_IR

75、QHandler (void); struct interrupt_vector const _vectab =        0x82, (interrupt_handler_t)_stext, /* reset */       0x82, NonHandledInterrupt, /* trap  */       0x82, NonHandledInterrupt, /* irq0

76、0; */       0x82, NonHandledInterrupt, /* irq1  */       0x82, NonHandledInterrupt, /* irq2  */       0x82, NonHandledInterrupt, /* irq3  */       0x82, NonHandledIn

77、terrupt, /* irq4  */       0x82, NonHandledInterrupt, /* irq5  */       0x82, NonHandledInterrupt, /* irq6  */       0x82, NonHandledInterrupt, /* irq7  */      

78、; 0x82, NonHandledInterrupt, /* irq8  */       0x82, NonHandledInterrupt, /* irq9  */       0x82, NonHandledInterrupt, /* irq10 */       0x82, NonHandledInterrupt, /* irq11 */    &

79、#160;  0x82, NonHandledInterrupt, /* irq12 */       0x82, NonHandledInterrupt, /* irq13 */       0x82, NonHandledInterrupt, /* irq14 */       0x82, NonHandledInterrupt, /* irq15 */    &

80、#160;  0x82, NonHandledInterrupt, /* irq16 */       0x82, NonHandledInterrupt, /* irq17 */       0x82, NonHandledInterrupt, /* irq18 */       0x82, NonHandledInterrupt, /* irq19 */    &

81、#160;  0x82, NonHandledInterrupt, /* irq20 */       0x82, NonHandledInterrupt, /* irq21 */       0x82, NonHandledInterrupt, /* irq22 */    0x82, TIM4_UPD_OVF_IRQHandler,/* irq23 */       0x8

82、2, NonHandledInterrupt, /* irq24 */       0x82, NonHandledInterrupt, /* irq25 */       0x82, NonHandledInterrupt, /* irq26 */       0x82, NonHandledInterrupt, /* irq27 */       0x8

83、2, NonHandledInterrupt, /* irq28 */       0x82, NonHandledInterrupt, /* irq29 */;                 STM8的C語(yǔ)言編程716位定時(shí)器的中斷應(yīng)用 在STM8中,除了有8位的定時(shí)器外,還有16位的定時(shí)器。今天進(jìn)行的實(shí)驗(yàn)就是針對(duì)16位定時(shí)器2來(lái)進(jìn)行的。除了計(jì)數(shù)單元為16位的,其

84、它設(shè)置與前面8位的定時(shí)器根本一樣。下面的程序也是采樣中斷方式,由定時(shí)器2的中斷效勞程序來(lái)驅(qū)動(dòng)LED的閃爍。具體的程序代碼如下,其它注意點(diǎn)見(jiàn)上一篇,另外要注意別忘了修改相應(yīng)的中斷向量。 /  程序描述:通過(guò)初始化定時(shí)器2,以中斷方式驅(qū)動(dòng)LED閃爍/            LED接在MCU的GPIO的PD3上 #include "STM8S207C_S.h" main()  / 首先初始化GPIO  PD_DD

85、R = 0x08;  PD_CR1 = 0x08;              / 將PD3設(shè)置成推挽輸出  PD_CR2 = 0x00;   / 然后初始化定時(shí)器4                      &

86、#160;          TIM2_IER = 0x00;            / 禁止中斷  TIM2_EGR = 0x01;            / 允許產(chǎn)生更新事件  TIM2_PSCR = 0x01;     &#

87、160;     / 計(jì)數(shù)器時(shí)鐘=主時(shí)鐘/128=2MHZ/2                                          &#

88、160;                 / 相當(dāng)于計(jì)數(shù)器周期為1uS                               

89、;                                                  

90、;                                                  

91、;                   / 設(shè)定重裝載時(shí)的存放器值                              &#

92、160;                                                 &#

93、160;                                                 &#

94、160;                   / 注意必須保證先寫(xiě)入高8位,再寫(xiě)入低8位              TIM2_ARRH = 0xEA;           / 設(shè)定重裝載時(shí)的存放器的高

95、8位  TIM2_ARRL = 0x60;      TIM2_CNTRH = 0xEA;          / 設(shè)定計(jì)數(shù)器的初值  TIM2_CNTRL = 0x60;                         

96、                  / 定時(shí)周期=1*60000=60000uS=60ms                            &#

97、160;   TIM2_CR1 = 0x01;            / b0 = 1,允許計(jì)數(shù)器工作                              / b1 = 0,允許更新&

98、#160;                             / 設(shè)置控制器,啟動(dòng)定時(shí)器  TIM2_IER = 0x01;            / 允許更新中斷  _asm(&qu

99、ot;rim");                / 允許CPU全局中斷   while(1)                    / 進(jìn)入無(wú)限循環(huán)        &#

100、160;                          / 函數(shù)功能:定時(shí)器4的更新中斷效勞程序/ 輸入?yún)?shù):無(wú)/ 輸出參數(shù):無(wú)/ 返 回 值:無(wú)far interrupt void TIM2_UPD_IRQHandler (void)    TIM2_SR1 = 0x00;   &#

101、160;      / 去除更新標(biāo)志    PD_ODR = PD_ODR 0x08;   / LED驅(qū)動(dòng)信號(hào)取反                              /LED閃爍頻率=2MHZ/2/60

102、000/2=8.3                                                 &#

103、160;       STM8的C語(yǔ)言編程8 UART應(yīng)用 串口通訊也是單片機(jī)應(yīng)用中經(jīng)常要用到,今天的實(shí)驗(yàn)就是利用STM8的UART資源,來(lái)進(jìn)行串口通訊的實(shí)驗(yàn)。實(shí)驗(yàn)程序的功能是以中斷方式接收串口數(shù)據(jù),然后將接收到的數(shù)據(jù)以查詢(xún)方式發(fā)送到串口。程序代碼如下,首先要對(duì)STM8的UART進(jìn)行初始化,初始化時(shí)要注意的是波特率存放器的設(shè)置,當(dāng)求出一個(gè)波特率的分頻系數(shù)一個(gè)16位的數(shù)后,要將高4位和低4位寫(xiě)到BRR2中,而將中間的8位寫(xiě)到BRR1中,并且必須是先寫(xiě)B(tài)RR2,再寫(xiě)B(tài)RR1。同樣也是利用ST的開(kāi)發(fā)工具,生成一個(gè)C語(yǔ)言的

104、框架,然后修改其中的main.c,同時(shí)由于需要用到中斷效勞,因此還要修改stm8_interrupt_vector.c。修改后,編譯連接,然后下載到開(kāi)發(fā)板上,再做一根與PC機(jī)相連的線,把開(kāi)發(fā)板的串口與PC機(jī)的串口連接起來(lái),注意,2、3腳要交叉。在PC機(jī)上運(yùn)行超級(jí)終端,設(shè)置波特率為9600,然后每按下一個(gè)按鍵,屏幕上就顯示對(duì)應(yīng)的字符。修改后的main.c和stm8_interrupt_vector.c如下:/  程序描述:初始化UART,以中斷方式接收字符,以查詢(xún)方式發(fā)送/         

105、60;  UART通訊參數(shù):9600bps,8位數(shù)據(jù),1位停止位,無(wú)校驗(yàn) #include "STM8S207C_S.h"  / 函數(shù)功能:初始化UART/ 輸入?yún)?shù):無(wú)/ 輸出參數(shù):無(wú)/ 返 回 值:無(wú)/ 備    注:無(wú)void UART3_Init(void)       LINUART_CR2 = 0;           / 禁止UART發(fā)送和接收 

106、; LINUART_CR1 = 0;           / b5 = 0,允許UART                             / b2 = 0,禁止校驗(yàn)    

107、                                  LINUART_CR3 = 0;           / b5,b4 = 00,1個(gè)停止位  

108、;                          / 設(shè)置波特率,必須注意以下幾點(diǎn):/    (1) 必須先寫(xiě)B(tài)RR2/    (2) BRR1存放的是分頻系數(shù)的第11位到第4位,/    (3) BRR2存放的是分頻系數(shù)的第15位到第12位,和第3位到第

109、0位/ 例如對(duì)于波特率位9600時(shí),分頻系數(shù)=2000000/9600=208/ 對(duì)應(yīng)的十六進(jìn)制數(shù)為00D0,BBR1=0D,BBR2=00  LINUART_BRR2 = 0;  LINUART_BRR1 = 0x0d;              / 實(shí)際的波特率分頻系數(shù)為00D0(208)             

110、                                                   

111、;  / 對(duì)應(yīng)的波特率為2000000/208=9600                                      LINUART_CR2 = 0x2C;     

112、          / b3 = 1,允許發(fā)送                                    / b2 = 1,允許接收      &#

溫馨提示

  • 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)論