Anda di halaman 1dari 25

1.

Lp trnh LCD 162 ch 4-bits vi STM32


Chng trnh chy trn kt OPENCMX-STM3210D; hin th dng ch Sharing
Tech in ARM Viet Nam. V d mu ny s nu ln vi im cn ch khi giao
tip LCD 162 ch 4-bits.

Cc ch quan trng:
- Cc chn D0-D3 c trng hoc kt ni xung GND.
- V mc nh LCD hot ng mode 8 bit, do khi mi khi ng LCD s vo
ch 8 bit nn nu ta thit lp cho LCD mode 4-bit ngay t u th LCD s
khng hiu. Do LCD hiu ta mun giao tip mode 4-bit th cn mt lnh
gi lp cho LCD, bng cch gi lnh (nh bn di) trc khi gi
hm LCD_Function_Set():
/* Set 4-bits interface */
lcd_Control_Write(033);
Delay(10);
lcd_Control_Write(032);
Lu l iu ny cn ty vo loi LCD( mt s LCD cng khng cn ti lnh gi
ny m ch cn 1 delay() nh th cng ok)
- Cn ch n qu trnh thao tc n 4 ng Data trong
hm lcd_data_line_write(u8 data) , c th s tc ng n cc chn iu khin nu
dng chung 1 Port ( Cn phi dng cc php ton AND, OR thch hp).
Ti chng trnh ngun y. Ngoi ra c th tham kho thm demo giao tip
LCD 162 ch 8-bits vi STM32 y.
2.Lp trnh ADC
bi ny chng ta s tip cn cch s dng b ADC ca STM32F103RC thng
qua cc ng dng chuyn i gi tr tn hiu tng t sang s.
1 Mi trng pht trin phn cng
1.1 H tr ADC ca GEM3v0.1
board GEM3v0.1, c nhiu chn c thit k dnh ring cho cc tc v tng
hp nh: GPIOs, PWM, ADC, DAC, TIMER, Temperature sensor,

hnh trn ta thy chn s 14 ca STM32F103x c thit k a chc nng. v
d ny, chng ta s s dng n nh l u vo d liu cho b ADC.
Mt s c tnh c bn ca b ADC ca STM32F103x:
+ phn gii 12-bit v tn sut ly mu l 56MHz(khong 1us mt mu).
+ 18 knh chuyn i trong : 16 knh dnh cho tn hiu ngoi c nh s ln
lt t: AIN0,AIN1,AIN15; 2 knh cn li dnh cho cm bin nhit ni v vn
k ni.
+ B ADC c cp ngun ring t 2.4V n 3.6V.
+ H tr 2 loi chuyn i: regular, injected.
board GEM31v0.1, b ADC c cp ngun trc tip 3.3V. in p tham chiu
Vref+ bng 3.3V.
phn gii 12bit cho php m ha cc tn hiu tng t t 0->3.3 sang gi tr s
t 0->4095. Gi tr lng t c tnh bng:

Quantizer = 3.3 / 2^12 = 3.3/4096 = 0.8mV

1.2 Cm bin nhit LM35DZ
Cm bin nhit LM35DZ gm 3 chn:

Ngun cung cp cho chn +Vs vo khong t 4V n 30V. chn xut d liu,
khi nhit bng 0 in p ra s l 0V. Cm bin ny o nhit theo thang
Celcius. C mi mt n v nhit s tng ng vi 10mV. V mc thay i l
tuyn tnh. V d nu nhit hin gi l 25 Celcius, th in p xut s l
10mVx25 = 250mV. Nh vy, vi gi tr lng t l 0.8mV, chng ta hon ton
c kh nng ly mu chnh xc gi tr t cm bin nhit.
Trong ng dng tch hp vi board GEM3v0.1, ngun cp cho cm bin l 5V.
S mch kt ni vi STM32 c thit k nh sau:

2 Cu trc chng trnh
2.1 S khi

2.2 Cu hnh hot ng ADC

