開發K1986BE1QI(航空)調試板

開發K1986BE1QI(航空)調試板

幾年前,我了解了 Milandr 公司的俄羅斯微控制器。 2013年,工程師們正熱烈討論2008-2015年聯邦目標計畫「電子元件基礎與無線電電子設備發展」的首批成果。當時K1986BE9x控制器(Cortex-M3核心)已經發布,1986BE1T控制器(Cortex-M1核心)剛剛出現。在 LQFP-144 塑膠外殼中,它在文件中的名稱為 K1986BE1QI(航空),在微電路本身上的名稱為 MDR32F1QI。在製造商的網站上,它有後綴“avia”,因為它具有特定於飛機行業的介面(ARINC 429,MIL_STD_1553)。

令人驚訝的是,在分發這些控制器時,Milandr 準備了調試套件和用於與外圍設備協同工作的子程序庫,「但沒有對庫的正確性提供任何額外的保證或義務」。該庫與意法半導體的標準外設庫類似。總的來說,所有基於 Cortex-M 核心建構的 ARM 控制器都有許多共同點。因此,對新的俄羅斯控制員的熟悉度進展很快。對於購買品牌調試套件的用戶,在使用過程中會提供技術支援。

開發K1986BE1QI(航空)調試板
微控制器調試套件 1986BE1T,© Milandr

然而,隨著時間的推移,新的微電路和庫的「初期問題」開始顯現。測試韌體範例運行時沒有任何明顯問題,但經過重大修改後,開始出現崩潰和錯誤。我實踐中遇到的第一個「問題」是 CAN 控制器運作中出現無法解釋的故障。一年後,在早期版本的 1986BE1T(avia)控制器上發現了該模組的問題 MKIO(資訊交換多工通道)。整體而言,2016 年之前這些微控制器的所有修訂版用途都有限。我們花了大量的時間和精力來發現這些問題,現在可以在 錯誤清單(勘誤表).

一個令人不快的特點是,工作和故障排除不是在調試板上完成,而是在計劃批量工廠生產的原型設備板上完成。除了 JTAG 連接器之外,那裡通常什麼都沒有。連接邏輯分析儀很困難且不方便,通常沒有 LED 或螢幕。為此,我萌生了創建自己的調試板的想法。

一方面,市場上有品牌調試套件,以及來自澤列諾格勒的 LDM-Systems 的精彩電路板。另一方面,這些產品的價格令人難以置信,並且沒有擴充卡的基本功能不符合預期。我對焊接控制器和針腳連接器的電路板不感興趣。而且更有趣的板子價格昂貴。

開發K1986BE1QI(航空)調試板
調試板 MILANDR LDM-HELPER-K1986BE1QI-FULL,© LDM Systems

Milandr 公司擁有獨特的定價政策和行銷。因此,可以獲得一些微電路的免費樣品,但這只適用於法人實體,並且需要經過官僚程序。一般來說,金屬陶瓷錶殼內的微電路無論從字面上或像徵意義上來說,都是金色的。例如,1986BE1T控制器在莫斯科的售價為14至24萬盧布。 1645RU6U靜態記憶體晶片的價格為15000盧布起。這是所有產品的價格順序。因此,即使是與政府簽訂合約的專業研究機構也不願承擔這樣的價格。民用塑膠外殼微電路價格明顯便宜,但主流供應商無法提供。此外,我認為塑膠外殼中的微電路的質量比“金”的要差。例如,如果不增加快閃記憶體延遲參數,我就無法讓 K1986BE1QI 控制器以 128MHz 的速度運作。同時該控制器的溫度上升到40-50C。但 1986BE1T 控制器(「黃金」)無需額外設定即可 128 MHz 啟動,並且保持冷態。他真的很棒。

開發K1986BE1QI(航空)調試板
「Golden」微控制器 1986BE1T,(c)Milandr

我很幸運,仍然可以從 LDM Systems 零售店購買塑膠外殼中的微控制器,並且所有電路板原理圖都可以免費獲得。糟糕的是,在網站上,在控制器的照片中,您可以看到標記,表明這是 4 年的第 2014 次修訂,即有缺陷。我想了很久要不要買。就這樣幾年過去了…

創建調試板的想法並沒有消失。漸漸地,我形成了所有的需求,並思考如何將所有這些放在一塊板上,以便緊湊且便宜。同時,我從中國訂購了缺少的零件。我並不著急——一切都是我自己做的。中國供應商是出了名的馬虎——我不得不從不同的地方訂購相同的東西才能得到我需要的一切。此外,一些記憶體晶片被發現是二手的——顯然是從損壞的設備上焊接過來的。這件事後來一直困擾著我。

