日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

針對(duì)app開(kāi)發(fā)過(guò)程中對(duì)OAD功能做一個(gè)流程和代碼解讀

電子設(shè)計(jì) ? 來(lái)源:網(wǎng)友電子設(shè)計(jì)發(fā)布 ? 作者:網(wǎng)友電子設(shè)計(jì)發(fā)布 ? 2021-12-29 14:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

CC2640 R2是一款面向 Bluetooth Smart 應(yīng)用的低功耗無(wú)線(xiàn) MCU。該芯片運(yùn)行TI的BLE協(xié)議棧,并支持OAD(Over the Air Download)空中固件升級(jí)功能,此空中固件升級(jí)功能就是利用Android或者iOS的產(chǎn)品對(duì)應(yīng)app通過(guò)BLE對(duì)CC2640R2的產(chǎn)品進(jìn)行固件升級(jí)。同時(shí),TI其實(shí)提供了Anroid和iOS的源碼對(duì)其支持:http://www.ti.com/tool/SENSORTAG-SW?keyMatch=sensortag&tisearch=Search-EN-Everything。這部分的源碼是基于TI的SensorTag硬件進(jìn)行開(kāi)發(fā)的,包含了很多內(nèi)容,對(duì)于客戶(hù)來(lái)說(shuō),基本上不適合直接拿去使用,但是其中的OAD部分代碼,卻是可以通用的。但是對(duì)于客戶(hù)的iOS或者Android app工程師來(lái)說(shuō),往往對(duì)BLE協(xié)議不熟,那就更不用說(shuō)TI的OAD協(xié)議了,所以即使提供了源碼,客戶(hù)在這一部分開(kāi)發(fā)起來(lái)還是很困難。本文就針對(duì)這一點(diǎn),針對(duì)app開(kāi)發(fā)過(guò)程中對(duì)OAD功能做一個(gè)流程和代碼解讀,用以幫助客戶(hù)更方便完成此功能開(kāi)發(fā)。

首先,第一步是從上面的鏈接下載到最新的android和iOS源碼,上述鏈接最終會(huì)指引到github的下載地址。

有了源碼之后,我們就可以解讀了。

從app的角度上來(lái)看TI的OAD協(xié)議,大致是這樣的:

App連接上設(shè)備之后,就能發(fā)現(xiàn)OAD的service和characteristics(服務(wù)和特征值):

服務(wù)的UUID:0xFFC0,對(duì)應(yīng)的128bit UUID:

F000FFC0-0451-4000-B000-000000000000

服務(wù)下面有兩個(gè)主要特征值:(其他特征值可以暫且忽略)

OAD Image Identify,UUID:0xFFC1;OAD Image Block,UUID:0xFFC2,對(duì)應(yīng)的128bit UUID:

– OAD Image Identify F000FFC1-0451-4000-B000-000000000000,用于交互確認(rèn)固件版本信息。

– OAD Image Block F000FFC2-0451-4000-B000-000000000000,用于傳送新的固件。

固件更新的所有操作都是對(duì)上面這兩個(gè)特征值進(jìn)行操作。

用TI的SensorTag app可以看到:

用第三方app比如light blue也能看到,安卓手機(jī)的情況也是一樣。

在TI提供的示例代碼中,在A(yíng)ndroid中,客戶(hù)唯一要用到的文件其實(shí)就是FwUpdateActivity_CC26xx.java,所有的OAD流程基本全部都在這里。另外有一個(gè)相關(guān)的文件BluetoothLeService.java,這個(gè)是TI的SensorTag App封裝的BLE相關(guān)API接口集合,主要用于一些特征值的操作,比如write,read等,OAD用到的主要就是write,通過(guò)write來(lái)神奇地實(shí)現(xiàn)各種流程。在iOS源碼中,流程相關(guān)的主要是BLETIOAD2Profile.m(注意,另外一個(gè)BLETIOADProfile.m,這是針對(duì)舊版的CC254x的,和CC26xx略有不同,這里不做討論,有興趣可以自己去看),基本就在這里,另外對(duì)應(yīng)也有一個(gè)BLE相關(guān)接口集合BLEUtility.m。