Gii thch:
(1): S dng hm chun th vin CMSIS RCC_APB2PeriphClockCmd kch
hot cc ngoi vi trn APB2, y ta kch hot ADC1:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
(2): nhn c d liu dng tng t, ta phi cu hnh chn d liu hot ng
ch Analog Input. demo ny, ta s dng chn s 14 , tng ng l chn
0(GPIO_Pin_0) ca Port A(GPIOA) , k hiu l PA0
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
(3): Cu hnh ch hot ng ca ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
(4): Cu hnh ADC Channel, v d ny, ta cu hnh ADC Channel 0
(ADC_Channel_0) hot ng nh l Regular Channel vi thi gian ly mu l 55
chu k
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,
ADC_SampleTime_55Cycles5);
(5): Kch hot b ADC1
ADC_Cmd(ADC1, ENABLE);
(6): Kch hot Reset Calibration, khi ng li b ly mu chun v ch cho qu
trnh ti khi ng hon tt
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
(7): Kch hot ch ly mu v cng ch cho n hon tt
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
(8): Kch hot ch chuyn i
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
2.3 c d liu t LM35DZ
Chn d liu ca LM35DZ c ni trc tip ti chn PA0. c d liu
c chuyn i bi khi ADC1 ta s dng hm
uint16_t adc = 0;
adc = ADC_GetConversionValue(ADC1);
Gi tr ny c lng t ha , do chng ta phi tnh ton li gi tr thc
theo cng thc:

in p thc = Vref * (Gi tr lng t) / 2^n
= 3.3 * (gi tr lng t)/ 4096.

Gi s gi tr chuyn i c t ADC1 l 251, khi in p thc nhn t
LM35DZ l:

in p thc = 3.3 * 251 / 4096 = 202mV
Khi nhit thc s l:
Nhit thc = in p thc / 10 = 20.2 C
3. Ti nguyn chng trnh
Download d n y.
Cc bn dng cp cng COM ni board vi my tnh coi gi tr c t cm
bin.
3. Lp trnh iu khin MMC/SD card vi board STM32-GEM3M trn nn
TOPPERS/ASP
MMC l vit tt ca MultiMedia Card. y l loi th nh s dng b nh NAND
flash lu tr d liu c gii thiu ln u vo nm 1997 bi Siemens AG v
SanDisk. i vi cc ng dng nhng mc vi iu khin, MMC/SD card l s
la chn thch hp cho cc ng dng cn lu tr d liu v kt ni phn cng vi
th MMC/SD
n gin, h tr giao tip SPI, ng thi dung lng b nh ln(c th ln ti
32GBs). B nh ca th MMC/SD c t chc dng block, tng t nh
cng(hardisk) trong my tnh. Do vy cng nh cng, MMC/SD s dng tp
lnh ATA giao tip vi phn mm iu khin.
Mt s c im khi th MMC/SD hot ng ch SPI
+ Truyn d liu ng b trn 3 tn hiu: CLK, DI, DO.
+ Kch hot th thng qua tn hiu : Chip Select(CS).
+ Tn s hot ng t 0-20MHz.
+ H tr truy cp Single Block v Multi Block.
+ S kt ni
Th t chn Chn kt ni Loi M t
1 CS Input Chip Select
2 DI Input/Push Pull Data Input
3 VSS -
4 VDD -
5 BCLK Input Clock Source
6 VSS2 -
7 DO Output/Push Pull Data Output
8 -
9 -
Khi hot ng ch SPI, cc lnh iu khin v d liu c truyn chung trn
2 tn hiu DI v DO
Khi c d liu t th




Khi ghi d liu xung th


FATFS
FatFS l b m ngun min ph h tr nh dng FAT(File Allocation Table) c
s dng rng ri trong h iu hnh Windows. T chc ca FatFS c m t nh
sau