購買微控制器 Milandr K1986BE1QI(航空)並非易事。在同一家 Chip and Dip 商店的「訂購商品」部分,我只找到了售價 1986 盧布的 K92BE740QI,但它不適合我。唯一的選擇是從 LDM-Systems 購買不太新的修訂版,價格為 2000 盧布。由於我在其他任何地方都找不到替代品,所以我決定購買現有的產品。令我驚訝的是,我買了一個全新的控制器,生產日期為 2018 年 6 月,修訂版 1820+(XNUMX)。該網站仍然有一張舊照片,並且在撰寫本文時控制器不可用...

開發K1986BE1QI(航空)調試板
技術包裝中的微控制器 K1986BE1QI(航空),(c)作者拍攝

我的開發板的主要技術特點 MDB1986 以下幾點:

  • 內建與 J-Link 和 CMSIS-DAP 相容的調試器-程式設計器;
  • 靜態記憶體4Mbit(256k x 16,10ns);
  • 64Mbit快閃記憶體晶片,Winbond 25Q64FVSIG;
  • 具有RTS和CTS線的RS-232介面收發器;
  • 乙太網路、USB、CAN的介面和連接器;
  • 7段顯示控制器MAX7221;
  • 用於與 MICO(MIL_STD_1553)和 ARINC429 配合使用的針連接器;
  • 光電晶體管 Everlight PT17-21C;
  • 五色 LED、重置按鈕和兩個使用者按鈕;
  • USB連接埠供電為5伏特;
  • PCB尺寸100 x 80,毫米

我喜歡 STM-Discovery 系列板,因為它們有一個內建的編程器-調試器 - ST-Link。專有的 ST-Link 僅適用於意法半導體控制器,但幾年前,可以更新 ST-Link 中的韌體並取得 SEGGER J-Link OB(板載)調試器。雖然法律限制此類調試器只能與意法半導體開發板一起使用,但實際上其潛力是無限的。因此,有了 J-Link OB,就可以在調試板上擁有內建的編程器-調試器。我想指出的是,LDM-Systems 產品使用 CP2102(Usb2Uart)轉換器,它只能閃存。

開發K1986BE1QI(航空)調試板
STM32F103C8T6 微控制器,真實與虛假,(c)作者拍攝

因此,有必要購買原廠的 STM32F103C8T6,因為專有韌體無法與克隆產品正確配合使用。我對這個論點表示懷疑,決定嘗試中國公司 CKS 的 CS32F103C8T6 控制器。我對控制器本身沒有任何抱怨,但專有的 ST-Link 韌體在其中不起作用。 J-Link 部分工作 - 檢測到了 USB 設備,但編程器沒有執行其功能並不斷提醒它「有缺陷」。

開發K1986BE1QI(航空)調試板
在非原廠控制器上執行偵錯器時出錯

我並沒有就此止步,首先編寫了用於閃爍 LED 的固件,然後透過 JTAG 協定實現了 IDCODE 請求。我在 Discovery 板上安裝的 ST-Link 程式設計器和 ST-Link 實用程式可以毫無問題地刷新 CS32F103C8T6。因此,我確信我的電路板是有效的。令我高興的是,目標控制器 K1986BE1QI(飛機)透過 TDO 線愉快地發出了其 IDCODE。

開發K1986BE1QI(航空)調試板
帶有編碼IDCODE響應的TDO訊號線的波形圖,(c)作者拍攝

開發K1986BE1QI(航空)調試板
因此,SWD 連接埠對於調試器本身和檢查 IDCODE 非常有用

剩下的唯一選擇就是使用調試器。 CMSIS-DAP(調試存取連接埠)。從 ARM 來源建立專案並非易事,我從 X893,然後我嘗試了DAP42。不幸的是,Keil uVision 凍結了並且不想與他們合作。因此,我用專有的 STM32F103C8T6 替換了調試器晶片,從此再也沒有出現過這個問題。

開發K1986BE1QI(航空)調試板
成功運行內建調試器J-Link STLink V2

當我擁有未來開發板的所有關鍵組件的庫存後,我進入 Eagle CAD 並發現它們不在元素庫中。沒有其他選擇——我必須自己畫。同時,我還為記憶體製作了著陸點,為乙太網路製作了 HanRun 連接器,並為電阻器和電容器添加了框架。可以找到專案文件和元件庫 我在 GitHub 上有.

MDB1986調試板示意圖開發K1986BE1QI(航空)調試板