第一步

從app來(lái)講,開(kāi)始OAD的第一步就是先使能上面兩個(gè)特征值的notification功能。

簡(jiǎn)單來(lái)說(shuō)就是調(diào)用android或者iOS提供的現(xiàn)有API,分分鐘完成。(藍(lán)牙協(xié)議上來(lái)說(shuō)就是往這兩個(gè)特征值的CCC句柄上寫(xiě)01:00,我們這里盡量不討論具體藍(lán)牙協(xié)議,從簡(jiǎn)考慮,有興趣的人可以自己去研究一下)。

對(duì)應(yīng)到代碼里,

Android在FwUpdateActivity_CC26xx.java中,新的固件文件裝載到手機(jī)內(nèi)存后:public void onLoad(View v)中調(diào)用:

mLeService.setCharacteristicNotification(mCharIdentify, true);

mLeService.setCharacteristicNotification(mCharBlock, true);

實(shí)際上可以根據(jù)客戶(hù)真實(shí)代碼在適當(dāng)位置加上面兩個(gè)函數(shù)就行,這樣第一步其實(shí)就完成了。

*更多說(shuō)明:

上面兩個(gè)函數(shù),其實(shí)就是BluetoothLeService.java中的API,最終追蹤下去的話(huà)是調(diào)用Android SDK 的BLE API來(lái)使能notification:

mBluetoothGatt.setCharacteristicNotification(request.characteristic, request.notifyenable)

其實(shí)我們也可以直接調(diào)用這個(gè)來(lái)實(shí)現(xiàn)上面的功能。

iOS在BLETIOAD2Profile.m里的-(void) configureProfile 函數(shù)里調(diào)用:

CBUUID *sUUID = [CBUUID UUIDWithString:TI_OAD_SERVICE];

CBUUID *cUUID = [CBUUID UUIDWithString:TI_OAD_IMAGE_NOTIFY];

[BLEUtility setNotificationForCharacteristic:self.d.p sCBUUID:sUUID cCBUUID:cUUID enable:YES];

cUUID = [CBUUID UUIDWithString:TI_OAD_IMAGE_BLOCK_REQUEST];

if (self.notifications)[BLEUtility setNotificationForCharacteristic:self.d.p sCBUUID:sUUID cCBUUID:cUUID enable:YES];

注意,iOS代碼里面OAD Image Identify和OAD Image Block對(duì)應(yīng)的是TI_OAD_IMAGE_NOTIFY和TI_OAD_IMAGE_BLOCK_REQUEST。同樣,在iOS里適當(dāng)位置調(diào)用這個(gè)函數(shù)就行。

*更多說(shuō)明:

對(duì)于iOS TI給出的源碼,是BLEUtility.m中封裝了Apple的BLE API來(lái)使能notification:

- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;

一樣,我們也可以直接調(diào)用這個(gè)來(lái)實(shí)現(xiàn)上面的功能。

空中sniffer抓包看的話(huà),就能看到這兩個(gè)使能notification的流程:

第二步

從app角度來(lái)講,第二步就是要把新固件的版本信息從手機(jī)傳送到外設(shè)上,讓外設(shè)進(jìn)行判斷是否要升級(jí)。

這一步就要用到OAD Image Identify,這個(gè)特征值在整個(gè)OAD過(guò)程中只會(huì)用到一次,就是在這里。

App這邊先從獲得到的新固件里把固件的image header (16個(gè)字節(jié)) 讀出來(lái),image header就是固件的二進(jìn)制文件的開(kāi)始16個(gè)字節(jié),很容易獲取到。

體現(xiàn)在代碼里,

Android:還是在FwUpdateActivity_CC26xx.java中,在打開(kāi)新固件文件的時(shí)候:

