K1986BE1QI(航空)調試板的開發

K1986BE1QI(航空)調試板的開發

幾年前,我認識了 Milandr 的俄羅斯微控制器。 那是2013年,工程師們熱烈討論2008-2015年聯邦目標計劃“電子元件基礎和無線電電子產品的發展”的第一個結果。 當時K1986BE9x控制器(Cortex-M3內核)已經發布,1986BE1T控制器(Cortex-M1內核)剛剛出現。 他在塑料 LQFP-144 外殼中,文檔中的名稱為 K1986BE1QI(航空),芯片本身的名稱為 MDR32F1QI。 在製造商的網站上,它具有後綴“air”,因為它具有特定於飛機工業的接口(ARINC 429,MIL_STD_1553)。

令人驚訝的是,在分發這些控制器時,米蘭德公司準備了調試套件和用於與外圍設備配合使用的子例程庫,“但對於該庫的正確性沒有任何額外的保證和義務。” 該庫類似於 STMicro electronics 的標準外設庫。 一般來說,所有基於 Cortex-M 內核構建的 ARM 控制器都有很多共同點。 出於這個原因,與新的俄羅斯管制員的熟悉很快。 對於購買專有調試套件的用戶,在使用過程中會提供技術支持。

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

然而,隨著時間的推移,新芯片和庫的“兒童病”開始出現。 固件的測試示例工作正常,沒有出現明顯問題,但經過重大修改後,崩潰和錯誤如雨點般降臨。 我實踐中的第一個“吞沒”是 CAN 控制器出現莫名其妙的故障。 一年後,在早期版本的 1986BE1T(空氣)控制器上發現了該模塊的問題 MCIO(多路信息交換通道)。 一般來說,2016 年之前這些微控制器的所有修訂版的用途都很有限。 我們花費了大量的時間和精力來識別這些問題,現在可以在以下位置找到這些問題的確認: 錯誤列表(勘誤表).

一個令人不快的特點是,必須在計劃用於批量工廠生產的原型設備的板上而不是在調試板上工作和處理錯誤。 除了 JTAG 連接器之外,通常沒有任何東西。 連接邏輯分析儀既困難又不方便,而且通常沒有 LED 和屏幕。 為此,我的腦海中出現了創建自己的調試板的想法。

一方面,市場上有品牌調試套件,以及來自 Zelenograd 的 LDM-Systems 的精美電路板。 另一方面,這些產品的價格讓人望而卻步,而且不帶擴展卡的基本功能也達不到預期。 我對帶有焊接控制器和排針的板不感興趣。 而且更有趣的板子價格昂貴。

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

“Milandr”公司擁有獨特的定價政策和營銷。 因此,可以免費獲得一些微電路的樣品,但這僅適用於法人實體,並且與官僚追求相關。 一般來說,陶瓷金屬封裝中的微電路無論從字面意義上還是比喻意義上都是金色的。 例如,1986BE1T 控制器在莫斯科的售價為 14 至 24 盧布。 1645RU6U靜態內存芯片售價15000盧布起。 這是所有產品的價格順序。 因此,即使是有國家命令的專業研究機構也會為了省錢而迴避這樣的價格。 民用塑料盒中的芯片要便宜得多,但主流供應商無法提供。 此外,在我看來,塑料外殼中的芯片質量比“金”還差。 例如,在不增加閃存延遲設置的情況下,我無法以 1986MHz 運行 K1BE128QI 控制器。 與此同時,該控制器的溫度升至40-50C。 但 1986BE1T(“黃金”)控制器在沒有額外設置的情況下以 128 MHz 啟動,並且保持冷狀態。 他真的很好。

K1986BE1QI(航空)調試板的開發
“金牌”微控制器 1986BE1T,(c) Milandr

我很幸運,塑料外殼中的微控制器仍然可以從 LDM Systems 零售店購買,並且所有電路板都可以免費獲得。 不好的是,在控制器照片上的網站上,可以看到一個標記,上面寫著這是 4 年的第四次修訂,即有缺陷。 我想了很久——買還是不買。 就這樣過了好幾年...

創建調試板的想法並沒有在任何地方消失。 漸漸地,我形成了所有的要求,並思考如何將所有這些都放在一塊板上,這樣既緊湊又不昂貴。 與此同時,我向中國人訂購了缺失的部件。 我並不著急——一切都是我自己做的。 中國供應商因草率而臭名昭著——我必須在不同的地方訂購同樣的東西才能得到我需要的一切。 此外,一些內存芯片被證明是二手的——顯然是用損壞的設備焊接而成的。 這件事後來打擊了我。

購買微控制器 Milandr K1986BE1QI(航空)並不是一件容易的事。 在同一家 Chip and Dip 商店的“Positions to order”部分中,我只找到了 K1986BE92QI,售價 740 盧布,但它不適合我。 唯一的選擇是以 2000 盧布的價格從 LDM-Systems 購買非全新版本。 由於我在其他地方找不到替代品,所以我決定購買現有的。 令我驚喜的是,他們賣給了我一個全新的 2018 年 6 月發布的控制器,修訂版 1820+ (XNUMX)。 該網站仍然有一張舊照片,在撰寫本文時控制器不可用......

K1986BE1QI(航空)調試板的開發
技術封裝中的微控制器 K1986BE1QI(航空),(c) 作者照片

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

  • 與 J-Link 和 CMSIS-DAP 兼容的內置調試器編程器;
  • 4Mbit 靜態內存(256k x 16,10 ns);
  • 閃存芯片64Mbit,Winbond 25Q64FVSIG;
  • 帶RTS和CTS線的RS-232接口收發器;
  • 以太網、USB、CAN 接口和連接器;
  • 7段顯示控制器MAX7221;
  • 用於與 MCIO (MIL_STD_1553) 和 ARINC429 配合使用的引腳連接器;
  • 光電晶體管億光PT17-21C;
  • 五個彩色 LED、一個重置按鈕和兩個用戶按鈕;
  • 它由 5 伏 USB 端口供電;
  • 印刷電路板尺寸 100 x 80,毫米