該板由來自 USB 連接埠的 5 伏特直流電源供電。主機板上有兩個 USB Type-B 連接埠。一個用於程式設計器,第二個用於K1986BE1QI控制器。董事會可以透過其中一個來源進行操作,也可以同時透過兩個來源進行操作。最簡單的負載調節和電源線保護是使用肖特基二極體在 D2 和 D3(SS24)電路中實現的。您也可以在圖中看到 1 mA 的自恢復保險絲 F2 和 F500。 USB 連接埠訊號線受 USBLC6-2SC6 二極體組件保護。

ST-Link 偵錯器-程式設計器電路為許多人所熟知;它可以在 STM32-Discovery 板和其他來源的文件中找到。對於 ST-Link/J-Link-OB/DAP 克隆(可選)的初始固件,我帶出了 SWDIO(PA13)、SWCLK(PA14)、GND 線。許多人使用 UART 進行固件,並被迫拉動 BOOT 跳線。但我發現 SWD 更方便,而且該協議還允許調試。

電路板上的幾乎所有組件均由 3.3 伏特供電,該電壓來自 AMS1117-3.3 電壓調節器。為了抑制電磁幹擾和電流湧浪,使用由BLM31PG系列電容器和扼流圈製成的LC濾波器。

MAX7 7221 段顯示驅動器值得單獨提及。根據規範,建議電源為 4 至 5.5 伏,高訊號電平(邏輯一)不低於 3.5 V(0.7 x VCC),電源為 5 V。 K1986BE1QI(avia)控制器具有邏輯一輸出,對應電壓為 2.8 至 3.3V。訊號電平明顯不匹配,可能會擾亂正常運作。我決定用 7221V 為 MAX4 供電,並將訊號電平降至 2.8V(0.7 x 4 = 2.8)。為此,在驅動電源電路中串聯安裝了二極體D4(RS1A或FR103)。總壓降為0.9V(肖特基二極體0.3V和二極體0.6V),一切正常。

K1986BE1QI(航空)微控制器的大多數連接埠相容於高達 5V 的訊號。因此,使用同樣採用 2551V 電壓運轉的 MCP5 CAN 收發器不會有問題。原理圖中的 RS-232 收發器是 MAX3232,但我實際上使用了德州儀器的 SN65C3232D,因為它在 3.3V 下工作並提供高達 1Mbit/s 的速度。

該板包含 4 個石英諧振器 - 一個用於調試器(8 MHz),三個用於目標微控制器 K1986BE1QI(航空),其標稱值如下:32.768 kHz、16 MHz、25 MHz。這些都是必要的組件,因為內建 RC 產生器的參數範圍很廣,從 6 到 10 MHz。內建乙太網路控制器的運作需要 25 MHz 的頻率。在 Milandra 網站上(可能是錯誤),由於某種原因,它表明塑膠外殼中沒有以太網。但我們將依賴規範和事實。

創建我自己的偵錯板的一個重要動機是能夠使用外部系統匯流排 EBC(外部匯流排控制器),它本質上是一個平行連接埠。 K1986BE1QI 微控制器(avia)可讓您連接和使用外部儲存晶片和周邊設備,例如 ADC、FPGA 等。外部系統匯流排的功能非常大——您可以使用 8 位元、16 位元和 32 位元靜態 RAM、ROM 和 NAND 快閃記憶體。對於32位元資料的讀寫,控制器可以自動對2位元微電路進行16次對應的操作,對8位元微電路進行4次對應的操作。顯然,使用 32 位元資料匯流排執行 32 位元 I/O 操作速度最快。缺點是程式需要操作32位元數據,且電路板必須鋪設32條軌道。

開發K1986BE1QI(航空)調試板
二手靜態 RAM 晶片(猜猜哪一個有缺陷)

一個平衡的解決方案是使用16位元記憶體晶片。我有 Integrated Silicon Solutions Inc. 的庫存晶片(ISSI IS61LV25616AL、16 x 256k、10 ns、3.3V)。當然,Milandr 有自己的靜態記憶體晶片。 1645RU系列但它們太貴了,而且很難買到。或者,還有腳相容的三星 K6R4016V1D。之前我提到過,這些晶片已經被使用過,而我最初安裝的副本在第 15 條數據線中出現了故障和混亂的值。我花了好幾天的時間才找到硬體錯誤,當我用一個可以正常工作的晶片替換損壞的晶片時,我感到更加滿足。儘管如此,使用外部記憶體的速度還是不盡人意。