private boolean loadFile(String filepath, boolean isAsset) {

順便創(chuàng)建要發(fā)送的16個(gè)字節(jié)image header結(jié)構(gòu):

mFileImgHdr = new ImgHdr(mFileBuffer,readLen);

這個(gè)構(gòu)造函數(shù)就會(huì)把image header部分給組織好放到16字節(jié)的一個(gè)buffer中去,用以接下來(lái)發(fā)送給設(shè)備。這個(gè)類(lèi)的定義也在FwUpdateActivity_CC26xx.java中:

private class ImgHdr {

……

ImgHdr(byte[] buf, int fileLen) {

this.len = (fileLen / (16 / 4));

this.ver = 0;

this.uid[0] = this.uid[1] = this.uid[2] = this.uid[3] = ‘E’;

this.addr = 0;

this.imgType = 1; //EFL_OAD_IMG_TYPE_APP

this.crc0 = calcImageCRC((int)0,buf);

crc1 = (short)0xFFFF;

……

}

可以看到構(gòu)造函數(shù)里面,雖然有讀取到的實(shí)際固件文件的image header作為輸入?yún)?shù),但我們實(shí)際的代碼里面為了演示,只是寫(xiě)死了一些內(nèi)容。這里可以根據(jù)實(shí)際情況修改一下,根據(jù)前面提到的16字節(jié)header的順序來(lái)就行,比如:

