色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于SWD離線燒寫OTP

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 2022-12-22 14:10 ? 次閱讀

嵌入式開發的最后階段是要將成果產品化,要交付工廠量產。對于NXP i.MXRT系列的芯片來說,除了要交付給工廠項目固件外,還需要工廠寫OTP區域來配置芯片啟動方式或者開啟芯片的安全功能。離線編程器燒寫固件和OTP的方法有多種,如ISP,SWD或者Jtag等。

今天就為大家介紹下,如何讓離線編程器利用SWD接口燒寫OTP。

編寫OTP燒寫算法

直接操作寄存器來寫OTP的過程很繁瑣。很多編程器借助Flash燒寫算法來燒寫Flash,我們也可以借助燒寫Flash的方法來燒寫OTP。 本加油站曾經有一篇《編寫Keil的自定義Flash燒寫算法FLM》,在這篇文章中,作者介紹了如何利用Keil來編寫Flash燒寫算法。 編寫OTP燒寫算法的方法和編寫Flash燒寫算法的方法一樣,只需要復用接口函數Init和UnInit,新增接口OTPWrite。和Flash相關的操作函數可以直接刪掉。OTP的燒寫算法接口聲明如下:

int Init (unsigned long adr, unsigned long clk, unsigned long fnc);

int UnInit (unsigned long fnc);

int OTPWrite (unsigned long idx, unsigned long value);
每個燒寫算法接口函數都是對應OTP驅動函數的封裝。下面是這3個接口函數的參考實現:
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
    BOARD_BootClockRUN();
#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL)
    OCOTP_Init(OCOTP, CLOCK_GetFreq(kCLOCK_IpgClk));
#else
    OCOTP_Init(OCOTP, 0U);
#endif
    return (0);              
}

int OTPWrite (unsigned long idx, unsigned long value) {
    status_t status = kStatus_Success;
    status = OCOTP_WriteFuseShadowRegister(OCOTP, idx, value);
    return (kStatus_Success == status) ? (0) : (1);
}

int UnInit (unsigned long fnc) {
    OCOTP_Deinit(OCOTP);
    return (0);
}

以OCOTP_開頭的函數是OTP driver接口。函數BOARD_BootClockRUN的具體實現請查看SDK內OTP driver的示例。

提取算法代碼

Keil MDK生成的后綴為FLM的算法文件實質上是一段與地址無關的代碼。對于下載器來說,一種簡單的使用方法是把文件內的相關函數指令提取出來。這里需要用到開源項目pyocd里的python腳本FlashAlgo。該項目github地址為:

https://github.com/pyocd/FlashAlgo

FlashAlgo默認會從符號表里查找EraseSector等函數名。所以我們需要做一點改動,把flash相關操作的函數名換成OTP相關操作的函數名。

文件flash_algo.py中集合REQUIRED_SYMBOLS改動如下:

    REQUIRED_SYMBOLS = set([
        "Init",
        "UnInit",
        "OTPWrite", # EraseSector
    ])

文件generate_blobs.py中列表TEMPLATES改動如下:

TEMPLATES = [
    ("c_blob.tmpl", "c_blob.c"),
]

c_blob.tmpl在文件夾templates中,將program_target_t改名為program_ocotp_t,并將其中和flash相關的Erase、Program等項刪掉,新增OTPWrite,新增項如下:

static const program_ocotp_t ocotp = {

[...]

{{'0x%08x' % (algo.symbols['OTPWrite'] + header_size + entry)}}, // OTPWrite

[...]

}

在執行腳本之前,先安裝python依賴的第三方庫,命令行如下:

pip install requirements.txt

執行腳本的命令行如下:

python generate_blobs.py --blob_start 0x20000000otp_prog.FLM

這里的0x20000000是將要運行算法的目標RAM地址,讀者可以根據芯片RAM位置配置。otp_prog.FLM為上一小節Keil MDK編譯出來的FLM文件。c_blob.c是生成的包含燒寫算法及相關信息的文件。

燒寫OTP

要通過SWD燒寫OTP,就需要實現一個SWD時序協議。ARM公司的開源項目DAPLINK實現了支持arm cortex系列MCU的SWD時序協議。具體的實現在文件swd_host.c內。

該項目地址是https://github.com/armmbed/daplink

這里我們使用swd_host.c中的接口來演示如何燒寫OTP。和OTP相關的操作接口函數主要有兩個:

