智能卡讀寫器,IC卡讀卡器

RFID讀(dú)卡器包含低頻ID卡讀(dú)卡器,高頻IC卡讀(dú)卡器,NFC讀(dú)寫器,超高頻UHF讀(dú)卡器以及相應的模組,智能卡包含印刷彩卡,CPU卡,電(diàn)子标簽

用C語言開(kāi)發(fā)DSP嵌入式系統

用C語言開(kāi)發(fā)DSP嵌入式系統

摘 要:目前很多嵌入式系統以DSP爲核心構建,但是採用彙編語言開發DSP系統存在開發難度大、開發周期長 、維護性差等缺點,應用C語言開發DSP系統是廣大嵌入式開發者的迫切要求。有關單片機的C語言開發有相當多的資料可以參考,而DSP系統的C語言開發卻很少見,本文以TI公司的DSP器件TMS320F24X系列爲例講述怎樣用C語言開發一個完整的DSP嵌入式系統。

關鍵詞:嵌入式系統 、DSP系統、C語言開發、TMS320F24X系列

引言

大家在開發嵌入式産品時首先會想到用控制器的彙編語言編寫監控程序,主要原因是:一、彙編語言生成的程序對應的二進制代碼少,程序執行要比高級語言生成的程序快。二、控制器剛問世時,沒有相應的高級語言可供使用。三、存儲器的價格問題和尋址空間的限制。
以上所述問題目前都基本上解決瞭,在這就不闡述瞭。實際情況是:在單片機的應用領域,開發者開始使用C語言進行開發瞭。大家發現用高級語言開發嵌入式産品是如此輕松,並且C語言程序編譯後的二進制代碼也非常短小精練。
目前使用多的數字信号處理器(DSP)是美國TI公司的TMS320家族,而工業控制上用的多的又是TMS320F2XX系列 ,TI公司爲每一個DSP芯片提供瞭彙編語言和C語言供開發者選用,本人一直使用C語言進行産品開發,而目前很少見到這方面的介紹,所以特撰此文以TMS320F240爲例,向各位同行推薦用C語言開(kāi)發(fā)DSP嵌入式系統。

DSP的C語言的特殊性
大家在使用51系列C語言時已經注意到,控制器的C語言和PC機上使用的C有一個顯著的特點 :經常要對硬件操作,程序中有大量針對控制器内部資源進行操作的語句。所以,開發者要明白怎樣用C語言來操縱控制器的内部資源 ,既怎樣用C語句操作寄存器和内部存儲器等。
舉個例子,在51彙編中我們寫 MOV A,#20H,彙編程序能夠識别A是指累加器,而在51 C程序中我們寫 ACC=32;,編譯器能夠識别ACC是指累加器而不是一般的變量。即每一個寄存器都有一個專有名字供開發者使用,它們定義在一個頭文件reg51.h中,程序員隻需在程序的開始部分用#include“reg51.h”語句将該文件包含進來即可。注意:這些寄存器的名字不能用做變量名。
同樣,在TMS320F240的C語言中也有一個頭文件C240.H定義各個寄存器的名稱,這裏摘錄幾條語句進行介紹。
比如:#define IMR ((PORT)0x0004)
#define XINT1_CR ((PORT)0x07070)
IMR 、XINT1_CR就對應兩個寄存器,實際是寄存器的地址,用高級語言的說法是指針。我們也在程序的開始部分用#include“c240.h”語句将該文件包含進來。這樣 ,在DSP的C語言中使用它們隻需在前面加一個星号(*),例如,
*IMR=0X1010;/* 将16進制數1010H賦給IMR寄存器 */
*XINT1_CR=0X0A0B0;/*将16進制數A0B0H賦給XINT1_CR寄存器 */

開發者好将c240.h這個文件打印出來,弄清楚各個寄存器的定義名稱 。至於不涉及硬件的語法和ANSI 語法一樣,需要注意的是 ,有些ANSI标準中的函數在DSP的編譯器中不提供,讀者可以參考DSP編譯器的C語言手冊。搞清楚瞭這些特殊性,由彙編語言轉到C語言開發是很容易的事,當然,沒有彙編語言編程基礎的人同樣可以用C語言開發DSP應用系統。
有關嵌入式系統的C語言編程可參考《單片機與嵌入式系統應用》2001年1到6期上馬忠梅的“嵌入式C編程技術”,本文不做讨論。下面隻針對以TMS320F240芯片爲處理器的嵌入式C語言編程進行闡述,希望能夠指導讀者進行具體操作。

TMS320F240芯片的C語言開發過程
簡單地說,整個過程包括以下五個步驟:
1、編輯C語言源程序
2、編譯源程序(注意編譯參數)
3、鏈接目标文件(注意用CMD文件)
4、在線仿真
5、固化程序


