日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ALTERA CPLD离线烧写方案设计(MCU模拟JTAG)

發布時間:2024/3/7 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ALTERA CPLD离线烧写方案设计(MCU模拟JTAG) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在含有CPLD芯片的電子產品中,由于代碼中的BUG需要升級固件,如果以前的固件內沒有離線燒寫系統,那么必須要通過專門的燒寫工具把固件下載到CPLD中去(如USB Blaster),但這樣非常繁瑣,而且不方便售后服務,所以代碼內集成離線燒寫系統的重要性可見一斑。
廢話不多說,直接進入正題!!!

方案一:ALTERA 官方Jam STAPL Byte-Code Player Version 2.2

點擊官方源碼跳轉到官方下載頁面
該方案可移植到DOS、嵌入式(包括STM32等MCU)、windows等平臺,采用.jbc二進制文件(可以由quartus軟件生成)作為程序文件進行編程。
移植到MCU(STM32為例子)額外注意事項如下:
1、JBC文件中的數據到提出出來存放到一個數組中(由jbc2data.c得到)
2、移植參考STM32的CPLD離線燒寫系統設計.pdf、源碼中的readme.txt、AN 122 Using Jam STAPL for ISP via an Embedded Processor.pdf文檔
3、根據平臺屏蔽或者刪除掉不相關的函數、頭文件
4、Jam STAPL Byte-Code Playe源碼中的標準請參考jesd71_stapl.pdf
5、源碼本身占用大概20K的空間,另外還要占用大概16K以上的RAM空間(因為代碼中申請了非常多的堆空間)
6、.jbc文件可由quartus II ->代碼下載頁面 -> file -> create Jam、Svf、Jbc… -> Jam STAPL Byte-Code 2.0(.jbc)生成 (方案二的.svf文件也在這里生成,一般選擇1MHz的TCK頻率)

移植后成功升級CPLD固件的輸出信息:

方案二:由SVF文件獲得編程細節,模擬JTAG進行編程

重要參考文章:
1、MCU模擬JTAG接口對LATTICE CPLD FPGA 進行在線編程加載
NOTE:
1)、該文章內JTAGState結構體中的Pattern為TMS對應不同狀態的值,如IDLE->SHIFTIR,TMS從1->1->0->0變化(計為0xC0),共4個TCK。
2)、Lattice與Altera的SVF文件有很大區別,所以只需要看懂Excute_SIR、SDR、Set_JTAG_State_Machine()等幾個函數即可

2、ARM JTAG 調試原理.pdf(仔細讀懂里面的狀態機轉換)

SVF文件部分細節如下(生成方法同生成.jbc文件類似,注意TCK頻率不宜過高,1MHz即可):

! ! ! TRST ABSENT; ENDDR IDLE; ENDIR IRPAUSE; STATE IDLE; SIR 10 TDI (2CC); RUNTEST IDLE 1003 TCK ENDSTATE IDLE; ! ! ! !CHECKING SILICON ID ! ! ! SIR 10 TDI (203); RUNTEST 8 TCK; SDR 13 TDI (0089); SIR 10 TDI (205); RUNTEST 8 TCK; SDR 16 TDI (FFFF) TDO (8232) MASK (FFFF); SDR 16 TDI (FFFF) TDO (2AA2); SDR 16 TDI (FFFF) TDO (4A82); SDR 16 TDI (FFFF) TDO (8C0C); SDR 16 TDI (FFFF) TDO (0080);

方案思路:因為.svf文件描述的是JTAG的編程細節,只要我們從.svf文件中提取出相應數據,包括指令數據、輸入輸出數據等,然后按照對應指令執行即可。
例子:

SIR 10 TDI (203);

該語句表示發送10位指令數據0x203;通過算法處理該語句,提取出該語句的有效信息為"IR"指令、“10"位數據、數據為“0x203”,MCU模擬JTAG編程時,先匹配命令"IR",再發送相應位數的指令數據即可,其他命令同理可得(提取算法需要自己寫,可用Qt的正則表達式提取)。

//命令可以用如下數據對應typedef enum{RESET_CMD = 0x00,IDLE_CMD = 0x01,RUN_TCK = 0x02,RUN_IDLE_TCK = 0x03,SIR_CMD = 0x04,SDR_DIR = 0x05,SDR_TDO = 0x06,SDR_TDO_MASK = 0x07,INVALID_CMD = 0xFF}JTAG_CMD;

重要提示:.jbc的編程波形幾乎與svf文件中描述的一致,所以可以通過.jbc文件的編程波形(由邏輯分析儀捕捉得到)分析、修改自己的代碼
NOTE:文章末尾有部分.jbc運行編程時測得的波形文件(由方案一得到,邏輯分析儀軟件為KingstVIS,方案一的波形與quratus II直接下載.jbc文件的波形主要區別于IDLE狀態下,方案一中TCK為低,quartus一直運行TCK)

由KingstVIS邏輯分析儀得到的.jbc編程波形

步驟一:
提取svf文件中的數據存到對應數組,分別存到命令數組、數據數組、TCK數組、TDI數組、TDO數組、MASK數組中

#define Get_CMD(x) cmd_arry[x] #define Get_DATA(x) data_arry[x] #define Get_TCK(x) tck_arry[x] #define Get_TDI(x) tdi_arry[x] #define Get_TDO(x) tdo_arry[x] #define Get_MASK(x) mask_arry[x]

步驟二:
匹配對應命令,然后指令對應指令