FatFS s cung cp giao din cc hm c bn thc thi cc thao tc file trn th
MMC/SD tng t nh lp trnh file trn my tnh.
FatFS h tr cc kiu format FAT12, FAT16, FAT32.
Cc hm giao din lp trnh: f_mount, f_open, f_close, f_read,
f_write,f_lseek, f_sync, f_opendir, f_readdir, f_getfree, f_stat, f_mkdir,
f_untrnk, f_chmod, f_rename, f_mkfs.
FatFS gm 2 phn chnh l phn FAT bao gm cc hm lin quan n File
Allocation Table, v phn ATA lin quan n x l cc lnh ATA giao tip vi
th nh.
T chc file chnh ca FatFs gm:
file ff.c: gm cc hm h tr FAT.
file ata.c: gm cc hm giao tip ATA command.
giao tip vi phn iu khin (driver) ca th MMC/SD, FatFS yu cu 5 hm
giao din
disk_initialize: hm khi to kt ni ti th MMC/SD, ng thi kch hot cho th
trng thi sn sng hot ng.
disk_write: ghi d liu vo mt vng sector nht nh.
disk_read: c d liu t mt vng sector cho trc.
disk_status: ly trng thi ca th.
disk_ioctl: cc hm x l cc yu cu khc s c b tr x l y.
Kin trc ca FatFS n gin do rt tin cho vic port sang mt h nhng
khc. Ngi dng khng cn c kin thc su v FAT vn c th s dng FatFS
vo h thng ca mnh.
Giao tip vi th MMC/SD
Th MMC/SD c 4 ch hot ng l: InActive, Card Identification, Data
Transfer, Interrupt. Thng thng th s hot ng hai ch Card
Identification v Data Transfer.
giao tip trao i d liu vi th MMC/SD, vi iu khin phi pht lnh iu
khin xung th. nh dng lnh MMC c t chc gm 48 bit nh sau
V tr bit 47 46 [45-40] [39-8] [7-1] 0
ln 1 1 6 32 7 1
Gi tr 0 1 x x x 1
M t Start bit Transmission bit Command index Argument CRC7 End bit
ch SPI, checksum lun c gi tr l 0xFE ngoi tr lc khi ng v lc ny
tnh nng tnh checksum vn cn hot ng. Khi nhn lnh t vi iu khin, th
MMC/SD lun tr li li bng 1 byte. Nu gi tr tr v l 0xFF c ngha l th
bn.
Cc lnh MMC/SD thng gp
M
lnh
K hiu M t
CMD0 GO_IDLE_STATE Reset th v trng thi idle
CMD1 SEND_OP_CODE
Yu cu th gi ni dung thng tin ca
Operating Condition Regiters
CMD8 SEND_EXT_CSD
Yu cu th gi thng tin cc thanh ghi
CSD(Card Specific Data) di dng
block d liu.

CMD9 SEND_CSD
Yu cu th gi thng tin c th ca
thanh ghi CSD.

CMD10 SEND_CID
Yu cu gi cc thng tin CID(Card
Information Data).

CMD12 STOP_TRANSMISSION Ngng trao i d liu
CMD16 SET_BLOCKLEN
Thit lp ln tnh theo byte ca mt
block d liu, gi tr mc ny c lu
trong CSD

CMD17 READ_SINGLE_BLOCK c mt block d liu
CMD18 READ_MULTIPLE_BLOCK
c nhiu block d liu. S lng block
c thit lp bi lnh CMD23

CMD23 SET_BLOCK_COUNT
Thit lp s lng block d liu ghi
hoc c.

CMD24 WRITE_BLOCK Ghi mt block d liu.
CMD25 WRITE_MULTIPLE_BLOCK
Ghi nhiu block d liu. S lng block
c thit lp bi lnh CMD23

CMD55 APP_CMD
Thng bo cho th nh lnh tip theo l
lnh ring ca ng dng ch khng phi
l lnh chun ca MMC.


Porting FatFS vo board STM32-GEM3M-2
Nh phn tch trn, chng ta ch cn ch vo 5 hm giao din vi th
MMC/SD ca FatFS.
Cc hm ny s trc tip gi n cc hm iu khin phn cng ta thng hay gi
l driver trao i d liu trc tip vi th.
(*): disk_status khng cn thit phi ci t.
Nh vy chng ta ch cn ci t cc hm khi Driver ph hp vi phn cng
ca board STM32-GEM3M-2 l c.
+ hm power_on(): nhim v hm ny l thit lp cc chn tn hiu ra ca STM32
cho ph hp vi kt ni SPI ti th.
+ hm power_off(): gii phng cc thit lp trong hm power_on().
+ hm send_cmd(): gi lnh xung th theo ng nh dng lnh MMC/SD c
m t trong bng 1.
/* Send command packet */
xmit_spi(cmd); /* Start + Command index */
xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */
xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */
xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */
xmit_spi((BYTE)arg); /* Argument[7..0] */
n = 001; /* Dummy CRC + Stop */
if (cmd == CMD0) n = 095; /* Valid CRC for CMD0(0) */
if (cmd == CMD8) n = 087; /* Valid CRC for CMD8(0x1AA) */
xmit_spi(n);