下面分别進行闡述。
一 源程序的編輯
可以用任何一個編輯器書寫源程序,如EDIT、NOTEPAD等,後以.C爲後綴存盤。源代碼可以寫在一個C文件中,也可寫在多個C文件中,有些預定義變量和函數原型聲明可以集中放在一個頭文件中。
注意事項:不要忘記在C程序的前面用 #include “c240.h”将寄存器定義文件包括進來。
二 源程序的編譯
源程序編輯好後可以用DSPCL編譯程序進行編譯,生成OBJ文件。
使用格式: DSPCL 源文件名 參數
例如:DSPCL EX1.C –V2XX –GK –MN
常用參數的意義:
V2XX:表示C編譯器選擇處理器2XX系列
GK:保留編譯生成的彙編文件(.ASM文件)
MN:進行正常優化
其他參數請參考DSP編譯器的手冊 。如果有多個源文件,分别編譯。每一個源文件經編譯後産生一個OBJ文件和ASM文件。
三 目标文件的鏈接
(一) TI公司的COFF文件格式
TI公司新的彙編器和編譯器創建的目标文件採用COFF的目标文件格式(Common Object File Format)採用COFF格式有利於模塊化編程,爲管理代碼段和目标系統存儲器提供更加強有力和靈活的方法。基於COFF格式編寫彙編程序或C語言程序時,不必爲程序代碼和變量指定目标地址,爲程序編寫和程序移植提供瞭極大的方便。
COFF格式的基本思想是:鼓勵程序員在用彙編語言或C語言編程時運用代碼塊和數據塊的概念。這種塊稱爲SECTION,是目标文件中的小單位。
所有的塊分爲兩大類:已初始化塊和未初始化塊,已初始化塊包含程序代碼和數據,未初始化塊是爲未初始化的數據在存儲器中的保留塊。C編譯器對C程序編譯後産生已初始化塊和未初始化塊,已初始化塊如 .text 塊、 .const 塊、.cinit塊 ;未初始化塊如.bss 塊。
舉個例子,當程序員用C語句 float data[100];定義一個數組時不需要指定這100個數組元素的具體位置,編譯器會在數據區預留所需空間,到鏈接時鏈接器會具體定位。

(二) 鏈接器對塊的處理

鏈接器對塊的處理有兩個功能:其一,将COFF目标文件中的塊用來建立程序塊和數據塊,並将這些塊組合成可以被DSP芯片執行的COFF輸出模塊;其二,鏈接器爲輸出塊指定存儲位置。
鏈接器提供兩個命令實現上述功能:MEMORY和SECTIONS。MEMORY命令定義目标系統的存儲器,程序員可以定義每一塊存儲器並指定起始地址和長度;SECTIONS命令用來定義輸入塊的組合和輸出塊在存儲器中的存放位置。若不用MEMORY和SECTIONS命令,鏈接器採用缺省的分配算法;推薦使用這兩個命令,但要注意這兩個命令在CMD文件(鏈接器命令文件)中使用。
下面分析一個TMS320F240芯片的典型CMD 文件。(假設文件名EX1.CMD)
1、 CMD文件的構成及其詳細解釋
BOOT.OBJ /* F240的中斷矢量表,參見後面的說明 */
EX1.OBJ /* 源程序編譯後對應的目标文件 */
/* 若程序有多個目标文件,一塊寫在這裏 */
-STACK 0X400 /* 設定系統堆棧 */
-C /* ROM初始化 */
-O EX1.OUT /* 輸出的文件名 */
-M EX1.MAP /* 輸出映像文件名 */
-L RTS2XX.LIB /* 鏈入RTS2XX.LIB庫 */
MEMORY /*MEMORY命令規定系統的存儲器配置 */
{
PAGE 0:ROM0: origin=0000h,length=003fh /* FLASH ROM */
PAGE 0:ROM1: origin=0040h,length=0200h /*FLASH ROM */
PAGE 0:ROM2: origin=0240h,length=3000h /* FLASH ROM */
PAGE 1:RAM_B2:origin=0060h,length=0020h /* 内部RAM B2 */
PAGE 1:RAM_B1:origin=0300h,length=0100h /* 内部RAM B1 */
PAGE 1:RAM_B0:origin=0100h,length=0100h /* 内部 RAM B0 */
PAGE 1:RAM_EX:origin=0d000h,length=2800h /* 外部擴展RAM */
}
SECTIONS /* SECTIONS 命令規定瞭程序中塊的具體分配方法 */
{
.vectors:load=ROM0 /* 規定矢量表的存放位置 */
.cinit: load=ROM1 /* C初始化表的存放位置 */
.text: load=ROM2 /* 系統程序的存放位置 */
.bss load=RAM_B0 /*未初始化數據的存放位置 */
.const load=RAM_B1 /* 已初始化數據的存放位置 */
}


