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,16 x 256k,10 ns,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(空气)是一款非常有趣的控制器,具有独特的接口,可以在大学中用于教学学生。 我认为,在纠正控制器中发现的错误并通过认证测试后,控制器将实现真正意义上的飞行!

来源: habr.com

添加评论