+ hm xmit_datablock(): gi mt khi d liu xung

xmit_spi(token); /* Xmit data token */
if (token != 0xFD) { /* Is data token */
wc = 0;
do { /* Xmit the 512 byte data block to MMC */
xmit_spi(*buff++);
xmit_spi(*buff++);
} while (wc);
xmit_spi(0xFF); /* CRC (Dummy) */
xmit_spi(0xFF);
resp = rcvr_spi(); /* Reveive data response */
if ((resp & 0x1F) != 005) /* If not accepted, return with error */
return 0;
}

+ hm rcvr_datablock():
do { /* Wait for data packet in timeout of 200ms */
token = rcvr_spi();
#ifdef SUPPORT_TIMEOUT
} while ((token == 0xFF) && Timer1);
#else
} while ((token == 0xFF));
#endif
if(token != 0xFE)
return 0; /* If not valid data token, retutn with error */
do { /* Receive the data block into buffer */
rcvr_spi_m(buff++);
rcvr_spi_m(buff++);
rcvr_spi_m(buff++);
rcvr_spi_m(buff++);
} while (btr -= 4);
rcvr_spi(); /* Discard CRC */
rcvr_spi();

Trc khi nhn d liu, kim tra xem th MMC/SD c ang bn hay khng
+ hm xmit_spi():
#define SPI_SD SPI1
#define xmit_spi(dat) sd_raw_rw_spi(dat)
BYTE sd_raw_rw_spi(BYTE b_data)
{
BYTE Data = 0;
/* Wait until the transmit buffer is empty */
//while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* Send the byte */
SPI_I2S_SendData(SPI_SD, b_data);
/* Wait until a data is received */
while (SPI_I2S_GetFlagStatus(SPI_SD, SPI_I2S_FLAG_RXNE) == RESET);
/* Get the received data */
Data = SPI_I2S_ReceiveData(SPI_SD);
/* Return the shifted data */
return Data;
}
+ hm rcvr_spi():
static
BYTE rcvr_spi (void)
{
return sd_raw_rw_spi(0xFF);
}
Kt lun
FatFS vi m ngun nh gn, r rng cung cp kh nng tuyt vi truy cp file
di nh dng FAT. Kin trc ca FatFS rt ph hp vi cc ng dng nhng,
tnh kh chuyn(port) cho php ngi pht trin s dng li m ngun trn nhiu
nn tng phn cng khc nhau. Ngi lp trnh khng cn phi hiu r v nh
dng FAT vn c th s dng thnh tho b m ngun ny trong cc ng dng c
iu khin th MMC/SD ca mnh. y chnh l li ch ln nht ca cc
middleware nh FatFS
4. Lp trnh I/O trn th nh
Hin nay, h thng file FAT (DOS) c ly lm chun nh dng cho th nh
flash. Bn c th dng mt con vi iu khin c v ghi file trn mt th nh
SD hay MMC vi h thng FAT.



Hnh 01
c hay ghi file trn th, u tin chng ta phi khi to th nh. on code
sau y thc hin vic ny.
boolean initializeMemCard(void)
{
MEM_CS = HIGH;
for(i= 0; i < 10; i++)
{
spi_put(0xFF);
}
MEM_CS = LOW;
send_command(040,0,0,0,095);
if(card_response(001))
{
i = 255;
do
{
send_command(041,0,0,0,0,0xFF);
i;
} while (!card_response(000) && i > 0);
MEM_CS = HIGH;
spi_put(0xFF);
if(i == 0)
{
return false;
}
return true;
}
return false;
}
Code 01