uint8_t swd_write_memory(uint32_t address, uint8_t *data, uint32_t size);

uint32_t swd_flash_syscall_exec(const program_syscall_t *sysCallParam, uint32_t entry, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4, flash_algo_return_t return_type);

調用OTP算法需要的主要參數在文件c_blob.c中的結構體program_ocotp_t。我們仿照DAPLINK中program_target_t給出program_ocotp_t的聲明:

typedef struct {

    const uint32_t  init;

    const uint32_t  uninit;

    const uint32_t  OCOTPWrite;

    const program_syscall_t sys_call_s;

    const uint32_t  program_buffer;

    const uint32_t  algo_start;

    const uint32_t  algo_size;

    const uint32_t *algo_blob;

    const uint32_t  program_buffer_size;

} program_ocotp_t;

調用swd_write_memory來下載燒寫算法到目標地址的示例代碼如下:

swd_write_memory(ocotp.algo_start, (uint8_t *)ocotp.algo_blob, ocotp.algo_size);

調用OTP模塊初始化函數的示例代碼如下:

swd_flash_syscall_exec(&ocotp.sys_call_s, ocotp.init, 0, 0, 0, 0, FLASHALGO_RETURN_BOOL) ;

調用OTP模塊寫fuse函數的示例代碼如下:

swd_flash_syscall_exec(&ocotp.sys_call_s, ocotp.OTPWrite, fuse_idx, fuse_value, 0, 0, FLASHALGO_RETURN_BOOL);

到此,利用SWD燒寫OTP就介紹完了。

如果讀者熟悉燒寫flash的流程,會發現燒寫OTP和燒寫flash沒有差別。

OTP的值可以放在編程器的配置文件中,和固件存儲在一起。要想保護OTP的值,可以將它們存儲在硬件安全模塊(HSM)中。筆者參與的基于RT1020的離線編程器采用了文章中描述的方法燒寫OTP。該項目預計明年初會以應用筆記的方式發布在恩智浦官網。

限于篇幅,腳本中有些和flash相關的域我沒有刪掉,相信聰明的讀者可以自行完成。

審核編輯:湯梓紅出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • NXP
    NXP
    +關注

    關注

    60

    文章

    1278

    瀏覽量

    184048
  • FlaSh
    +關注

    關注

    10

    文章

    1633

    瀏覽量

    147942
  • OTP
    OTP
    +關注

    關注

    4

    文章

    201

    瀏覽量

    47143
  • 燒寫
    +關注

    關注

    0

    文章

    57

    瀏覽量

    14278
  • SWD
    SWD
    +關注

    關注

    1

    文章

    57

    瀏覽量

    11829