private class ImgHdr {

……

ImgHdr(byte[] buf, int fileLen) {

this.len = (fileLen / (16 / 4));

this.ver = buf[5];

this.ver = (this.ver 《《 8) | buf[4];

this.uid[0] = buf[8];this.uid[1] = buf[9];

this.uid[2] = buf[10]; this.uid[3] = buf[11];

this.addr = buf[13];

this.addr = (this.addr 《《 8) | buf[12];

this.imgType = buf[14];//EFL_OAD_IMG_TYPE_APP

this.crc0 = calcImageCRC((int)0,buf);

crc1 = (short)0xFFFF;

……

}

這樣就基本能拿到實(shí)際的真實(shí)數(shù)據(jù)了。

iOS:就很簡(jiǎn)單了,直接把新固件文件開(kāi)始的16字節(jié)header復(fù)制到代碼里就可以了,還是在BLETIOAD2Profile.m里,在-(void) uploadImage 函數(shù)中:

img_hdr_t2 imgHeader;

uint32_t pages = ((uint32_t)self.imageFile.length / 4096);

//做個(gè)CRC校驗(yàn),放到image header中去,同時(shí)把image header的16字節(jié)內(nèi)容補(bǔ)完整。

[self calcImageInfo:0 pages:pages imageHeader:&imgHeader buf:imageFileData];

memcpy(requestData, &imgHeader, 16);

需要注意的是iOS給的源碼里面,image header內(nèi)容的補(bǔ)充是在crc校驗(yàn)函數(shù)里面一并完成的:-(void) calcImageInfo里:

imageHeader buf:(uint8_t *)buf {

imageHeader-》len = (pages * FLASH_PAGE_SIZE) / (OAD_BLOCK_SIZE / FLASH_WORD_SIZE);

imageHeader-》ver = 0;

imageHeader-》uid[0] = imageHeader-》uid[1] = imageHeader-》uid[2] = imageHeader-》uid[3] = ‘E’;

imageHeader-》addr = (firstpage * FLASH_PAGE_SIZE) / (OAD_BLOCK_SIZE / FLASH_WORD_SIZE);

imageHeader-》imgType = EFL_OAD_IMG_TYPE_APP;

imageHeader-》res[0] = 0xff;

imageHeader-》crc0 = [self calcImageCRC:firstpage imageHeader:imageHeader buf:buf];

imageHeader-》crc1 = 0xffff;

}

這樣iOS這里也得到完整的image header信息了。

接下來(lái)app將通過(guò)OAD Image Identify這個(gè)特征值首先把前面得到的新的固件的版本信息發(fā)送給設(shè)備(CC2640R2),這個(gè)版本信息包含在前面得到的image header的16個(gè)字節(jié)buffer里,把這個(gè)發(fā)出去給設(shè)備就行了。

體現(xiàn)在代碼里,

Android,還是在FwUpdateActivity_CC26xx.java中,開(kāi)始流程函數(shù):

private void startProgramming() {

獲取image identify(其實(shí)就是image header):

mCharIdentify.setValue(mFileImgHdr.getRequest());

并通過(guò)BLE的write characteristic動(dòng)作從app發(fā)送到設(shè)備端:

mLeService.writeCharacteristic(mCharIdentify);

*更多說(shuō)明:

上面write characteristic函數(shù)其實(shí)就是BluetoothLeService.java中的API,最終追蹤下去的話(huà)是調(diào)用Android SDK 的BLE API來(lái)進(jìn)行BLE的write command操作:

mBluetoothGatt.writeCharacteristic(request.characteristic);

其實(shí)我們也可以直接調(diào)用這個(gè)來(lái)實(shí)現(xiàn)上面的功能。

iOS代碼中,在BLETIOAD2Profile.m里,還是在-(void) uploadImage 函數(shù)里:

CBUUID *cUUID = [CBUUID UUIDWithString:TI_OAD_IMAGE_NOTIFY];

[BLEUtility writeNoResponseCharacteristic:self.d.p sCBUUID:sUUID cCBUUID:cUUID data:[NSData dataWithBytes:requestData length:16]];

通過(guò) write characteristic來(lái)把image header發(fā)送到設(shè)備端。

*更多說(shuō)明:

這個(gè)的write函數(shù),其實(shí)也是在BLEUtility.m里面封裝了Apple的BLE標(biāo)準(zhǔn)API:

- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;

我們也可以直接調(diào)用這個(gè)來(lái)實(shí)現(xiàn)上面的功能。

空中sniffer抓包能看到write command發(fā)送image header:

最后,設(shè)備收到image header之后,會(huì)進(jìn)行和自己本身的固件版本號(hào)進(jìn)行比較。如果發(fā)現(xiàn)image header中的版本號(hào)沒(méi)有自己的版本號(hào)新,那么就直接以notification (這里notification是在前面第一步使能)的形式在OAD Image Identify上回復(fù)自己的版本號(hào)給手機(jī),表示拒絕此次固件升級(jí),此次升級(jí)就此結(jié)束。

空中sniffer抓包,其中標(biāo)黃的部分就是設(shè)備回復(fù)自身版本號(hào),表示拒絕此次固件升級(jí):

如果發(fā)現(xiàn)image header中的版本號(hào)確實(shí)比自己本身的固件版本號(hào)要新,那么就同意這次固件更新,會(huì)在OAD Image Block這個(gè)特征值的notification (這里notification是在前面第一步使能)上回復(fù)0x0000,表示準(zhǔn)備接受序列號(hào)第0個(gè)固件內(nèi)容包。注意實(shí)在OAD Image Block這個(gè)特征值上,不是OAD Image Identify這個(gè)特征值上,OAD Image Identify這個(gè)特征值的使命在前面已經(jīng)完成,后面不會(huì)再使用。

從sniffer看就會(huì)看到0x0000從外設(shè)發(fā)回手機(jī):

總結(jié)下來(lái)第二步,就是app要在OAD Image Identify特征值上發(fā)送新固件的image header到設(shè)備端,然后設(shè)備端進(jìn)行判斷是否要接收新的固件進(jìn)行升級(jí),如果要升級(jí),則在OAD Image Block特征值上向手機(jī)回復(fù)0x0000,不然回復(fù)自己目前的固件版本號(hào)表示拒絕更新??偨Y(jié)起來(lái)就是下面的兩個(gè)流程圖:

第三步

這一步從app來(lái)講就是按照順序發(fā)送固件內(nèi)容了。

手機(jī)在OAD Image Block特征值上收到0x0000之后就代表設(shè)備端愿意接收新固件,并且意思是對(duì)方準(zhǔn)備好接收第0個(gè)固件包。每個(gè)固件包的內(nèi)容長(zhǎng)度是16個(gè)字節(jié),并且需要在頭部放上兩個(gè)字節(jié)的序列號(hào),序列號(hào)從0x0000開(kāi)始累加,一直到最后一個(gè)固件包。

*注意這個(gè)序列號(hào)是小端在前的,所以后面是0x0100,0x0200,0x0300,0x0400,…,0xFF00,0x0001,0x0101,0x0201,…這樣累加上去。

從空中sniffer上看,很容易就能看到整個(gè)流程的交互:

首先是手機(jī)發(fā)送第0包的固件內(nèi)容,通過(guò)BLE的Write方式在OAD Image Block特征值上發(fā)送,固件block內(nèi)容是16個(gè)字節(jié),注意下圖標(biāo)黃的頭兩個(gè)字節(jié),是固件包序列號(hào),第0包是0x0000,所以包的總長(zhǎng)是16+2=18個(gè)字節(jié)。

那么設(shè)備收到APP發(fā)送過(guò)去的第0包固件后,回復(fù)請(qǐng)求下一個(gè)固件包,通過(guò)Notification的方式在OAD Image Block特征值上回復(fù)0x0100:

APP收到設(shè)備發(fā)回的0x0100,就知道對(duì)方已經(jīng)等待接收下一包固件,于是就發(fā)送下一包0x0100的固件包,以此類(lèi)推,一直到固件發(fā)送結(jié)束。

具體到代碼里,

在A(yíng)ndroid中,就是在programBlock()函數(shù)里,這里我們只關(guān)注核心部分:

private void programBlock() {

省略前面邏輯相關(guān)代碼,工程里面很容易看懂。

// Prepare block

首先自然是包序列號(hào),buffer的頭兩個(gè)字節(jié):

mOadBuffer[0] = Conversion.loUint16(mProgInfo.iBlocks);

mOadBuffer[1] = Conversion.hiUint16(mProgInfo.iBlocks);

然后是16個(gè)字節(jié)的固件block包內(nèi)容:

System.arraycopy(mFileBuffer, mProgInfo.iBytes, mOadBuffer, 2, OAD_BLOCK_SIZE);

// Send block

接著把這18個(gè)字節(jié)通過(guò)write方式在OAD Image Block特征值上發(fā)送:

mCharBlock.setValue(mOadBuffer);

boolean success = mLeService.writeCharacteristicNonBlock(mCharBlock);

如果發(fā)送成功,那么就順移相關(guān)的包序列號(hào)還有固件文件中的位移標(biāo)志:

if (success) {

// Update stats

packetsSent++;

mProgInfo.iBlocks++;

mProgInfo.iBytes += OAD_BLOCK_SIZE;

mProgressBar.setProgress((mProgInfo.iBlocks * 100) / mProgInfo.nBlocks);

如果最后一個(gè)固件block成功完成,那么就恭喜,OAD順利成功!

if (mProgInfo.iBlocks == mProgInfo.nBlocks) {

b.setTitle(“Programming finished”);

b.setPositiveButton(“OK”,null);

AlertDialog d = b.create();

d.show();

mProgramming = false;

mLog.append(“Programming finished at block ” + (mProgInfo.iBlocks + 1) + “\n”);

}

} else {

mProgramming = false;

msg = “GATT writeCharacteristic failed\n”;

}

}

*更多說(shuō)明:

上面boolean success = mLeService.writeCharacteristicNonBlock(mCharBlock);這個(gè)函數(shù),其實(shí)就是BluetoothLeService.java中的API,最終追蹤下去的話(huà)是調(diào)用Android SDK 的BLE API來(lái)實(shí)現(xiàn)的:mBluetoothGatt.writeCharacteristic(request.characteristic);

iOS的代碼里,體現(xiàn)在BLETIOAD2Profile.m里的-(void) sendOnePacket 函數(shù),只看核心部分,和Android很像的,因?yàn)榱鞒桃粯樱?/p>

-(void) sendOnePacket {

//Prepare Block

首先自然是包序列號(hào),buffer的頭兩個(gè)字節(jié):

uint8_t requestData[2 + OAD_BLOCK_SIZE];

requestData[0] = LO_UINT16(self.iBlocks);

requestData[1] = HI_UINT16(self.iBlocks);

然后是16個(gè)字節(jié)的固件block包內(nèi)容:

memcpy(&requestData[2] , &imageFileData[self.iBytes], OAD_BLOCK_SIZE);

CBUUID *sUUID = [CBUUID UUIDWithString:TI_OAD_SERVICE];

CBUUID *cUUID = [CBUUID UUIDWithString:TI_OAD_IMAGE_BLOCK_REQUEST];

接著把這18個(gè)字節(jié)通過(guò)write方式在OAD Image Block特征值上發(fā)送:

[BLEUtility writeNoResponseCharacteristic:self.d.p sCBUUID:sUUID cCBUUID:cUUID data:[NSData dataWithBytes:requestData length:2 + OAD_BLOCK_SIZE]];

如果發(fā)送成功,那么就順移相關(guān)的包序列號(hào)還有固件文件中的位移標(biāo)志:

dataWithBytes:requestData length:2 + OAD_BLOCK_SIZE]);