我喜歡 STM-Discovery 系列的板,因為它們有一個內置的編程器調試器 - ST-Link。 品牌 ST-Link 僅適用於 STMicroElectronics 控制器,但幾年前可以更新 ST-Link 中的固件並獲得 SEGGER J-Link OB(板載)調試器。 從法律上講,這種調試器只能用於 STMicroElectronics 板,但實際上其潛力並不受限制。 因此,有了 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 Utility 程序毫無問題地刷新了 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) 電路中的肖特基二極管上實現的。 另外,在圖中您還可以看到 1mA 時的自恢復保險絲 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.5V供電時,高信號電平(邏輯0.7)至少為5V(1986 x VCC)。 對於K1BE2.8QI控制器(航空),邏輯單元的輸出對應3.3至7221V的電壓。 顯然,信號電平不匹配可能會擾亂正常運行。 我決定用 4V 為 MAX2.8 供電,並將信號電平降低至 0.7V (4 x 2.8 = 4)。 為此,在驅動器電源電路中串聯安裝了二極管 D1(RS103A 或 FR0.9)。 總壓降為 0.3V(0.6V 肖特基二極管和 XNUMXV 二極管),一切正常。

K1986BE1QI 微控制器(航空)上的大多數端口都與高達 5V 的信號兼容。 因此,使用同樣採用 2551V 電壓工作的 MCP5 CAN 收發器不會產生問題。 圖中顯示了 MAX232 芯片作為 RS-3232 收發器,但實際上我使用的是德州儀器 (TI) 的 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 微控制器(航空)允許您連接和使用外部存儲芯片和外圍設備,例如 ADC、FPGA 等。 外部系統總線的可能性相當大 - 您可以使用 8 位、16 位和 32 位靜態 RAM、ROM 和 NAND 閃存。 對於讀/寫32位數據,控制器可以自動執行2位微電路的16個相應操作,以及8位微電路的4個操作。 顯然,32 位 I/O 操作對於 32 位數據總線來說是最快的。 缺點包括程序需要使用 32 位數據進行操作,並且電路板必須鋪設 32 條磁道。

K1986BE1QI(航空)調試板的開發
使用過的 SRAM 芯片(猜猜哪一個有缺陷)

一個平衡的解決方案是使用16位存儲芯片。 我最終選擇了 Integrated Silicon Solutions Inc. 的芯片。 (ISSI IS61LV25616AL,16x256k,10ns,3.3V)。 當然,“Milandr”公司擁有自己的靜態存儲芯片 1645RU系列但它們太貴了而且買不到。 另外,還有引腳兼容的三星 K6R4016V1D。 我之前提到過,IC 是二手的,我安裝的副本最初在 15 號數據線上不穩定且不穩定。 我花了幾天時間才發現硬件錯誤,當我用可用的芯片更換損壞的芯片時,我的滿足感就更大了。 儘管如此,使用外部存儲器的速度仍然有很多不足之處。

外部總線和獨立模式K1986BE1QI(航空)微控制器具有獨特的獨立模式,該模式設計用於通過外部總線直接從外部訪問以太網和MCIO控制器(MIL_STD_1553),同時內核處於復位狀態,即不曾用過。 此模式對於沒有以太網和/或 MCIO 的處理器和 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 — 閃亮且溫暖,(с) 作者照片

在“Milandra”網站上您可以找到足夠的 學習控制器的學習材料 1986BE9系列(Cortex-M3內核),但對於K1986BE1QI(航空)微控制器,我在那裡看不到任何東西。 在審查了那裡發布的材料、大學手冊和實驗室工作後,我很高興全國各地的人員正在接受與俄羅斯管制員合作的培訓。 大多數培訓材料都是為I/O端口、定時器、ADC、DAC、SPI、UART而準備的。 使用不同的 IDE(Keil、IAR、CodeMaster)。 他們在某個地方使用 CMSIS 寄存器進行編程,在某個地方使用 MDR 庫。 必須提及資源 啟動米蘭德爾,其中包含許多來自實踐程序員的文章。 當然,我們不應該忘記 米蘭德拉論壇.

米蘭德拉的思考俄羅斯的微電子學正在發展,“Milandr”公司在這一過程中發揮著重要作用。 新的有趣的微控制器出現,例如,帶有 SpaceWire 和 MKIO 接口的 1986BE81T 和 Elektrosila(與 1986BE1 相同,可能有相同的問題)等。 但對於普通學生、教師和土木工程師來說,購買這樣的微電路並不現實。 這意味著工程界將無法快速識別這款芯片的錯誤和問題。 在我看來,首先有必要在塑料外殼中生產微電路,將它們分發給所有感興趣的各方,只有在批准(拉丁語approbatio - 批准,認可)之後,專家才能在陶瓷金屬外殼中準備修訂版,並提供保護所有可怕的因素。 我希望在不久的將來我們都會對展會上宣布的新項目感到滿意。
任何人都可以重複、修改和使用我在教育過程中開發的調試板。 首先,我自己做了一塊板,但結果很好, 我決定和大家分享.

K1986BE1QI(空氣)是一款非常有趣的控制器,具有獨特的接口,可以在大學中用於教學學生。 我認為,在糾正控制器中發現的錯誤並通過認證測試後,控制器將實現真正意義上的飛行!

來源: www.habr.com

添加評論