|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
輕松入門開發(fā)ARM程序(為初學(xué)者寫的入門手冊(cè))-14- |
| 作者:liuq 欄目:MCU技術(shù) |
從上面的STR710-LED的啟動(dòng)程序清單中我們可以看到,啟動(dòng)程序執(zhí)行以下任務(wù):  定義了CSPR寄存器中處理器模式控制字段的值和中斷控制字段值;  定義了EIC、EMI、GPIO、APB1和APB2的基地址和相關(guān)控制寄存器的偏移量;  定義了各種處理器模式的堆棧;  定義了初始化EIC和外部設(shè)備的2個(gè)宏;  決定是否重映射;  加載各處理器模式的堆棧指針  跳轉(zhuǎn)到C的庫(kù)程序?main 上面STR710-LED的啟動(dòng)程序在很多情況下是可以通用的,幾乎不做任何修改就可以用于其他項(xiàng)目。當(dāng)然有時(shí)候也需要做一定的修改才能使用。建議初學(xué)者先直接引用這個(gè)啟動(dòng)程序,等到熟悉以后再根據(jù)項(xiàng)目需要做修改。 ② 71x_vect.s 71x_vect.s建立Reset、異常中斷處理程序以及外設(shè)中斷的向量表,初學(xué)者可以直接引用這個(gè)啟動(dòng)程序。 ③ 71x_it.c和71x_it.h 71x_it.c中包含所有中斷服務(wù)程序的空函數(shù),用戶可以選擇加進(jìn)自己的中斷服務(wù)程序。就象前面介紹的。 ④ 71x_cofg.h 71x_cofg.h是目標(biāo)系統(tǒng)配置文件,它是用戶開發(fā)自己的項(xiàng)目時(shí)唯一要修改的文件。用戶應(yīng)根據(jù)目標(biāo)板上使用到的芯片資源定制自己的項(xiàng)目配置文件,方法是刪除使用設(shè)備前面的注釋。注意,在STR710-LED例子中沒有利用71x_cofg.h。請(qǐng)看下面例子: #ifndef __71x_CONF_H #define __71x_CONF_H /* Comment the LINE below to put the library in release mode */ #define DEBUG #define inLINE inLINE /* 系統(tǒng)不用的設(shè)備名前加注釋 */ #define _ADC12 /* 啟用ADC12 */ /* #define _APB */ /* #define _APB1 */ /* #define _APB2 */ /* #define _BSPI */ /* #define _BSPI0 */ /* #define _BSPI1 */ /* #define _CAN */ /* #define _EIC */ /* #define _EMI */ /* #define _FLASH */ #define _GPIO /* 啟用GPIO 0和1 */ #define _GPIO0 #define _GPIO1 /* #define _GPIO2 */ /* #define _I2C */ /* #define _I2C0 */ /* #define _I2C1 */ #define _PCU /* 啟用PCU */ #define _RCCU /* 啟用RCCU */ /* #define _RTC */ /* #define _TIM */ /* #define _TIM0 */ /* #define _TIM1 */ /* #define _TIM2 */ /* #define _TIM3 */ /* #define _UART */ /* #define _UART0 */ /* #define _UART1 */ /* #define _UART2 */ /* #define _UART3 */ /* #define _USB */ /* #define _WDG */ /* #define _XTI */ /* #define _IRQVectors */ #endif /* __71x_CONF_H */ 在這個(gè)例子中我們?yōu)槟繕?biāo)系統(tǒng)配置了ADC12、GPIO0、GPIO1、 PCU和RCCU這幾個(gè)設(shè)備。 ⑤ 71x_map.h 在71x_map.h文件中以結(jié)構(gòu)體的形式定義片上外部設(shè)備的控制、狀態(tài)和數(shù)據(jù)寄存器。我們以12位A/D為例:  定義AD轉(zhuǎn)換器寄存器組的結(jié)構(gòu)如下: typedef volatile struct { vu16 DATA0; vu16 EMPTY1[3]; // EMPTY是寄存器之間的空地址單元(6個(gè)字節(jié)) vu16 DATA1; vu16 EMPTY2[3]; vu16 DATA2; vu16 EMPTY3[3]; vu16 DATA3; vu16 EMPTY4[3]; vu16 CSR; vu16 EMPTY5[7]; vu16 CPR; } ADC12_TypeDef;  定義A/D轉(zhuǎn)換器寄存器組的基地址 因?yàn)锳/D轉(zhuǎn)換器連接在APB2總線上,先定義APB2的基地址 #define APB2_BASE 0xE0000000 然后根據(jù)偏移量定義A/D轉(zhuǎn)換器寄存器組結(jié)構(gòu)體的基地址 #define ADC12_BASE (APB2_BASE + 0x7000) ⑥ 71x_lib.c 71x_lib.c根據(jù)用戶的配置文件(71x_conf.h)自動(dòng)初始化目標(biāo)系統(tǒng)啟用的外設(shè)指針。仍以A/D轉(zhuǎn)換器為例,見下面: #ifdef _ADC12 ADC12 = (ADC12_TypeDef *) ADC12_BASE #endif 此后用戶在應(yīng)用程序中需要引用A/D轉(zhuǎn)換器的某個(gè)寄存器時(shí)只需用以下方法即可: ADC12->CSR = 0x00 ; ⑦ 71x_lib.h 71x_lib.h根據(jù)用戶的配置文件(71x_conf.h)包含需要訪問的頭文件,還是以ADC12舉例來(lái)說(shuō)明。如果我們?cè)?1x_conf.h中配置了AD轉(zhuǎn)換,即刪除了#define _ADC12前的注釋。那么在71x_lib.h中有: #ifdef _ADC12 #include “adc12.h” #endif 注意: 在71x_conf.h中是否保留語(yǔ)句 #define DEBUG決定在最后生成的目標(biāo)文件中是初始化所有外部設(shè)備還是僅初始化被啟用外部設(shè)備的控制和狀態(tài)寄存器的結(jié)構(gòu)體指針。 3.如何利用ST源程序著手編寫應(yīng)用程序 寫到這里相信大家已經(jīng)看出著手編寫ST STR710的應(yīng)用程序是多么容易了。為了清晰起見,我們把流程列在下面: ① 建議備份ST的01STR71x軟件包,以防無(wú)意修改或破壞。 ② 建立新工作區(qū)和新項(xiàng)目,并根據(jù)前面介紹設(shè)置項(xiàng)目選件。 ③ 給項(xiàng)目添加文件。必須添加的文件有: 71x_init.s (注:在項(xiàng)目下建立一個(gè)startup組,把71x_init.s和71x_vect.s放在此組) 71x_vect.s 71x_it.c (注:如不需要定時(shí)器1的中斷處理,就把void T1TIMI_IRQHandler(void)函數(shù)內(nèi)部寫空) 71x_lib.c 目標(biāo)系統(tǒng)所用到設(shè)備驅(qū)動(dòng)c程序; ④ 在連接器指向的include目錄中,必須包含以下文件 71x_it.h 71x_map.h 71x_type.h 71x_conf.h 71x_lib.h 至少包含目標(biāo)系統(tǒng)所用到設(shè)備的頭文件(﹡.h),一般include目錄應(yīng)包含所有頭文件; ⑤ 根據(jù)用戶目標(biāo)系統(tǒng)的外設(shè)配置要求修改71x_cong.h文件,根據(jù)要求注釋或釋放#define DEBUG預(yù)處理命令; ⑥ 添加或編寫用戶自己的main主程序,在程序頭上添加語(yǔ)句 #include 71x_lib.h,在程序中調(diào)用ST提供的外設(shè)驅(qū)動(dòng)程序完成自己的操作需求。 01STR71x軟件包中有很多單個(gè)的片上外設(shè)的例子,初學(xué)者可以去再試驗(yàn)和了解如何操作這些設(shè)備。用戶可以打開01STR71x\STR71xLibrary\examples目錄下的examples.eww工作區(qū)文件。然后在工作區(qū)窗口下的書簽?zāi)夸浿羞x擇針對(duì)各片上外設(shè)的項(xiàng)目,進(jìn)行編譯、連接和調(diào)試。調(diào)試過程中可以打開主程序窗口和Watch窗口,同時(shí)單步運(yùn)行程序并觀察變量的變化。 還有一點(diǎn)提示:由于ARM結(jié)構(gòu)不提供位操作指令,所以對(duì)寄存器的位置位和位清除可以用下面語(yǔ)句形式實(shí)現(xiàn)。 GPIO0 -> PC0 |= 1<<3; // 將GPIO0的PC0控制寄存器的bit 03置1 GPIO0 -> PC0 |= 0x0008; // 與上面一句的結(jié)果一樣 EMI -> BCON0 = 0 | (1<<15) | (0x01<<2) |1; // 將BCON0寄存器的bit 15,bit 2和bit 0置1,其// 他位置0。 |
| 2樓: | >>參與討論 |
| 作者: gyt 于 2006/8/13 17:22:00 發(fā)布:
謝謝 收下了 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |