Hoc Lap Trinh Arm

download Hoc Lap Trinh Arm

of 25

description

great

Transcript of Hoc Lap Trinh Arm

  • 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