




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、LaunchPad 口袋實(shí)驗(yàn)平臺(tái)口袋實(shí)驗(yàn)平臺(tái) MSP-EXP430G2篇篇1第第4講講 自校驗(yàn)自校驗(yàn)DCO頻率頻率24.1 普林斯頓結(jié)構(gòu)普林斯頓結(jié)構(gòu) 普林斯頓結(jié)構(gòu)處理器的RAM和ROM統(tǒng)一編址,共用地址總線和數(shù)據(jù)總線。34.2 Flash4存儲(chǔ)器FLASH NAND讀一個(gè)扇區(qū)擦寫(xiě)一個(gè)扇區(qū)NOR隨便讀擦寫(xiě)一段SRAM隨便讀隨便寫(xiě)4.3 Flash 控制器控制器 對(duì)Flash進(jìn)行讀操作無(wú)需任何硬件支持,就是讀普通ROM。 對(duì)Flash寫(xiě)操作需要MSP430內(nèi)部集成了Flash控制器。 Flash編程時(shí)鐘:寫(xiě)太快不可靠,寫(xiě)太慢壽命低。5 Flash編程高壓發(fā)生器 擦鞋F(xiàn)lash需要比讀取Flash更
2、高的電壓。 如圖是Flash按字節(jié)寫(xiě)入時(shí)序過(guò)程。64.4 利用利用Flash進(jìn)行掉電不失存儲(chǔ)進(jìn)行掉電不失存儲(chǔ)7備份原數(shù)據(jù)段擦除全段數(shù)據(jù)寫(xiě)入目標(biāo)數(shù)據(jù)還原其他數(shù)據(jù) 整段擦除為“1” 擦前備份擦 按字節(jié)寫(xiě)為“0” 重復(fù)寫(xiě)無(wú)效寫(xiě)4.5 Flash操作庫(kù)函數(shù)操作庫(kù)函數(shù)全局變量SegAddr,SegPre直接寫(xiě)字函數(shù)Flash_Direct_WriteWord()備份寫(xiě)字節(jié)函數(shù)Flash_Bak_WriteChar()初始化函數(shù)Flash_Init( )段擦除函數(shù)Flash_Erase()8初始化函數(shù)初始化函數(shù)Flash_Init( )/* 名 稱(chēng):Flash_Init()* 功 能:對(duì)Flash時(shí)鐘進(jìn)行
3、初始化設(shè)置* 入口參數(shù):Div:根據(jù)SMCLK頻率計(jì)算的所需分頻值,可設(shè)定為1-64* Seg:段號(hào),可設(shè)為0-31或”A、B、C、D。* 出口參數(shù):1:配置成功* 0:配置失敗* 說(shuō) 明:操作Flash其他函數(shù)前,需要調(diào)用該初始化函數(shù)設(shè)置時(shí)鐘分頻和待操作段首地址。* 其他函數(shù)中均不出現(xiàn)絕對(duì)地址,防止誤操作。* 范 例: Flash_Init(3,B ) 3分頻、對(duì)Info B段操作*/unsigned char Flash_Init(unsigned char Div,unsigned char Seg )/-設(shè)置Flash的時(shí)鐘和分頻,分頻為恰好為最低位,直接用Div-1即可-if(Div
4、64) Div=64;FCTL2 = FWKEY + FSSEL_2 + Div-1; / 默認(rèn)使用SMCLK,分頻系數(shù)參數(shù)傳入9初始化函數(shù)初始化函數(shù)Flash_Init( )/-操作對(duì)象為主Flash段的情況,可通過(guò)512的倍數(shù)設(shè)置段起始地址-SegPre = Seg;/獲取當(dāng)前段if (Seg = 31) /判斷是否處于主Flash段SegAddr=0 xFFFF-(Seg+1)*512+1; /計(jì)算段起始地址 return(1);/賦值成功后即可退出并返回成功標(biāo)志”1“/-操作對(duì)象為信息Flash段的情況,窮舉即可-switch(Seg) /判斷是否處于信息Flash段case A: c
5、asea: SegAddr=0 x10C0; break;case B: caseb: SegAddr=0 x1080; break;case C: casec: SegAddr=0 x1040; break;case D: cased: SegAddr=0 x1000; break;default: SegAddr=0 x20FF;return(0); /0 x20FF地址為空白區(qū),保護(hù)Flashreturn(1);10擦除函數(shù)擦除函數(shù)Flash_Erase()* 名 稱(chēng):Flash_Erase()* 功 能:擦除Flash的一個(gè)數(shù)據(jù)塊,擦寫(xiě)段由初始化函數(shù) Flash_Init()的SegA
6、ddr變量決定*/void Flash_Erase() unsigned char *Ptr_SegAddr; /Segment pointer Ptr_SegAddr = (unsigned char *)SegAddr; /Initialize Flash pointer FCTL1 = FWKEY + ERASE; /段擦除模式 FCTL3 = FWKEY; /解鎖 /FCTL3 = FWKEY+LOCKA; /對(duì)InfoFlashA也解鎖 _disable_interrupts(); *Ptr_SegAddr = 0; /擦除待操作段 while(FCTL3&BUSY); /B
7、usy _enable_interrupts(); FCTL1 = FWKEY; /取消擦模式 FCTL3 = FWKEY+LOCK; /上鎖/ FCTL3 = FWKEY+LOCK+LOCKA; /對(duì)InfoFlashA也上鎖11Flash_Direct_WriteWord()/* 名 稱(chēng):Flash_Direct_WriteWord()* 功 能:強(qiáng)行向Flash中寫(xiě)入一個(gè)字型變量,而不管存儲(chǔ)位置是否事先擦除* 入口參數(shù):Addr:存放數(shù)據(jù)的偏移地址,仍按字節(jié)計(jì)算,需為偶數(shù) Data:待寫(xiě)入的數(shù)據(jù)* 出口參數(shù):返回出錯(cuò)信息 0:偏移溢出 ;1:正常工作* 范 例:Flash_Direct_
8、WriteWord(0,123);將常數(shù)123寫(xiě)入0單元 Flash_Direct_WriteWord(2,a);將整型變量a寫(xiě)入2單元*/char Flash_Direct_WriteWord (unsigned int Addr,unsigned int Data)unsigned int temp=0;unsigned int *Ptr_SegAddr; /Segment pointer /- 段范圍限定。為了內(nèi)存管理安全,只允許本段操作-if(SegPre=512) |(SegPre31&Addr=64) ) return 0;12Flash_Direct_WriteWord(
9、)13 return 0;temp=SegAddr+Addr;Ptr_SegAddr = (unsigned int *)temp; /Initialize Flash pointerFCTL1=FWKEY+WRT; /正常寫(xiě)狀態(tài)FCTL3=FWKEY;/解除鎖定/FCTL3=FWKEY+LOCKA; /解除鎖定(包括A段)_disable_interrupts(); /關(guān)總中斷*Ptr_SegAddr=Data;while(FCTL3&BUSY); /等待操作完成_enable_interrupts(); /開(kāi)總中斷FCTL1=FWKEY; /退出寫(xiě)狀態(tài)FCTL3=FWKEY+LOC
10、K; /恢復(fù)鎖定,保護(hù)數(shù)據(jù)/FCTL3=FWKEY+LOCK+LOCKA; /恢復(fù)鎖定,保護(hù)數(shù)據(jù)(包括A段) return 1;備份擦寫(xiě)字節(jié)函數(shù)備份擦寫(xiě)字節(jié)函數(shù)Flash_Bak_WriteChar()/* 名 稱(chēng):Flash_Bak_WriteChar()* 功 能:不破壞段內(nèi)其他數(shù)據(jù),向Flash中寫(xiě)入一個(gè)字節(jié)(Char型變量)* 入口參數(shù):Addr:存放數(shù)據(jù)的地址 Data:待寫(xiě)入的數(shù)據(jù)* 出口參數(shù):返回出錯(cuò)信息 0:偏移溢出 ;1:正常工作* 范 例:Flash_Bak_WriteChar(0,123);將常數(shù)123寫(xiě)入0單元 Flash_Bak_WriteChar(1,a);將變量a
11、寫(xiě)入1單元*/char Flash_Bak_WriteChar (unsigned char Addr,unsigned char Data)unsigned int temp=0;unsigned char *Ptr_SegAddr; /Segment pointerunsigned char BackupArray64;/開(kāi)辟64字節(jié)的臨時(shí)RAM備份Segunsigned char i = 0; /- 段范圍限定。為了內(nèi)存管理安全,只允許本段操作-if(SegPre=512) | (SegPre31&Addr64) ) return 0;14for(i=0;i64;i+) temp
12、=SegAddr+i; Ptr_SegAddr = (unsigned char *)temp; /Initialize Flash pointer BackupArrayi=*Ptr_SegAddr;/指針移位方法賦值Flash_Erase(); /擦除待操作段FCTL1 = FWKEY + WRT; /正常寫(xiě)入(非塊寫(xiě))FCTL3 = FWKEY ; /解鎖/FCTL3 = FWKEY ; /解鎖(含A段)for (i=0; i64; i+)_disable_interrupts(); /關(guān)總中斷if(i=Addr) temp=SegAddr+Addr;15備份擦寫(xiě)字節(jié)函數(shù)備份擦寫(xiě)字節(jié)函數(shù)
13、Flash_Bak_WriteChar()16備份擦寫(xiě)字節(jié)函數(shù)備份擦寫(xiě)字節(jié)函數(shù)Flash_Bak_WriteChar()Ptr_SegAddr = (unsigned char *)temp; /Initialize Flash pointer *Ptr_SegAddr =Data; /寫(xiě)數(shù)據(jù) while(FCTL3&BUSY); /等待寫(xiě)操作完成 else temp=SegAddr+i; Ptr_SegAddr = (unsigned char *)temp; /Initialize Flash pointer *Ptr_SegAddr = BackupArrayi; /恢復(fù)Flas
14、h內(nèi)的其他數(shù)據(jù) while(FCTL3&BUSY); /等待寫(xiě)操作完成_enable_interrupts();/開(kāi)總中斷FCTL1 = FWKEY; /清除寫(xiě)FCTL3 = FWKEY + LOCK; /上鎖 / FCTL3 = FWKEY + LOCK; /上鎖(含A段) return 1;4.6 DCO測(cè)頻原理測(cè)頻原理1725535/1615961.6DCOfmskHzMHz4.7 VLO測(cè)頻原理測(cè)頻原理 基于上次TAR值25535我們可以求得:1832.768(25535/ 45535)18.376VLOfkHzkHz4.8 自校驗(yàn)自校驗(yàn)DCO輸出頻率輸出頻率f 窮舉DCO參數(shù)
15、設(shè)置,測(cè)出實(shí)際頻率,即可完成校驗(yàn)。 4位RSELx:16個(gè)檔位,每檔頻率步進(jìn)約35%(不靠譜),可看成粗調(diào)。 3位DCOx:8個(gè)檔位,每檔頻率步進(jìn)約8%(不靠譜),可看成細(xì)調(diào)。 5位MODx:32個(gè)檔位,每檔步進(jìn) ,可看成微調(diào)。19321xxDCODCO確定確定RSELx與與DCOx20MODx=0 先不微調(diào)RSELx DCOx 共128種組合測(cè)出所有頻率 WDT定時(shí) TA計(jì)數(shù)存入Tempi 由i可反推出 RSELx DCOx 得到全部Temp數(shù)據(jù)后,找出最接近f但小于的f的tempi 比如是Temp35,這樣我們就知道了RSELx=35/8=4,DCOx=35%8=3。確定確定MODx 固定
16、RSELx=4、DCOx=3,依次增加MODx的值,找到最接近f時(shí)的MODx值,比如說(shuō)是12。 那么f對(duì)應(yīng)的DCO參數(shù)就是RSELx=4、DCOx=3、 MODx=12。 仿照出廠校驗(yàn)的做法,將3個(gè)參數(shù)存在infoFLash中。21RSELx=4 DCOx=3遞增MODx 共32種值測(cè)出所有頻率 WDT定時(shí) TA計(jì)數(shù)找到MODx 存入infoFlash4.9 自校驗(yàn)自校驗(yàn)DCO例程例程22 自校準(zhǔn)1-16MHz共16個(gè)DCO配置參數(shù)(RSELx,DCOx,MODx),將參數(shù)寫(xiě)入InfoFlashB段中,調(diào)取校驗(yàn)參數(shù),循環(huán)輸出DCO的16個(gè)頻率供觀測(cè)。主函數(shù)主函數(shù)void main(void)W
17、DTCTL = WDTPW + WDTHOLD; /關(guān)狗/-在P1.4上輸出SMCLK,這樣可以全程用示波器和頻率計(jì)觀測(cè)DCO-P1SEL |= BIT4; P1DIR |= BIT4;/-初始化TA,開(kāi)啟WDT中斷使能-TA0CTL = TASSEL_2+MC_2+TACLR; / SMCLK時(shí)鐘源,連續(xù)計(jì)數(shù)開(kāi)始IE1|=WDTIE; /開(kāi)啟WDT中斷 _enable_interrupts(); /等同_ENT,開(kāi)啟總中斷/-開(kāi)始DCO頻率校驗(yàn),只運(yùn)行一遍-Calibrate_Start(); /步驟1:紅燈亮,表示正在校驗(yàn)DCOMeasure_Temp(); /步驟2:自動(dòng)測(cè)量128個(gè)純凈
18、頻率Find_RSELx_DCOx_Winer(); /步驟3:從128個(gè)純凈頻率中,找出最接近預(yù)設(shè)頻率的那幾個(gè)Measure_MODx(); /步驟4:在最近接的純凈頻率基礎(chǔ)上,窮舉找到最優(yōu)的MODx設(shè)置Calculate_InfoFlash_Data();/步驟5:將最合適的頻率設(shè)定參數(shù)組合成校驗(yàn)數(shù)組Write_InfoFlashB();/步驟6:將校驗(yàn)數(shù)組寫(xiě)入InfoFlahB段Calibrate_Finish();/步驟7:綠燈亮,表示完成校驗(yàn)DCO/-完成DCO校驗(yàn),從Flash中定時(shí)取出校準(zhǔn)值,從P1.4輸出供測(cè)試-DCOTest(); /步驟8:循環(huán)輸出DCO各個(gè)校驗(yàn)頻率值,供觀
19、測(cè)231、點(diǎn)亮紅燈Calibrate_Start(); 2、測(cè)量128個(gè)“純凈”DCO頻率Measure_Temp();3、找出最接近的16個(gè)“純凈”頻率Find_RSELx_DCOx_Winer();4、找出最優(yōu)MODxMeasure_MODx()5、合成校驗(yàn)數(shù)組Calculate_InfoFlash_Data()6、寫(xiě)入FlashWrite_InfoFlashB()7、點(diǎn)亮綠燈Calibrate_Finish();8、循環(huán)輸出DCODCOTest()24流水賬作業(yè)變量和宏定義變量和宏定義#include MSP430G2553.h#include Flash.h#define CALDCO
20、_MHz(x) * (unsigned char *)(0 x1080+(x-1)*2) /*讀取InfoFlashB*/#define CALBC1_MHz(x) * (unsigned char *)(0 x1080+(x-1)*2+1)#define CAL_NUM 16 /*待校驗(yàn)頻率點(diǎn)總數(shù)*/unsigned int Temp128=0; /*存放實(shí)測(cè)的128個(gè)不含小數(shù)分頻MODx的“純凈”頻率*/unsigned char RSELx_DCOx_WinerCAL_NUM=0; /*存放校驗(yàn)出的SELx和DCOx值*/unsigned char MODx_WinerCAL_NUM=0
21、; /*存放校驗(yàn)出的MODx值*/unsigned int InfoFlash_DataCAL_NUM=0; /*待寫(xiě)入infoB中的校驗(yàn)頻率參數(shù)數(shù)組*/unsigned int Ture_FreqCAL_NUM=0; /*方便仿真時(shí)查看實(shí)測(cè)頻率值*/ -待校正的頻率,單位KHz-const unsigned int Calibrate_FrequenceCAL_NUM=1000,2000,3000,4000,5000,6000, 7000,8000,9000,10000,11000,12000,13000,14000,15000,16000;25 注意(x)的寫(xiě)法,實(shí)現(xiàn)宏定義“傳參”操作。
22、Temp(不帶MODx)和Ture_Freq(帶MODx)存儲(chǔ)的都是實(shí)際測(cè)量的頻率值1、點(diǎn)亮紅燈Calibrate_Start(); 2、測(cè)量128個(gè)“純凈”DCO頻率Measure_Temp();3、找出最接近的16個(gè)“純凈”頻率Find_RSELx_DCOx_Winer();4、找出最優(yōu)MODxMeasure_MODx()5、合成校驗(yàn)數(shù)組Calculate_InfoFlash_Data()6、寫(xiě)入FlashWrite_InfoFlashB()7、點(diǎn)亮綠燈Calibrate_Finish();循環(huán)輸出DCODCOTest()26流水賬作業(yè)開(kāi)始指示函數(shù)開(kāi)始指示函數(shù)Calibrate_Start
23、()/* * 名 稱(chēng):Calibrate_Start() * 功 能:紅色LED亮,表明正在校驗(yàn)中 * 說(shuō) 明:DCO校驗(yàn)的時(shí)間比較長(zhǎng),利用紅燈指示可以方便調(diào)試程序*/void Calibrate_Start() /步驟1:紅燈亮,表示正在校驗(yàn)DCOP1DIR |=BIT0+BIT6;P1OUT |= BIT0; /紅亮綠滅表示正在校驗(yàn)P1OUT &=BIT6;27 在很多時(shí)候,一個(gè)小小的LED可以給程序調(diào)試乃至設(shè)備維護(hù),故障排查帶來(lái)很大方便。 本例中,紅色LED亮表示校驗(yàn)正在進(jìn)行。1、點(diǎn)亮紅燈Calibrate_Start(); 2、測(cè)量128個(gè)“純凈”DCO頻率Measure_Te
24、mp();3、找出最接近的16個(gè)“純凈”頻率Find_RSELx_DCOx_Winer();4、找出最優(yōu)MODxMeasure_MODx()5、合成校驗(yàn)數(shù)組Calculate_InfoFlash_Data()6、寫(xiě)入FlashWrite_InfoFlashB()7、點(diǎn)亮綠燈Calibrate_Finish();循環(huán)輸出DCODCOTest()28流水賬作業(yè)測(cè)頻函數(shù)測(cè)頻函數(shù)Measure_Temp() * 名 稱(chēng):Measure_Temp() * 功 能:自動(dòng)依次測(cè)定128種純凈DCO的頻率,并存入Temp數(shù)組* 說(shuō) 明:純凈頻率是指MOD=0時(shí)的非混頻 */void Measure_Temp(
25、) /步驟2:自動(dòng)測(cè)量128個(gè)純凈頻率unsigned long Freq_Temp=0;unsigned char RSELx_DCOx_Num=0;for(RSELx_DCOx_Num=0;RSELx_DCOx_Num128;RSELx_DCOx_Num+) DCO_Set_Freq(RSELx_DCOx_Num,0);/-定時(shí)測(cè)頻代碼開(kāi)始-TA0CTL |=TACLR; /計(jì)數(shù)開(kāi)始WDTCTL=WDT_ADLY_1_9;/WDT定時(shí)長(zhǎng)度為精心選擇過(guò)的,20MHz計(jì)數(shù)到39063 _bis_SR_register(LPM0_bits); /CPU精確休眠1.9ms(1/512秒)WDTCT
26、L=WDTPW+WDTHOLD;Freq_Temp = TA0R; /讀取計(jì)數(shù),這個(gè)值就是DCO在1/512秒中斷區(qū)間的脈沖數(shù)/-定時(shí)測(cè)頻代碼結(jié)束-TempRSELx_DCOx_Num=(Freq_Temp)*512)/1000; /計(jì)算DCO準(zhǔn)確頻率29配置配置DCO的函數(shù)的函數(shù)DCO_Set_Freq()/* * 名 稱(chēng):DCO_Set_Freq() * 功 能:根據(jù)傳入?yún)?shù),設(shè)定DCO頻率 * 入口參數(shù):Num:Num的02位表示DCOx,36位表示RSELx modTemp:MODx參數(shù)* 說(shuō) 明:Num參數(shù)身兼二職,包含DCOx和RSELx的信息 * 范 例:DCO_Set_Freq
27、(10,5),表示將DCO設(shè)定為RSELx=1,DCOx=2,MODx=5*/void DCO_Set_Freq(unsigned char Num,unsigned char modTemp) /參數(shù)設(shè)定DCO頻率DCOCTL = (Num%8)5)+modTemp; /數(shù)據(jù)拆分BCSCTL1 &=0 x0F;BCSCTL1 |=Num/8;_delay_cycles(15000); /等待DCO頻率穩(wěn)定30WDT定時(shí)中斷服務(wù)子函數(shù)定時(shí)中斷服務(wù)子函數(shù)/* * 名 稱(chēng):WDT_ISR() * 功 能:響應(yīng)WDT定時(shí)中斷服務(wù)* 說(shuō) 明:程序內(nèi)部只有1句喚醒CPU代碼,這種寫(xiě)法即用到了WD
28、T的定時(shí)功能,同時(shí)避免將 * 大量代碼寫(xiě)入中斷服務(wù)函數(shù)中,影響程序的可讀性。*/#pragma vector=WDT_VECTOR_interrupt void WDT_ISR(void) _bic_SR_register_on_exit(LPM0_bits ); /退出中斷時(shí),喚醒CPU31 WDT定時(shí)中斷僅起到了延時(shí)喚醒的作用。1、點(diǎn)亮紅燈Calibrate_Start(); 2、測(cè)量128個(gè)“純凈”DCO頻率Measure_Temp();3、找出最接近的16個(gè)“純凈”頻率Find_RSELx_DCOx_Winer();4、找出最優(yōu)MODxMeasure_MODx()5、合成校驗(yàn)數(shù)組Cal
29、culate_InfoFlash_Data()6、寫(xiě)入FlashWrite_InfoFlashB()7、點(diǎn)亮綠燈Calibrate_Finish();循環(huán)輸出DCODCOTest()32流水賬作業(yè)比較函數(shù)比較函數(shù)Find_RSELx_DCOx_Winer()/* * 名 稱(chēng):Find_RSELx_DCOx_Winer() * 功 能:從128個(gè)Temp中,找出與16個(gè)校驗(yàn)頻率最接近的Temp的序號(hào)* 說(shuō) 明:Temp的序號(hào)里包含了RSELx和DCOx的取值信息*/void Find_RSELx_DCOx_Winer() /步驟3:從128個(gè)純凈頻率中,找出最接近d的預(yù)設(shè)頻unsigned ch
30、ar i=0;unsigned int Delta_Min=0;unsigned int Delta_Now=0;unsigned char Calibrate_Num=0;for(Calibrate_Num=0;Calibrate_NumCAL_NUM;Calibrate_Num+) Delta_Min=65530; /第一次比較時(shí),故意定一個(gè)大差值33比較函數(shù)比較函數(shù)Find_RSELx_DCOx_Winer() for(i=0;i128;i+) /-單方向取最小差值,一定要小于預(yù)設(shè)值- if(TempiCalibrate_FrequenceCalibrate_Num) Delta_Now
31、=Calibrate_FrequenceCalibrate_Num-Tempi; if (Delta_NowDelta_Min)/如果當(dāng)前差值比“世界記錄”還小時(shí) RSELx_DCOx_WinerCalibrate_Num=i;/新Winner誕生 Delta_Min=Delta_Now; /取代前“世界記錄” 341、點(diǎn)亮紅燈Calibrate_Start(); 2、測(cè)量128個(gè)“純凈”DCO頻率Measure_Temp();3、找出最接近的16個(gè)“純凈”頻率Find_RSELx_DCOx_Winer();4、找出最優(yōu)MODxMeasure_MODx()5、合成校驗(yàn)數(shù)組Calculate_I
32、nfoFlash_Data()6、寫(xiě)入FlashWrite_InfoFlashB()7、點(diǎn)亮綠燈Calibrate_Finish();循環(huán)輸出DCODCOTest()35流水賬作業(yè)測(cè)頻比較函數(shù)測(cè)頻比較函數(shù)Measure_MODx()/* * 名 稱(chēng):Measure_MODx() * 功 能:基于已校驗(yàn)成功的RSELx和DCOx,進(jìn)一步校驗(yàn)出最合適的MODx* 說(shuō) 明:本函數(shù)將固定RSELx和DCOx,窮舉32種MODx的取值,然后判斷最優(yōu)的MODx*/void Measure_MODx() /步驟4:在最近接的純凈頻率基礎(chǔ)上,窮舉找到最優(yōu)的MODx設(shè)置unsigned char mod_x =
33、 0;unsigned long Freq_Temp = 0;unsigned int Delta_Now=0;unsigned int Delta_Min=0;unsigned char Calibrate_Num=0;for(Calibrate_Num=0;Calibrate_NumCAL_NUM;Calibrate_Num+)Delta_Min=65530;/第一次比較時(shí),故意定一個(gè)大差值36測(cè)頻比較函數(shù)測(cè)頻比較函數(shù)Measure_MODx()/-RSELx和DCOx一定時(shí),測(cè)量mod_x改變時(shí)的系列頻率-for(mod_x=0;mod_x 32;mod_x+)DCO_Set_Freq(
34、RSELx_DCOx_WinerCalibrate_Num,mod_x);/改變mod_x設(shè)置DCO/-定時(shí)測(cè)頻代碼開(kāi)始-TA0CTL |=TACLR;WDTCTL=WDT_ADLY_1_9;_bis_SR_register(LPM0_bits ); /CPU精確休眠1.9ms(1/512秒)WDTCTL=WDTPW+WDTHOLD;Freq_Temp = TA0R;/讀取測(cè)頻值 /-定時(shí)測(cè)頻代碼結(jié)束-Freq_Temp=(Freq_Temp)*512)/1000; /計(jì)算DCO準(zhǔn)確頻率 /-與Find_RSELx_DCOx_Winer()不同,這里的要求是正負(fù)差值最小-if(Freq_Tem
35、pCalibrate_FrequenceCalibrate_Num)Delta_Now=Calibrate_FrequenceCalibrate_Num-(unsigned int) Freq_Temp; elseDelta_Now=(unsigned int ) Freq_Temp - Calibrate_FrequenceCalibrate_Num;if (Delta_NowDelta_Min) /如果當(dāng)前差值比“世界記錄”還小時(shí)MODx_WinerCalibrate_Num=mod_x;/新Winner誕生Ture_FreqCalibrate_Num=(unsigned int )Fre
36、q_Temp; /記錄校驗(yàn)后的準(zhǔn)確頻率Delta_Min=Delta_Now; /取代前“世界記錄”371、點(diǎn)亮紅燈Calibrate_Start(); 2、測(cè)量128個(gè)“純凈”DCO頻率Measure_Temp();3、找出最接近的16個(gè)“純凈”頻率Find_RSELx_DCOx_Winer();4、找出最優(yōu)MODxMeasure_MODx()5、合成校驗(yàn)數(shù)組Calculate_InfoFlash_Data()6、寫(xiě)入FlashWrite_InfoFlashB()7、點(diǎn)亮綠燈Calibrate_Finish();循環(huán)輸出DCODCOTest()38流水賬作業(yè)數(shù)據(jù)合成函數(shù)數(shù)據(jù)合成函數(shù)Calculate_InfoFlash_Data()/* * 名 稱(chēng):Calculate_InfoFlash_Data() * 功 能:基于已校驗(yàn)成功的RSELx、DCOx和MODx封裝待寫(xiě)入Flash的數(shù)據(jù)* 說(shuō) 明:16位數(shù)據(jù)的格式完全仿照出廠校驗(yàn)參數(shù),最高4位固定1000,然后依次為RSLEx、DCOx和MODx。*/void Calculate_InfoFlash_Data() /步驟5:將最合適的頻率設(shè)定參數(shù)組合成校驗(yàn)數(shù)組unsigned char RSELx=0;unsigned char DCOx=0;unsigned char i=0;for
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030LED溫度調(diào)節(jié)器行業(yè)市場(chǎng)深度研究與戰(zhàn)略咨詢(xún)分析報(bào)告
- 2025-2030自提柜行業(yè)發(fā)展分析及投資戰(zhàn)略研究報(bào)告
- 遼寧麻將考試試題及答案
- 警察顧問(wèn)考試試題及答案
- 2025-2030自動(dòng)邊界控制(ABC)設(shè)備行業(yè)市場(chǎng)現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025屆安徽省合肥新城高升學(xué)?;瘜W(xué)高一下期末達(dá)標(biāo)檢測(cè)模擬試題含解析
- 2025至2030ICU基本呼吸機(jī)行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025-2030種植機(jī)械市場(chǎng)前景分析及投資策略與風(fēng)險(xiǎn)管理研究報(bào)告
- 機(jī)關(guān)內(nèi)部培訓(xùn)活動(dòng)方案
- 晚宴拓展活動(dòng)方案
- 2025至2030年中國(guó)飛行控制器行業(yè)市場(chǎng)供需態(tài)勢(shì)及未來(lái)趨勢(shì)研判報(bào)告
- 2025年黑龍江省龍東地區(qū)中考數(shù)學(xué)試卷真題(含答案)
- 2025至2030年中國(guó)錦氨綸汗布市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025年建筑電氣工程師職業(yè)資格考試試卷及答案
- 2024年江蘇地質(zhì)局所屬事業(yè)單位招聘考試真題
- 2025年湖北省中考物理試題(含答案及解析)
- 2025年中小學(xué)暑假安全教育主題家長(zhǎng)會(huì) 課件
- 房地產(chǎn)銷(xiāo)售計(jì)劃書(shū)
- 2025年勞動(dòng)爭(zhēng)議仲裁員(二級(jí))考試試卷
- 空中安全保衛(wèi)課件
- 中興-5G-A高頻毫米波網(wǎng)絡(luò)規(guī)劃方法論介紹V1.0
評(píng)論
0/150
提交評(píng)論