Ch : MEM_CS chnh l tn hiu chip select cho th nh.
Ti hm khi to iniializeMemCard trong Code 1, dng u tin s disable th nh
bng cch t bin MEM_CS v gi tr HIGH. Tip theo, mt vng lp s m bo
rng th nh c thi gian hon thnh qu trnh khi ng. Lnh spi_put
(byte x) s truyn tham s vo chn SDI ca th nh. Trong vng lp ny, tham s
x phi c gi tr 0xFF th nh khi ng thnh cng. Sau bin MEM_CS
c thit lp thnh LOW v lnh 040 (a th nh v trng thi rnh ri) c
gi vi cc tham s ln lt l 0, 0, 0, 0 v 095 (gi tr CRC). y l lc duy
nht gi tr CRC quan trng, v sau khi card vo ch SPI, CRC s khng cn
thit na.
Lnh send_command (byte cmd, byte arg1, byte arg2, byte arg3, byte arg4, byte
CRC) s truyn 6 tham s ca n bng cch gi lnh spi_put (byte x) 6 ln.
Dng code tip theo gi hm card_reponse (byte x) i tn hiu tr li thch
hp t th nh. Hm ny s gi lin tc lnh spi_get () v i token tr v. Nu
token = 001 th hm tr v true, nu sau mt s ln lp li token vn khc 001
th hm s tr v false. a card ra khi trng thi rnh ri, lnh 041 s c
gi lin tc cho n khi nhn c tn hiu tr li thch hp. Nu sau 255 ln lp
li m vn khng thnh cng, hm initializeMemCard s tr v false.
Sau khi c tn hiu tr li thch hp, bin MEM_CS li c thit lp bng HIGH
v mt byte s c gi i, to ra thm 8 chu k ng h th nh hon tt vic
khi ng. Ch rng cc chu k ng h ny cn thit i vi tt c cc lnh.
n y, chng ta tm tt c cc bc ca tin trnh khi ng ca th nh
(cc tin trnh khc cng tng t):
1. t bin MEM_CS=LOW.
2. Gi lnh (1 byte lnh, 4 byte thams, 1 byte CRC).
3. i mt byte tr li t th nh.
4. Ch nhn mt data token (thao tc c) hay gi data token (thao tc ghi).
5. Gi hay nhn mt khi d liu.
6. Nhn 2 byte thng tin kim tra li.
7. t bin MEM_CS=HIGH.
8. To thm 8 chu k ng h th nh hon tt thao tc.
Bc 5 v 6 khng xut hin trong tin trnh khi ng, nhng l bc chnh
trong cc thao tc c v ghi. Ch l th nh nn t ng khi to kch thc
khi d liu 512 byte nh kch thc sector ca FAT.
Lnh Byte
code
Response
byte
Data token
nhn
Data token
chuyn
Khi to v a th vo
trng thi rnh ri
040 001
a th ra khi trng thi
rnh ri
041 000
c d liu 051 000 0xFE
Ghi d liu 058 000 8 chu k ng
h, 0xFE
t di khi d liu 050 000
Bng 01
Bng trn lit k tt c cc gi tr lnh cn thit thao tc vi h thng FAT. Mc
d th nh h tr ch c mt khi mt ln v c nhiu khi mt ln nhng
chng ta hy cng tm hiu vic c mt khi 512 byte (gi lnh c 051).
Phi m bo rng tham s a ch c nh dng thch hp cho thao tc c, ghi.
V d, nu ta mun c sector th 2005, 4 byte a ch tham s phi l 000, 0x0F,
0xA8, 000 v sector c nh s khi u bng 0. Sector 2004 c a ch
0x000FA800, c xc nh nh sau:
(2,005-1)x512= 1,024,048 = 0x000FA800.
Ch rng nh dng a ch ca SD/MMC l kiu big endian. on code trong
Code 2 s c sector 2004 trong th nh. on ny gn tng t vi on khi to
th. Khc bit ng ch l vic gi thm hm card_response (byte x) ln th 2
vi tham s c gi tr 0xFE chnh l data token. Tt c d liu c trao i qua
card u bt u vi data token ny. 512 ln gi hm spi_get() trong vng lp s
in y gi tr ca sector 2004 vo buffer. Hai ln gi thm hm spi_get() s c
cc byte CRC khng c dng ti c nh km vo cc khi d liu gi bi
th nh.
unsigned char buf[512];
boolean read_sector(void)
{
unsigned short i;
boolean retval = false;
MEM_CS = LOW;
send_comman(051,0,0x0F,xA8,0,0xFF);
if(card_response(000))
{
if(card_response(0xFE))
{
for(i = 0; i < 512; i++)
{
buf[i] = spi_get();
}
spi_get();
spi_get();
retval = true;
}
MEM_CS = HIGH;
spi_put(0xFF);
}
return retval;
}
Code 02