外部匯流排和獨立模式K1986BE1QI 微控制器(航空)具有獨特的獨立模式,該模式設計用於透過外部匯流排直接外部存取乙太網路和 MKIO(MIL_STD_1553)控制器,核心處於重設狀態,即未使用。此模式對於沒有乙太網路和/或MICRO的處理器和FPGA來說很方便。
連接圖如下:

  • MCU資料匯流排(D0-D15) => SRAM(I/O0-I/O15),
  • 位址匯流排 MCU(A1-A18) => SRAM(A0-A17),
  • 控制 MCU(nWR,nRD,PortC2) => SRAM (WE,OE,CE),
  • SRAM(UB,LB)透過電阻連接或拉至接地。

CE線透過電阻上拉至電源,MCU位元組採樣接腳(BE0-BE3)未使用。在劇透下我提供了初始化連接埠和外部匯流排控制器的程式碼。

連接埠和EBC(外部匯流排控制器)的初始化

void SRAM_Init (void)
{
	EBC_InitTypeDef          EBC_InitStruct = { 0 };
	EBC_MemRegionInitTypeDef EBC_MemRegionInitStruct = { 0 };
	PORT_InitTypeDef         initStruct = { 0 };

	RST_CLK_PCLKcmd (RST_CLK_PCLK_EBC, ENABLE);

	PORT_StructInit (&initStruct);
	//--------------------------------------------//
	// DATA PA0..PA15 (D0..D15)                   //
	//--------------------------------------------//
	initStruct.PORT_MODE      = PORT_MODE_DIGITAL;
	initStruct.PORT_PD_SHM    = PORT_PD_SHM_ON;
	initStruct.PORT_SPEED     = PORT_SPEED_FAST;
	initStruct.PORT_FUNC      = PORT_FUNC_MAIN;
	initStruct.PORT_Pin       = PORT_Pin_All;
	PORT_Init (MDR_PORTA, &initStruct);	
	//--------------------------------------------//
	// Address PF3-PF15 (A0..A12), A0 - not used. //
	//--------------------------------------------//
	initStruct.PORT_FUNC      = PORT_FUNC_ALTER;
	initStruct.PORT_Pin       = PORT_Pin_4  | PORT_Pin_5  |
	                            PORT_Pin_6  | PORT_Pin_7  |
	                            PORT_Pin_8  | PORT_Pin_9  |
								PORT_Pin_10 | PORT_Pin_11 |
	                            PORT_Pin_12 | PORT_Pin_13 |
								PORT_Pin_14 | PORT_Pin_15;
	PORT_Init (MDR_PORTF, &initStruct);	
	//--------------------------------------------//
	// Address PD3..PD0 (A13..A16)                //
	//--------------------------------------------//
	initStruct.PORT_FUNC      = PORT_FUNC_OVERRID;
	initStruct.PORT_Pin       = PORT_Pin_0 | PORT_Pin_1 |
	                            PORT_Pin_2 | PORT_Pin_3;
	PORT_Init (MDR_PORTD, &initStruct);	
	//--------------------------------------------//
	// Address PE3, PE4 (A17, A18)                //
	//--------------------------------------------//
	initStruct.PORT_FUNC      = PORT_FUNC_ALTER;
	initStruct.PORT_Pin       = PORT_Pin_3 | PORT_Pin_4;
	PORT_Init (MDR_PORTE, &initStruct);	
	//--------------------------------------------//
	// Control PC0,PC1 (nWE,nOE)                  //
	//--------------------------------------------//
	initStruct.PORT_FUNC      = PORT_FUNC_MAIN;
	initStruct.PORT_Pin       = PORT_Pin_0 | PORT_Pin_1;
	PORT_Init (MDR_PORTC, &initStruct);	
	//--------------------------------------------//
	// Control PC2 (nCE)                          //
	//--------------------------------------------//
	initStruct.PORT_PD        = PORT_PD_DRIVER;
	initStruct.PORT_OE        = PORT_OE_OUT;
	initStruct.PORT_FUNC      = PORT_FUNC_PORT;
	initStruct.PORT_Pin       = MDB_SRAM_CE;
	PORT_Init (MDR_PORTC, &initStruct);	

	//--------------------------------------------//
	// Initialize EBC controler                   //
	//--------------------------------------------//
	EBC_DeInit();
	EBC_StructInit(&EBC_InitStruct);
	EBC_InitStruct.EBC_Mode             = EBC_MODE_RAM;
	EBC_InitStruct.EBC_WaitState        = EBC_WAIT_STATE_3HCLK;
	EBC_InitStruct.EBC_DataAlignment    = EBC_EBC_DATA_ALIGNMENT_16;
	EBC_Init(&EBC_InitStruct);
	
	EBC_MemRegionStructInit(&EBC_MemRegionInitStruct);
	EBC_MemRegionInitStruct.WS_Active   = 2;
	EBC_MemRegionInitStruct.WS_Setup    = EBC_WS_SETUP_CYCLE_1HCLK;
	EBC_MemRegionInitStruct.WS_Hold     = EBC_WS_HOLD_CYCLE_1HCLK;
	EBC_MemRegionInitStruct.Enable_Tune = ENABLE;
	EBC_MemRegionInit (&EBC_MemRegionInitStruct, EBC_MEM_REGION_60000000);
	EBC_MemRegionCMD(EBC_MEM_REGION_60000000, ENABLE);

	// Turn ON RAM (nCE)
	PORT_ResetBits (MDR_PORTC, MDB_SRAM_CE);
}