//成功返回0 //錯誤代碼: //1:Excute_SIR //2:Excute_SDR //3和4:輸出與預期值不符合 BYTE Jtag_Excute(void){DWORD tck=0,cmd_index=0,data_index=0,tck_index=0,tdi_index=0,tdo_index=0,mask_index=0;DWORD cmd_size= CMD_FILE_SIZE;JtagGpioInit();while(cmd_size--){//提取命令switch(Get_CMD(cmd_index++)){case RESET_CMD:CurState = JBIRESET;Set_JTAG_State_Machine(JBIRESET); delay_us(1000);break;case IDLE_CMD:Set_JTAG_State_Machine(IDLE);break;case RUN_TCK:if(Get_TCK(tck_index) == 50000) tck = 500003;else tck = Get_TCK(tck_index);delay_us(tck);tck_index++;break;case RUN_IDLE_TCK:Set_JTAG_State_Machine(IDLE);if(Get_TCK(tck_index) == 50000) tck = 500003;else tck = Get_TCK(tck_index);delay_us(tck);tck_index++;break;case SIR_CMD:if(JBISUCCESS != Excute_SIR(Get_TDI(tdi_index++),Get_DATA(data_index++))) return 1; break;case SDR_DIR:if(JBISUCCESS != Excute_SDR(Get_DATA(data_index++),Get_TDI(tdi_index++),0,0)) return 2;break;case SDR_TDO:TDO_DATA = Get_TDO(tdo_index++);if(JBISUCCESS != Excute_SDR(Get_DATA(data_index++),Get_TDI(tdi_index++),1,0)) return 3;break;case SDR_TDO_MASK:TDO_DATA = Get_TDO(tdo_index++);TDO_MASK = Get_MASK(mask_index++);if(JBISUCCESS != Excute_SDR(Get_DATA(data_index++),Get_TDI(tdi_index++),1,1)) return 4;break;default:break;}}Set_JTAG_State_Machine(IDLE);Set_JTAG_State_Machine(JBIRESET); printf("CPLD 代碼升級成功\r\n");return 0; }

NOTE:方案一源碼占用資源非常多,而且代碼量非常大,方案二幾乎不占用RAM資源,而且真正的代碼就只有一百多行,非常便于理解,同樣非常適用于RAM資源緊張的MCU中。

資料總結:
MCU模擬JTAG燒寫CPLD固件的文檔資料:https://download.csdn.net/download/weixin_42518229/12912882

Altera CPLD升級官方Demo 移植到STM32F103ZGT6工程
https://download.csdn.net/download/weixin_42518229/18944029

總結

以上是生活随笔為你收集整理的ALTERA CPLD离线烧写方案设计(MCU模拟JTAG)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男生和女生一起搞鸡 | 欧美一区二区三区四区视频 | 亚洲色图1 | 91麻豆精品在线观看 | 欧美在线性爱视频 | 久久偷看各类女兵18女厕嘘嘘 | 无码精品国产一区二区三区免费 | 亚洲激情社区 | 天天av天天干 | 操女人的逼逼 | 亚洲最新av网址 | 草草视频在线 | 91黄色影视 | 中文在线不卡视频 | 一级a毛片免费观看久久精品 | 草比网站 | 国产欧美久久久久久 | 日韩欧美在线播放 | 亚洲另类色综合网站 | av剧情在线 | 亚洲在线视频一区 | 免费a网站 | 色涩涩| 污污网站在线观看视频 | 黄色网页免费看 | 午夜在线一区 | 美女狂揉羞羞的视频 | av中文字幕av | 午夜影院在线观看 | 三上悠亚人妻中文字幕在线 | 91xxxxx| 久久久久久久999 | 国产高清99| 六月综合网 | 九九热精品视频在线 | 91视频网页 | 国产亚洲av片在线观看18女人 | 另类天堂| 免费拍拍拍网站 | 老熟女重囗味hdxx69 | 中文字幕日本人妻久久久免费 | 伊人久久五月天 | 国产伊人精品 | 中文字幕1区2区 | 欧美贵妇videos办公室 | 超碰在线人人干 | 国产黄大片 | 轻点好疼好大好爽视频 | 伊人精品在线观看 | 久久成人av| www.haoav| 最近中文字幕免费 | 免费看成人片 | 欧美xxxx非洲 | 伊人网视频在线 | 乱人伦中文字幕 | 人人澡人人插 | 国产亚洲女人久久久久毛片 | 蜜桃臀aⅴ精品一区二区三区 | 日韩色影院 | 男人捅爽女人 | 国产剧情一区二区三区 | 精品国产三级 | 干日本少妇首页 | 婷婷色在线观看 | 成人在线视频一区 | 一本一道久久a久久精品蜜桃 | 亚洲性夜 | 成人在线观看亚洲 | 日韩毛片一区二区三区 | 爱看av在线| 男男gay同性三级 | 日韩毛片在线观看 | 男人的天堂视频网站 | 短视频在线观看 | av高清| www.人人草 | 欧美性开放视频 | 日韩一区精品 | 少妇荡乳情欲办公室456视频 | 激情噜噜 | 国产精品欧美性爱 | 国产日韩在线播放 | 懂色av一区 | 中文自拍 | 丰满人妻一区二区三区免费视频 | 欧美性综合| 亚洲情se| 神马久久久久久久久 | 欧美精品1区2区3区 精品成人一区 | 精品99久久久 | 三级久久久 | 亚洲美免无码中文字幕在线 | 亚洲AV无码精品久久一区二区 | 亚洲系列 | 草的我好爽 | 91视频插插插 | 成年人毛片| 麻豆资源 |