原文標題:基于SWD離線燒寫OTP

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    KEIL+SWD+JLINK仿真不能

    剛接觸STM32F407, 在下載和在線調試階段碰到了問題,請求幫助,具體如下:1、第一次很順利,程序寫進去,好像也可以進行在線調試;2、第二次
    發表于 01-02 10:01

    swd方法

    1.JTAG的(開發板為例子)、2.swd方法
    發表于 08-05 07:07

    SWD離線

    SWD離線器本項目使用STM32F103RBT6作為主控,基于ST官方CMSIS-DAP項目進行修改,實現可脫機、可去讀保護
    發表于 08-06 09:50

    怎樣去使用一種SWD離線器呢

    SWD離線器有哪些功能?怎樣去使用一種SWD離線
    發表于 11-10 06:07

    CH573量產是留串口呢還是SWC、SWD呢?

    準備用573做一批東西,計劃畫板了,也買了官方離線器,脫機看說明,脫機
    發表于 09-05 07:02

    Jlink轉SWD頂針

    Jlink轉成SWD接口,底下是頂針接口,方便小批量程序
    發表于 06-03 16:57 ?0次下載

    NXP PMIC芯片步驟

      如果用戶打算查看芯片是否已經programed,可以通過Blankcheck進行空片檢查。需要特別提醒的是,因為OTP是只能一次的,所以建議先
    發表于 09-18 09:50 ?21次下載
    NXP PMIC芯片<b class='flag-5'>燒</b><b class='flag-5'>寫</b>步驟

    什么是單片機軟件?如何

    什么是單片機軟件? 什么是單片機軟件? 簡單點說,就是把你寫好代碼(C或者是匯編)專程的機器語言通過一定的方式下載到單片機中。稱為
    發表于 04-14 11:04 ?3.5w次閱讀

    升壓型STC離線程序器設計方案

    本電路是借鑒stc官方離線器原理圖增加了升壓電路,輸出36v電壓 ,可為需要高壓供電的板子程序。其中單片機程序只需要在stc
    的頭像 發表于 01-12 11:41 ?2646次閱讀

    STM32 MCU 的軟件方法探討

    . 通過STlink來進行軟件的。對于廣大的開發 者來說,用STlink來進行是最簡單和常用的方法。一般來說STLink 可以支持JATG模式和
    發表于 10-25 20:51 ?18次下載
    STM32 MCU 的軟件<b class='flag-5'>燒</b><b class='flag-5'>寫</b>方法探討

    ALTERA CPLD離線方案設計(MCU模擬JTAG)

    在含有CPLD芯片的電子產品中,由于代碼中的BUG需要升級固件,如果以前的固件內沒有離線系統,那么必須要通過專門的工具把固件下載到C
    發表于 11-05 16:21 ?14次下載
    ALTERA CPLD<b class='flag-5'>離線</b><b class='flag-5'>燒</b><b class='flag-5'>寫</b>方案設計(MCU模擬JTAG)

    PIC OTP 單片機程序方法

    作者最近需要對PIC品牌的8位OPT 單片機進行程序;作者第一次使用這種OTP單片機,按照慣性遇到的問題一一記錄一下;MCU最小系統與
    發表于 11-16 12:51 ?12次下載
    PIC <b class='flag-5'>OTP</b> 單片機程序<b class='flag-5'>燒</b><b class='flag-5'>寫</b>方法

    JTAG/SWD/ISP/SWIM詳解單片機的四種方式

    JTAG/SWD/ISP/SWIM詳解單片機的四種方式單片機是一種可編程控制器,搭好硬件電路后,可以利用程序實現很多非常復雜的邏輯功能,與純硬件電路相比,簡化了硬件外圍的設計、方便了邏輯
    發表于 12-03 18:36 ?20次下載
    JTAG/<b class='flag-5'>SWD</b>/ISP/SWIM詳解單片機的四種<b class='flag-5'>燒</b><b class='flag-5'>寫</b>方式

    STM32:程序方式

    ST-link下載器程序使用專門的編程器/調試器,具有下載功能和調試功能,還可以和IDE結合,實現一鍵下載和調試。這種接口是通過引腳直連ARM內核的,擁有較高的權限。實物圖:引腳圖:1. SWD
    發表于 12-07 10:51 ?15次下載
    STM32:程序<b class='flag-5'>燒</b><b class='flag-5'>寫</b>方式

    如何使用串口來給GD32程序

    話說本人使用的是GD32F103VCT6(或GD32F103VET6),采用SWD的方式,確實一直用的好好的。但是,量產的多少,總會出現一些意想不到的情況,比如引出SWD
    的頭像 發表于 12-14 17:03 ?1.5w次閱讀
    主站蜘蛛池模板: 日韩精品一区二区亚洲AV观看| 亚洲欧美日韩综合影院| 一本道高清码| 国产99久久久欧美黑人刘玥| 快播可乐网| 亚洲AV无码乱码国产麻豆穿越| bl被教练啪到哭H玉势| 久久国产影院| 亚洲AV综合99一二三四区| 爱看吧孕妇网| 久久伊人精品青青草原2021| 亚洲 欧美 中文 日韩 另类| 99久久久久国产精品免费| 久久99精品国产99久久6男男| 私人玩物黑丝| qvod免费电影| 美女一级毛片免费不卡视频| 夜色55夜色66亚洲精品网站| 国产女人喷潮视频免费| 色尼玛亚洲综合| www.av在线| 男生插曲女生身全过程| 在线广播收听| 解开白丝老师的短裙猛烈进入| 卫生间被教官做好爽HH视频| 播色屋97超碰在人人| 哪灬你的鸣巴好大| 中文字幕一区二区三区在线观看| 黄色a三级三级三级免费看| 无羞耻肉动漫在线观看| 跪趴式啪啪GIF动态图27报| 欧洲老妇人bb| 99精品福利视频| 麻豆高潮AV久久久久久久 | 亚洲国产精品第一影院在线观看| 丰满饥渴老太性hd| 日本午夜看x费免| 厕所xxxxx| 日本乱hd高清videos| 成片免费观看视频大全| 男人桶爽女人|