Vic ghi d liu cng tng t nh vic c, im khc nhau duy nht ch l
hng i ca d liu. Trong thao tc c, th nh cung cp data token v d liu
cn trong thao tc ghi, b vi iu khin chu trch nhim ny. ghi mt khi d
liu, bn cn gi lnh ghi (058) cng vi a ch ng nh dng, ch byte tr li,
to ra 8 chu k ng h, gi data token, v bt u gi d liu. Ch ng qun 2
byte CRC cui cng nh vo khi d liu. Khng ging thao tc c, thao tc
ghi bn phi m bo th nh hon tt vic ghi sau khi bn gi d liu.
thc hin vic ny, ta cn kim tra byte tr li xut ra t th nh. Hm
checkWriteState() gi lp li nhiu ln hm spi_get() trong khi ch data token
005. Khi c data token ny ri, byte khc 0 u tin c c t hm spi_get()
s bo hiu hon tt.

V D V FAT



Hnh 02
Hy xem xt 2 v d v c v ghi file trn mt th nh. Gi s chng ta ang lm
vic vi th c nh dng FAT 16. Trn mt a c nh dng theo FAT 16 s
c khong 65,000 v tr nh. Mt th nh c nh dng nh mt a cng vi
mt phn vng (phn vng DOS chnh). Nh hnh 2, sector u tin (512 byte) ca
th nh cha MBR (master boot record). Phn vng FAT (phn vng DOS chnh)
tip theo ngay pha sau. Phn vng ny bt u bng mt vi sector dnh vi
sector u tin l boot record (khng c nhm vi MBR), 1 hoc 2 bng FAT
v mt bng th mc gc (root directory table). Vng d liu tht s nm ngay
pha sau bng th mc gc, c b tr thnh tng nhm cc sector gi l cluster.
Khng gian lu tr c gn cho cc file theo tng cluster. MBR cha mt trnh
np nh (boot strap loader) v bng th mc. Trong mt a cng tht s, trnh np
s tm v chy trnh np th 2 trong boot record ca phn vng chnh (primary
partition). Trong mt th nh, MBR vn cha chng trnh mi chnh, nhng my
tnh ch dng thng tin t bng th mc.
C FILE
Byte th 0 7 8 10 11 25 26 27 28 31
File 1 Tn file Phn m rng Thuc tnh, ngy Cluster u Kch thc
File 2 Tn file Phn m rng Thuc tnh, ngy Cluster u Kch thc

