SEGGER J-Flash烧写SN号(serial number)的两种方式
stm32軟件開(kāi)發(fā)調(diào)試完成之后,需要發(fā)布產(chǎn)品進(jìn)行批量生產(chǎn)。每一個(gè)產(chǎn)品應(yīng)該有一個(gè)唯一的設(shè)備編號(hào),我們可以把設(shè)備編號(hào)與軟件程序一起,寫(xiě)入stm32的flash中進(jìn)行保存,在軟件中讀取到設(shè)備編號(hào)使用。這時(shí)候我們就需要使用到J-Flash的Serial number(序列號(hào),簡(jiǎn)稱(chēng)SN)功能。
綜述
打開(kāi)J-Flash,Help->J-Flash User Guide,打開(kāi)J-Flash用戶(hù)手冊(cè),搜索“serial number”,可以找到對(duì)應(yīng)介紹章節(jié)(不同版本章節(jié)可能不同)。
1. 編程連續(xù)的序列號(hào)。
Address:編程序列號(hào)的flash地址,十六進(jìn)制格式;
Len:序列號(hào)的長(zhǎng)度,十進(jìn)制,支持1-4字節(jié);
Next SN:下一個(gè)序列號(hào),十進(jìn)制,區(qū)分正負(fù);
Increment:增量,每次寫(xiě)入之后SN增加的大小,十進(jìn)制,可正可負(fù);
開(kāi)始測(cè)試: 先向flash中寫(xiě)入SN,之后讀出flash,查看SN(J-Flash下載程序請(qǐng)參照SEGGER J-Flash 燒寫(xiě)stm32程序)。
test0:在0x08050000寫(xiě)入序列號(hào)123456,遞增1;
結(jié)果:寫(xiě)入正確,Next SN增加Increment變?yōu)?23457
test1:寫(xiě)入在0x08050000寫(xiě)入序列號(hào)2147483647(0x7FFFFFFF),遞增1;
結(jié)果:2147483647寫(xiě)入成功,Next SN加1后變?yōu)榱?2147483648???
其實(shí),在有符號(hào)四字節(jié)的數(shù)據(jù)里,0x7FFFFFFF再增1就會(huì)符號(hào)溢出,0x80000000表示有符號(hào)的-2147483648。然而Next SN輸入框里面,最多輸入10位數(shù)字,包括正負(fù)號(hào),所以我們最大可填入的SN號(hào)為7FFFFFFF。當(dāng)然我們程序里面解析的時(shí)候,可以將4字節(jié)當(dāng)做無(wú)符號(hào)整型,可以獲得最大2^32的SN號(hào)值。實(shí)際使用,也可以填入負(fù)數(shù)的SN號(hào),比如-1,其寫(xiě)入flash的值為0xFFFFFFFF。
Next SN輸入框中,可填入負(fù)數(shù)最小為-999999999(0xC4653601),可填入正數(shù)最大9999999999,但是寫(xiě)入的會(huì)是2147483647(0x7FFFFFFF)。
test2:修改文件寫(xiě)入序列號(hào)
事實(shí)上,J-Flash寫(xiě)入的SN號(hào)保存在一個(gè)文本文件里,我們可以通過(guò)直接修改這個(gè)文件對(duì)要寫(xiě)入的SN號(hào)進(jìn)行修改,在寫(xiě)入非連續(xù)的SN號(hào)時(shí),該方式比較方便。SN號(hào)保存文件路徑與工程文件路徑相同,使用 Flie->Open project… 打開(kāi)的一般就是當(dāng)前打開(kāi)的工程的路徑,在資源管理器中找到該路徑即可看到與工程名同名的序列號(hào)文件。
文本輸入長(zhǎng)度沒(méi)有限制,十進(jìn)制格式,可以輸入負(fù)數(shù),比如-2147483648,寫(xiě)入結(jié)果應(yīng)該是0x80000000。
注意:修改文本文件之后,記得Ctrl+S保存一下,否則不生效。如果文本內(nèi)容格式錯(cuò)誤的話(huà),將會(huì)寫(xiě)入0x00000000;正數(shù)溢出寫(xiě)入0x7FFFFFFF;負(fù)數(shù)溢出寫(xiě)入0x80000000。
2. 從序列號(hào)列表文件中編程序列號(hào)
test2中使用文本文件寫(xiě)入序列號(hào),保存序列號(hào)的文本文件名稱(chēng)為 < JFlashProjectName >_Serial.txt,而需要使用列表寫(xiě)入的話(huà),則需要在工程文件目錄下創(chuàng)建一個(gè)名稱(chēng)為 < JFlashProjectName >_SNList.txt的文件,在其中填入要寫(xiě)入的序列號(hào)。每行為一個(gè)序列號(hào),每個(gè)序列號(hào)為4字節(jié)十六進(jìn)制數(shù)(不帶0x),文件的排列的字節(jié)序就是寫(xiě)入flash的字節(jié)序。
在工程文件目錄下有SNList文件時(shí),優(yōu)先使用SNList文件,忽略Serial文件。該方式需要配合Program serial number中的參數(shù)使用。
Address:編程序列號(hào)的flash地址,十六進(jìn)制格式;
Len:序列號(hào)的長(zhǎng)度,十進(jìn)制,支持1-4字節(jié);
Next SN:列表行號(hào),十進(jìn)制非負(fù)數(shù),從0開(kāi)始,0代表列表第一行;
Increment:增量,每次寫(xiě)入之后列表行號(hào)增加的大小,十進(jìn)制,可正可負(fù);
test3:使用序列號(hào)列表文件寫(xiě)入序列號(hào)
列表寫(xiě)入模式與直接寫(xiě)入?yún)^(qū)別不大,如果不滿(mǎn)4字節(jié),在后面自動(dòng)補(bǔ)0,超出則自動(dòng)截?cái)?#xff0c;格式錯(cuò)誤則寫(xiě)入0x00000000,行數(shù)超出則不寫(xiě)入。
3. 讀取flash函數(shù)
#define SN_ADDR (uint32_t)0x08050000/*** @brief 讀取指定地址的字(32位數(shù)據(jù))* @param addr 讀地址* @return uint32_t 讀取的數(shù)據(jù)*/ uint32_t StmFlashReadWord(uint32_t addr) {return *(uint32_t *)addr; }/*** @brief 從指定地址開(kāi)始讀出指定長(zhǎng)度的數(shù)據(jù),每次讀出一個(gè)字(32位)* @param readAddr 起始地址* @param pbuf 數(shù)據(jù)指針* @param readNum 讀出字(32位)數(shù)* @return void*/ void StmFlashRead(uint32_t readAddr, uint32_t *pbuf, uint32_t readNum) {uint32_t i;for (i = 0; i < readNum; i++) {pbuf[i] = StmFlashReadWord(readAddr);readAddr += 4;} }總結(jié)
以上是生活随笔為你收集整理的SEGGER J-Flash烧写SN号(serial number)的两种方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IDEA中安装配置Jrebel热部署插件
- 下一篇: 小甲鱼python课后题007_[Pyt