LQFP-144封裝的微控制器和TSOP-44封裝的記憶體具有許多互連引腳,並且在PCB上佔用大量空間。由於具有解決經濟學領域最佳化問題的經驗,我很清楚,首先需要將這些微電路放置在電路板上。我在各種來源看到對它的讚美評論 CAD TopoR(拓樸路由器)。我下載了試用版,但只有刪除了幾乎所有組件後才能夠匯出我的 Eagle CAD 專案。不幸的是,TopoR 程式甚至沒有幫助我在板上放置 10 個元素。首先,將所有元件放置在角落,然後沿著邊緣排列。我對這個選項並不滿意,很長一段時間我都是在熟悉的 Eagle CAD 環境中手動進行電路板佈線。

印刷電路板的一個重要元素是網版印刷。調試板上不僅要有電子元件的標籤,而且所有連接器也都應該貼上標籤。在電路板的背面,我放置了帶有控制器連接埠功能(主要、替代、重新定義、實際)的提醒表。我向知名的PCBWay公司訂購了在中國生產印刷電路板。我不會稱讚它,因為質量很好。他們可以做得更好,公差更小,但是 需額外付費.

開發K1986BE1QI(航空)調試板
製造的印刷電路板 MDB1986,(c)作者拍攝

我不得不用 40 瓦烙鐵和 POS-61 焊料「跪在膝蓋上」焊接元件,因為我很少焊接,每年 1-2 次,而且焊膏已經乾了。我還必須將中文 CS32F103 控制器更改為原始 STM32F103,然後更換內存。總的來說,儘管我還沒有檢查 RS-232 和 CAN 的運作情況,但我對目前的結果完全滿意。

開發K1986BE1QI(航空)調試板
MDB1986 調試板運行中-它發光發熱,(c)作者拍攝

在 Milandra 網站上你可以找到很多 學習控制器的訓練材料 1986BE9 系列(Cortex-M3 核心),但我沒有看到任何適用於 K1986BE1QI 微控制器(航空)的東西。在查閱了在那裡出版的資料、手冊和大學實驗室工作後,我很高興全國各地的人員都在接受與俄羅斯控制人員合作的培訓。大多數訓練材料都是為使用 I/O 連接埠、計時器、ADC、DAC、SPI、UART 做準備。使用不同的IDE開發環境(Keil,IAR,CodeMaster)。他們在某個地方使用 CMSIS 暫存器進行編程,而在某個地方使用 MDR 函式庫。必須提及資源 開始 Milandr,其中包含許多來自實踐程式設計師的文章。當然,我們不應該忘記 米蘭德拉論壇.

關於米蘭德拉的思考微電子技術在俄羅斯正在發展,Milandr 在這一過程中發揮著重要作用。出現了一些有趣的新微控制器,例如具有 SpaceWire 和 MKIO 介面的 1986BE81T 和“Elektrosila”(與 1986BE1 相同,可能存在同樣的問題)等。但對於普通學生、教師和土木工程師來說,購買這樣的微電路是不切實際的。這意味著工程界將無法快速識別該晶片的錯誤和問題。在我看來,首先需要在塑膠外殼中生產微電路,然後將其分發給所有相關方,並且只有經過專家測試(拉丁語 approbatio - 批准、認可)後,才能在金屬陶瓷外殼中準備修訂版,以防止所有可怕因素的影響。我希望在不久的將來我們都會對展覽會上宣布的新項目感到滿意。
我開發的調試板可以被任何人重複、修改並用於教育過程。首先,我為自己製作了這塊板子,但結果非常好, 我決定與大家分享.

K1986BE1QI(avia)是一款非常有趣的控制器,具有獨特的介面,可用於大學教學。我認為,在糾正控制器中發現的錯誤並通過認證測試後,控制器將真正意義上飛起來!

來源: www.habr.com

添加評論