File n Tn file Phn m rng Thuc tnh, ngy Cluster u Kch thc
Bng 02
Chng ta s xem xt vic c mt file hello.txt cha trong th mc gc v a ni
dung ca n (Hello World) vo mt mng k t. Bn c th th nghim v d ny
bng cch to file c ni dung Hello World, lu file vo th mc gc ca th
nh. c file, bn phi xc nh mc nhp ca file trong bng th mc gc
ngay pha sau 2 bng FAT (xem hnh 2). Bng th mc gc c cu trc dng bng
(xem bng 2), mi mt dng 32 byte tng ng vi mt mc nhp file. Mt vi
dng s trng hay tr v cc file b xa. Cc ct trong bng s cung cp cc
thng tin v file. Ct u tin l tn file, ct th 2 ch phn m rng, khng bao
gm du chm (FAT 16 c tn file dng 8.3). Ct k cui ch ra cluster u tin
cha d liu file v ct cui cng xc nh kch thc file theo byte (nh dng
little endian). Cc ct khc (byte 11 25) cha cc thng tin khc nh ngy gi
to, thay i file.
xc nh file hello.txt, tm tn file v phn m rng trong bng th mc gc. V
bng th mc gc cng ch l d liu cha trong b nh, bn c th c thng tin
t bng th mc theo tng sector dng hm read_sector(). Sector u tin trong
phn vng FAT l boot record, cha cc tham s cho ta bit v tri ca sector u
tin ca bng th mc gc. Ngoi ra ta cng bit chiu di ca mi dng trong
bng th mc, nh vy s d dng tm ra file hello.txt. Hm ny s tr v dng
cha mc nhp ca file. Nu khng tm ra, c ngha l file khng tn ti trong th
nh. Trong bng th mc gc, k t u tin trong tn mt file b xa c thay
th bng mt k t c bit. Dng u tin bt u bng byte c gi tr 000 ch ra
rng s khng c dng tip theo no c dng. V th, tr khi th mc gc cha
ti a s file n c th, cng vic tm kim c th dng li m khng cn phi c
n dng cui cng ca bng. Gi s chng ta bit c dng tng ng vi
mc nhp file hello.txt. Bn c th c 2 byte t ct cha s cluster u tin theo
nh dng litle endian xc nh xem d liu bt u t u. Bn cng c th c
ct kch thc file bit kch thc file. bt u c ni dung file, bn phi
xc nh c sector u tin ca cluster u tin. Boot record c cha mt tham
s cho chng ta bit c bao nhiu sector trong mt cluster. y l thng tin c
xc nh khi a c dnh dng. Cluster cng ln th bng FAT cng nh nhng
s dn n vic lng ph vng nh i vi cc file khng dng ht d khng gian
nh cluster cui cng ca file. Vng d liu nm ngay sau bng th mc gc, v
th bn c th xc nh sector u tin ca cluster u tin theo cch sau:
Nu ct cluster u tin trong bng th mc ca file hello.txt cha s 107 th
cluster 107 s l ni bt u cha d liu cho file (Cluster u tin ca vng d
liu l cluster 2 v mc nhp s 0 v 1 dnh cho thng tin bng FAT nh hnh
2). Gi s rng mi cluster c 4 sector. C ngha l file bt u ti sector s:
(Sector u ca vng d liu) + [(cluster u - 2) x (s sector trn mt cluster)]
Trong , sector u ca vng d liu c tnh ton vi tham s trong MBR
xc nh v tr bt u ca phn vng FAT, sau dng tham s ca boot record
xc nh v tr bt u ca vng d liu.
Tr li vi file hello.txt, gi s rng file di 12 byte. C ngha l ton b d liu
ca file cha trong mt cluster u tin (c th l trong sector u tin). By
gi hm read_sector() c th c d liu ca file vo b vi iu khin. Tt c cc
byte sau byte th 12 c b qua.
Nu bn thay i file hello.txt n cha 1000 dng Hello World!. Ni dung
ca file lc ny s khng cha trong 1 cluster. Lm th no bn xc nh c
phn cn li ca file nm u? Cu tr li nm trong bng FAT. Sau khi c d
liu t cluster 107, bn s vo mc nhp 107 trong bng FAT c xem cluster
tip theo l s bao nhiu. C th c 2 bng FAT ging ht nh nhau trn th nh
(xem hnh 2). Boot record cha cc tham s cho bn bit c bao nhiu bng FAT,
di mi bng FAT v v tr bt u ca bng FAT u tin so vi boot record.
Mi mc nhp trong FAT 16 l mt s 16 bit (nh dng little endian), nn mc
nhp 107 s nm ti byte 214 v 215 ca sector u tin ca mi bng FAT. Nhiu
bng FAT cng hin din trn th nh c th phc hi nu h thng file gp s
c. Cu trc bng FAT n gin, nhng b li khng tt lm trong vic chu li.
Nu my tnh gp s c mt in khi bn ang cp nht bng FAT th bn c th
s mt v tr d liu tip theo ca mt s ln file. Mi bng FAT c cp nht
ring r, v th ch c mt bng FAT b hng khi gp s c. Cc dch v CHKDSK
hay SCANDSK ca h iu hnh c gng ti thiu ha chuyn mt mt d liu
bng cch phc hi ti a thng tin t bng FAT cn li khng b h. tm
cluster tip theo ca file, c sector tng ng (thng t bng FAT u tin)
bng hm read_sector() v ly d liu cn thit. Gi s mc nhp 107 trong bng
FAT cha gi tr 489. C ngha l khi d liu tip theo ca file nm ti cluster
489. C nh vy ta s tm ra dn dn cc khi d liu tip theo ca file. Ta s bit
khi no ht d liu ca file v ta c thng tin v di ca file, hn na khi
mt mc nhp ca file trong bng FAT cha gi tr t 0xFFF8 n 0xFFFF th c
ngha l file khng cn cluster no theo sau na.
GHI FILE
v d th 2 chng ta s to file goodbye.txt trong th mc gc vi ni dung
Goodbye World!. u tin, bn cn tm mt dng cn dng c trong bng th
mc gc to mc nhp mi. Bn c th lm iu ny bng cch tm mt mc
nhp c tn file bt u vi k t 0xE5 hay 000, tng ng vi file b xa
hoc l mc nhp cha dng. Sau khi tm c mc nhp ta s ghi vo mc nhp
tn file, phn m rng, thi gian to file v cc thuc tnh ca file. Trng thuc
tnh ti byte th 11 cha mt s c bit, trong c mt c ch ra rng y l file
hay l mt th mc con. Khi to mt file bnh thng, bn phi t gi tr cho
trng thuc tnh l 020. Mt iu rc ri l bn cn phi ghi vo bng th mc
ny v tr cluster u tin ca file. C 2 trng hp phi xem xt. Trng hp u
tin l ta ang dng li mc nhp ca mt file b xa. V tr cluster u tin v ton
b chui gi tr trong FAT (ca file b xa) vn khng b thay i. Bn c th
ghi d liu ln cc cluster ny. Nu file mi to di hn file c b xa th ta
thm cluster vo. Ni thm v trng hp file b xa: gim thiu cc tc v I/O
khi mt file no b xa, ch mt k t u tin ca tn file b chuyn thnh
0xE5. Phn thng tin cn li trong bng th mc khng thay i. y l l do ti
sao file c th c phc hi. Trng hp th 2 l ta dng mt mc nhp mi
trong bng th mc gc, nh vy ta cn phi tm mt cluster trng. tm mt
cluster trng, ta ch cn duyt FAT bng cch c tng sector mt v tm mt mc
nhp c gi tr 00000. Sau khi tm c, i gi tr ca n thnh 0xFFFF bo
hiu y l ni kt thc file, v ghi li v tr ny vo trng v tr cluster u tin
trong bng th mc gc. Vi v tr ca cluster trng cho file goodbye.txt, bn c
th bt u ghi ni dung ca file (Goodbye World!). Bn t nht phi ghi vo
sector u tin ca cluster. t chui cn ghi vo mt mng k t 512 byte ri
dng hm write_sector() ghi vo th nh. Vic mng k t cha g sau k t
cui cng cn ghi khng quan trng. Chng ta bit rng ni dung file goodbye.txt
c th c cha hon ton trong sector u tin ca mt cluster nn ta khng cn
vit vo cc sector tip theo na.
Sau khi thm ni dung vo file, cp nht trng kch thc file trong bng th
mc. ng thi ta cng nn cp nht thi gian truy cp/thay i file. Nu mt file
tng kch thc v cn thm cluster cha, mt cluster trng mi cn c xc
nh trong bng FAT. V tri ca cluster trng ny s c ghi vo mc nhp ca
cluster trc ca file trong bng FAT, v gi tr ca mc nhp cho cluster cui
cng ca file s l 0xFFFF xc nh y l cluster kt thc ca file. V th, mt
chui mc nhp trong FAT c th ko di mi cho n khi cn cluster trng.
int main(void)
{
signed int stringSize;
signed char handle;
char stringBuf[100];
cpu_init(); //Initialize the CPU clocks, etc.
eint(); //Enable global interrupts (if required).
fat_initialize(); //Initialize the FAT library.
handle = fat_openRead(hello.txt);
if (handle >= 0)
{
stringSize = fat_read(handle, stringBuf, 99);
stringBuf[stringSize] = ;
lcd_print(stringBuf);
fat_close(handle);
}
handle = fat_openWrite(goodbye.txt);
if (handle >= 0)
{
strcpy(stringBuf, Goodbye World!);
stringSize = strlen(stringBuf);
fat_write(handle,stringBuf, stringSize);
fat_flush(); //Optional.
fat_close(handle);
}
while (1)
{
//Stay here.
}
}

Code 03
V d:
on code trn s c 12 k t u tin t file hello.txt trong th mc gc. Sau
chng trnh in cc k t ra mn hnh LCD (dng ch Hello World!). Tip n
chng trnh s to file goodbye.txt v ghi Goodbye Worlds! vo file. Khi
chng trnh kt thc, bn c th gn th nh ca bn vo bt k u c th nh
chun no v bn s thy file goodbye.txt trong th

Anda mungkin juga menyukai