self.sndDataCount ++;

self.iBlocks++;

self.iBytes += OAD_BLOCK_SIZE;

self.sentPackets++;

如果最后一個(gè)固件block成功完成,那么就恭喜,OAD順利成功!

if(self.iBlocks == self.nBlocks) {

self.inProgramming = NO;

[self.oadDelegate didFinishUploading];

return;

}

流程和Android完全一樣,我連注釋都直接復(fù)制過(guò)來(lái)了J。

這樣就是完整的OAD流程了??偨Y(jié)就是分三步走:使能OAD Image Identify和OAD Image Block 的notification,在OAD Image Identify上發(fā)送新固件版本(image header)進(jìn)行確認(rèn),最后在OAD Image Block上按順序把固件發(fā)送完,結(jié)束。

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式處理
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    10555
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    普源DM858數(shù)字萬(wàn)用表故障代碼解讀與常見(jiàn)維修方案

    普源DM858數(shù)字萬(wàn)用表作為高精度智能測(cè)量工具,廣泛應(yīng)用于科研、工業(yè)檢測(cè)與教學(xué)領(lǐng)域。其集成的自動(dòng)量程、AI輔助決策與云端數(shù)據(jù)同步功能,提升了測(cè)量效率與準(zhǔn)確性。然而,在長(zhǎng)期使用過(guò)程中,仍可能出現(xiàn)各類(lèi)
    的頭像 發(fā)表于 01-15 16:29 ?322次閱讀
    普源DM858數(shù)字萬(wàn)用表故障<b class='flag-5'>代碼</b><b class='flag-5'>解讀</b>與常見(jiàn)維修方案

    開(kāi)發(fā)過(guò)程中如何利用CW32L083系列微控制器的官方固件庫(kù)進(jìn)行程序編寫(xiě)和調(diào)試?

    開(kāi)發(fā)過(guò)程中,如何利用CW32L083系列微控制器的官方固件庫(kù)進(jìn)行程序編寫(xiě)和調(diào)試?
    發(fā)表于 12-15 07:23

    Flutter 移動(dòng)端開(kāi)發(fā):集成淘寶 API 實(shí)現(xiàn)商品數(shù)據(jù)實(shí)時(shí)展示 APP

    。Flutter 憑借其跨平臺(tái)特性、高效的開(kāi)發(fā)效率和豐富的 UI 組件,成為開(kāi)發(fā)此類(lèi) APP 的理想選擇。本文將詳細(xì)介紹如何使用 Flutter 集成淘寶 API,實(shí)現(xiàn)商品數(shù)據(jù)實(shí)時(shí)展示 APP
    的頭像 發(fā)表于 11-13 09:36 ?543次閱讀

    程序加載過(guò)程中遇到的問(wèn)題及其解決方法

    會(huì)停在代碼發(fā)生錯(cuò)誤的地方,此時(shí)MCU鎖死,內(nèi)部程序無(wú)法終止,開(kāi)發(fā)板重新上電和MCU Reset只會(huì)重復(fù)從Flash讀取代碼并運(yùn)行鎖死的過(guò)程,從而Flash無(wú)法燒寫(xiě)。 解決方法:在e2
    發(fā)表于 10-30 07:59

    晶圓制造過(guò)程中的摻雜技術(shù)

    在超高純度晶圓制造過(guò)程中,盡管晶圓本身需達(dá)到11個(gè)9(99.999999999%)以上的純度標(biāo)準(zhǔn)以維持基礎(chǔ)半導(dǎo)體特性,但為實(shí)現(xiàn)集成電路的功能化構(gòu)建,必須通過(guò)摻雜工藝在硅襯底表面局部引入特定雜質(zhì)。
    的頭像 發(fā)表于 10-29 14:21 ?1370次閱讀
    晶圓制造<b class='flag-5'>過(guò)程中</b>的摻雜技術(shù)

    開(kāi)發(fā)指南】全志系列核心板開(kāi)發(fā)過(guò)程中的常見(jiàn)問(wèn)題及排查策略

    在長(zhǎng)期提供技術(shù)支持服務(wù)的過(guò)程中,飛凌嵌入式總結(jié)了用戶(hù)開(kāi)發(fā)全志系列產(chǎn)品時(shí)常見(jiàn)的問(wèn)題及排查方法。本文中,小編將為大家梳理這些經(jīng)驗(yàn),助力開(kāi)發(fā)者快速定位問(wèn)題,提升開(kāi)發(fā)效率。
    的頭像 發(fā)表于 10-15 08:04 ?7093次閱讀
    【<b class='flag-5'>開(kāi)發(fā)</b>指南】全志系列核心板<b class='flag-5'>開(kāi)發(fā)過(guò)程中</b>的常見(jiàn)問(wèn)題及排查策略

    如何利用Trace機(jī)制實(shí)現(xiàn)LLCP預(yù)覽功能

    在藍(lán)牙協(xié)議棧開(kāi)發(fā)過(guò)程中,有時(shí)需要預(yù)先知道 LLCP。本文將介紹如何利用 Trace 機(jī)制實(shí)現(xiàn) LLCP 預(yù)覽功能。
    的頭像 發(fā)表于 10-09 17:55 ?2125次閱讀

    芯片研發(fā)過(guò)程中的兩種流片方式

    芯片在研發(fā)過(guò)程中一般包含4個(gè)階段:芯片設(shè)計(jì)、生產(chǎn)樣片、測(cè)試驗(yàn)證和大規(guī)模量產(chǎn)。在完成芯片設(shè)計(jì)后,工程師們需要先拿到些芯片樣片,用它們進(jìn)行測(cè)試和驗(yàn)證,來(lái)判斷新研發(fā)的芯片在功能和性能上是否
    的頭像 發(fā)表于 09-09 15:04 ?2661次閱讀
    芯片研<b class='flag-5'>發(fā)過(guò)程中</b>的兩種流片方式

    藍(lán)牙按摩儀電路怎么設(shè)計(jì)?APP通訊協(xié)議怎么制定?給你個(gè)參考示例

    藍(lán)牙眼部/腿部/腰部/胳膊/按摩儀的硬件如何設(shè)計(jì)以及方案如何選型,APP小程序的通訊協(xié)議如何制定,做一個(gè)詳細(xì)介紹
    的頭像 發(fā)表于 09-08 10:08 ?973次閱讀
    藍(lán)牙按摩儀電路怎么設(shè)計(jì)?<b class='flag-5'>APP</b>通訊協(xié)議怎么制定?給你<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>參考示例

    HarmonyOSAI編程智能代碼解讀

    CodeGenie提供智能AI能力對(duì)框選的代碼片段進(jìn)行逐條解釋?zhuān)偨Y(jié)代碼段含義,幫助開(kāi)發(fā)者提升閱讀代碼的速度和效率。 選中.ets文件或者.cpp文件
    發(fā)表于 09-02 16:29

    HarmonyOS AI輔助編程工具(CodeGenie)代碼智能解讀

    功能從DevEco CodeGenie 5.1.0 Beta版本開(kāi)始支持。 CodeGenie提供智能AI能力對(duì)框選的代碼片段進(jìn)行逐條解釋?zhuān)偨Y(jié)代碼段含義,幫助開(kāi)發(fā)者提升閱讀
    發(fā)表于 07-17 17:02

    HarmonyOS實(shí)戰(zhàn): 城市選擇功能的快速實(shí)現(xiàn)

    最近在日常開(kāi)發(fā)過(guò)程中,需要實(shí)現(xiàn)城市選擇功能,同時(shí)支持模糊搜索??此坪?jiǎn)單的功能動(dòng)手實(shí)現(xiàn)起來(lái)卻有很多難點(diǎn)。本篇文章詳細(xì)記錄開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和對(duì)應(yīng)的解決方法,希望能夠幫助你,建議點(diǎn)贊收藏
    的頭像 發(fā)表于 06-24 17:07 ?602次閱讀

    HarmonyOS 代碼工坊的指尖開(kāi)發(fā),讓 APP 開(kāi)發(fā)所見(jiàn)即所得

    沙盤(pán)被直接搬入了移動(dòng)設(shè)備本身。眼尖的開(kāi)發(fā)者應(yīng)該已經(jīng)發(fā)現(xiàn),最近華為應(yīng)用市場(chǎng)“應(yīng)用嘗鮮”專(zhuān)區(qū)里,上架了款名為“HarmonyOS 代碼工坊”的新應(yīng)用,下載量持續(xù)攀升。 開(kāi)發(fā)者只需要下載“
    的頭像 發(fā)表于 06-24 12:08 ?975次閱讀
    HarmonyOS <b class='flag-5'>代碼</b>工坊的指尖<b class='flag-5'>開(kāi)發(fā)</b>,讓 <b class='flag-5'>APP</b> <b class='flag-5'>開(kāi)發(fā)</b>所見(jiàn)即所得

    HarmonyOS實(shí)戰(zhàn):高德地圖自定義定位圖標(biāo)展示

    前言 地圖定位功能基本上已經(jīng)成了日常應(yīng)用程序的必備功能,在日常開(kāi)發(fā)地圖定位的功能的時(shí)候難免會(huì)遇到很多意想不到的問(wèn)題,本篇文章記錄日常
    的頭像 發(fā)表于 06-09 14:59 ?899次閱讀
    HarmonyOS實(shí)戰(zhàn):高德地圖自定義定位圖標(biāo)展示

    使用CY7C65213開(kāi)發(fā)過(guò)程中,應(yīng)該用哪個(gè)interface進(jìn)行uart通信?

    在使用CY7C65213開(kāi)發(fā)過(guò)程中,我想用CyUartRead讀數(shù)據(jù),但是好像沒(méi)有接口的deviceType是CY_TYPE_UART,想請(qǐng)問(wèn)我應(yīng)該用哪個(gè)interface進(jìn)行uart通信? 是否有相關(guān)指導(dǎo)文件,或描述符指導(dǎo)?
    發(fā)表于 06-03 07:04
    施秉县| 曲松县| 清水河县| 桂阳县| 额尔古纳市| 青河县| 宜城市| 定日县| 怀集县| 齐齐哈尔市| 石门县| 富源县| 乌鲁木齐市| 桐柏县| 南阳市| 侯马市| 治多县| 西贡区| 博白县| 克什克腾旗| 元阳县| 湖南省| 微山县| 邢台县| 长治县| 万全县| 尼勒克县| 万州区| 尉犁县| 武清区| 东兰县| 广安市| 辽宁省| 乌拉特后旗| 盐津县| 耒阳市| 土默特右旗| 新干县| 花莲市| 抚远县| 平武县|