2、TMS320F240鏈接時所需的中斷矢量表文件
TMS320F240的目标文件在鏈接時要用到中斷矢量表,中斷矢量表用彙編語言編寫,和具體的DSP芯片有關,假設TMS320F240的中斷矢量表對應的彙編程序爲BOOT.ASM,彙編後的文件名爲BOOT.OBJ。
下面是一個典型的矢量表文件(假設程序名爲BOOT.ASM)。
.port /* 定義中斷函數的名字 */
.globl _c_int0 /* 中斷0對應的函數名 */
.globl _c_int1 /* 中斷1對應的函數名 ,以下語句的意義相同*/
.globl _c_int2 /* 可以将中斷函數名看作中斷入口地址 */
.globl _c_int3 /* 矢量表的存放不需程序員幹預 */
.globl _c_int4
.globl _c_int5
.globl _c_int6
.globl _c_int7
.globl _c_int8
.sect “.vectors”/*用.sect命令自定義一個塊,用於存放中斷矢量表 */
RSVECT B _c_int0 /* 中斷0發生後,程序的跳轉目的地址 */
INT1 B _c_int1 /* 中斷1發生後,則跳到c_int1()函數處 */
INT2 B _c_int2 /* 意義同上,下同 */
INT3 B _c_int3
INT4 B _c_int4
INT5 B _c_int5
INT6 B _c_int6

用彙編器彙編該程序,命令形式:DSPA BOOT.ASM –V2XX 生成BOOT.OBJ文件供鏈接器使用。這樣,我們就可以按如下形式在C源程序中編寫中斷函數:
void c_intx() /* x爲1—8中之一 */
{
中斷程序的C語句系列;
}
注意事項:c_int0()是系統入口函數 ,用戶不能編寫。
經過上面對命令文件(CMD文件)和中斷矢量表的介紹,接下來可以鏈接命令文件來生成所需要的OUT文件供DSP芯片執行或進行軟仿真。
命令形式:DSPLNK CMD文件名 例如:DSPLNK EX1.CMD

另一種情況是,不使用CMD文件,使用缺省配置,簡單介紹如下:
命令形式:DSPLNK OBJ文件名 參數
例如 DSPLNK EX1.OBJ BOOT.OBJ –O XX1.OUT –M XX1.MAP

以上三步可以用下圖(tú)描述:

 

四 程序的仿真
EMURST 仿真器複位命令
EMU2XXW EX1.OUT 載入COFF格式的二進制代碼仿真運行,有關調試器的使用限於篇幅在此就不做讨論瞭。
五 程序的固化
程序仿真運行正確後,需要固化到FLASH ROM中,TMS320F240内部有16K字的FLASH ROM可以用來固化程序,而不需要外擴EPROM(程序不大於16K字的情況下)。
TI公司提供有固化程序的軟件,可以通過仿真器經JTAG口将程序寫入芯片内。目前發展瞭一種新的固化技術,可以通過串口寫入DSP芯片,特别适合於現場調試。下面介紹通過JTAG口的固化方法。
首先用EMURST命令複位調試器,然後執行下面三個批處理文件。
第一步,執行BC0.BAT 批處理文件,将FLASH ROM 清除(CLEAR),使全爲0。
第二步,執行 BE0.BAT 批處理文件,将FLASH ROM 擦除(ERASE),使全爲1。
以上兩步不需要修改軟件包中自帶的這兩個BAT文件。
第三步,執行BP16K.BAT 批處理文件,将自己的OUT文件寫入到DSP内部的FROM中。
執行這一步之前,要先修改BP16K.BAT,将待寫入的OUT文件替換成自己的OUT文件,下面看一下這個批處理文件。假設軟件包的安裝目錄爲C:\DSP,該目錄下有一個子目錄SRC。
prg2xx -p 240 -m 0x0006 -w 6 src\c2xx_bpx.out 要寫入的OUT文件
如果要将EX1。OUT寫入到DSP的FLASH中,則執行下面的命令:
prg2xx -p 240 -m 0x0006 -w 6 src\c2xx_bpX.out c:\dsp\EX1.out
經過以上步驟既完成瞭程序固化,可以将系統放到現場實驗瞭。

注意:固化程序時,CPU的一定要工作在20MHz的頻率下。在SRC子目錄下有一個配置文件C240_CFG.I文件,讀者可以根據程序說明並結合自己系統的外部晶振頻率将CPU的工作頻率設爲20MHz(寫入時的頻率)。
結 論
本文以TMS320F240的開發爲例,介紹瞭怎樣用C語言開發DSP系統的全過程,希望對讀者會有所啓發和幫助。有關怎樣用C語言編程使用TMS320F240内部其他資源(如:定時/比較器、ADC、SCI、SPI、中斷器)和怎樣擴展DSP的外圍電路等編程技術見後面的叙述。
          

新版RFID讀寫器産品手冊下載

相關(guān)聯的産(chǎn)品

RFID讀寫器,IC卡讀卡器, 智能卡讀卡器,RFID讀卡器, 電子标簽,CPU卡讀寫器,讀卡模塊
北京友我科技有限公司 版權所有 (C)2025-2025
客戶服務中心信箱 :coodor@126.com
熱線直撥: 010-57049038 18910685939 電話微信:13691531038,13671114914
京ICP備14016005号
微信掃一掃聯系我們

微信掃一掃聯系我們

友我科技