开发用于K1986BE1QI(空气)的调试板

调试板MDB1986

几年前,我遇到了来自Milander的俄罗斯微控制器。 在2013年,工程师们就2008-2015年联邦目标计划“开发电子元件基础和无线电电子产品”的最初成果进行了激烈讨论。 那时,已经发布了K1986BE9x控制器(Cortex-M3内核),而1986BE1T控制器(Cortex-M1内核)刚刚出现。 他在塑料盒LQFP-144中的名称为K1986BE1QI(avia),在芯片本身上的名称为MDR32F1QI。 在制造商的网站上,他的后缀为“ avia”,因为它具有特定于飞机行业的界面(ARINC 429,MIL_STD_1553)。

出乎意料的是,在分发这些控制器时,Milander公司准备了调试工具包和一个用于与外围设备一起工作的子程序库,“但对于库的正确性,没有任何其他保证和义务”。 该库类似于意法半导体标准外设库。 通常,所有基于Cortex-M内核构建的ARM控制器都有很多共同点。 因此,很快就熟悉了新的俄罗斯管制员。 对于购买了品牌调试工具包的用户,在使用过程中提供了技术支持。


用于微控制器1986BE1T的调试套件,©Milander

但是,随着时间的流逝,新的微电路和库的“儿童疾病”开始出现。 固件的测试示例工作正常,没有明显问题,但进行了重大修改,崩溃和错误泛滥成灾。 在我的实践中,第一个“吞咽”是无法解释的CAN控制器操作故障。 一年后,在1986BE1T(空中)早期审核控制器上, MKIO模块(多路信息交换通道)被检测到问题。 总体而言,这些微控制器的所有修订版(直到2016年)都使用有限。 花费大量时间和精力来确定这些问题,现在可以在错误列表(Errata)中找到对其进行确认。

一个令人不愉快的功能是,有必要处理和处理错误,而不是在调试板上,而是在计划用于批量生产的设备的原型板上进行处理。 除了JTAG连接器,通常那里什么也没有。 与逻辑分析仪连接非常困难且不方便,通常没有LED或屏幕。 出于这个原因,我考虑创建自己的调试板。

一方面,市场上有品牌的调试套件,还有Zelenograd的LDM-Systems的出色板卡。 另一方面,这些产品的价格被吓到了,没有扩展卡的基本功能无法达到预期。 对我来说,具有焊接控制器和引脚连接器的电路板不是我所关心的。 而且更有趣的板子很昂贵。


调试板MILANDR LDM-HELPER-K1986BE1QI-FULL,©LDM Systems

该公司“ Milander”的定价和行销都是奇特的。 因此,有可能获得一些微电路的免费样品,但这仅适用于法人实体,并且与官僚机构有关。 通常,金属陶瓷外壳中的微电路在直接和具象意义上是金。 例如,在莫斯科,1986BE1T控制器的价格为14到24000卢布。 1645RU6U静态存储器芯片的价格为15,000卢布起。 而这样的价格顺序适用于所有产品。 结果,即使是具有国家命令的专门研究机构也可以避免这种价格。 用于民用的塑料外壳中的微电路便宜得多,但无法从受欢迎的供应商处获得。 另外,在我看来,塑料外壳中的微电路的质量要比“金色”电路的质量差。 例如,如果不增加闪存等待时间参数,就无法以128 MHz的频率启动K1986BE1QI控制器。 同时,该控制器的温度升至40-50℃。 但是控制器1986BE1T(“金”)在没有附加设置的情况下以128 MHz的频率启动,并保持冷态。 他真的很好。


“金色”微控制器1986BE1T,(三)Milander

幸运的是,仍然可以在LDM Systems的零售店购买塑料外壳的微控制器,并且所有电路板均可免费获得。 不好的是,在控制器照片上的网站上有一个标记,上面写着这是2014年的第4版,即 有缺陷。 我想了很长时间-买还是不买。 好几年过去了...


创建调试板的想法并没有消失。 逐渐地,我提出了所有要求,并考虑了如何将所有这些集成在一块板上,以使其紧凑而又不昂贵。 同时,我从中文订购了缺少的组件。 我并不着急-我为自己做了一切。 中国供应商以草率着称-为了获得我需要的一切,我不得不在不同的地方订购同一件东西。 而且,一些存储器微电路被证明正在使用中-显然会从损坏的设备中蒸发掉。 后来又回来了。

要购买微控制器,Milander K1986BE1QI(avia)并非易事。 在同一家Chip and Dip商店的“订购商品”部分,我只找到740卢布的K1986BE92QI,但它不适合我。 唯一的选择是在LDM-Systems购买2,000卢布,而不是新的修订。 由于在其他任何地方都找不到替代品,因此我决定购买原样。 令我惊喜的是,他们给我卖了一个全新的2018年12月发行版控制器,版本6+(1820)。 而且网站上还有一张旧照片,在撰写本文时,控制器不可用...


微处理器K1986BE1QI(航空)在技术包装中,(c)-照片由

我的MDB1986调试板的主要技术规格如下:

  • 与J-Link和CMSIS-DAP兼容的内置调试器-编程器;
  • 4Mbit静态存储器(256k x 16,10 ns);
  • 64Mbit闪存芯片,Winbond 25Q64FVSIG;
  • 具有RTS和CTS线的RS-232接口收发器;
  • 以太网,USB,CAN的接口和连接器;
  • MAX7221 7段显示控制器
  • 用于MKIO(MIL_STD_1553)和ARINC429的引脚连接器;
  • 亿光PT17-21C光电晶体管;
  • 五个彩色LED,一个重置按钮和两个用户按钮;
  • 由5伏USB端口供电;
  • PCB尺寸100 x 80毫米

我喜欢STM-Discovery系列开发板,因为有一个内置的调试器编程器-ST-Link。 品牌的ST-Link仅与STMicroelectronics控制器一起使用,但是几年前,可以在ST-Link中更新固件并获得SEGGER J-Link OB(板载)调试器。 从法律上讲,只有在意法半导体板上才能使用这种调试器,但实际上并没有受到限制。 因此,有了J-Link OB,您可以在调试板上拥有内置的调试器。 我注意到在“ LDM-Systems”产品中,使用了只能闪烁的转换器CP2102(Usb2Uart)。


单片机STM32F103C8T6,实际并非如此,(c)照片由

因此,有必要购买原始的STM32F103C8T6,因为专有固件无法在克隆中正常工作。 我对此论文表示怀疑,因此决定尝试运行中国公司CKS的CS32F103C8T6控制器。 我对控制器本身没有任何抱怨,但是固件ST-Link无法在其中运行。 J-Link部分起作用-检测到USB设备,但程序员未执行其功能,并不断提醒它“有缺陷”。


在非原始控制器上使用调试器时出错

我并没有对此平静下来,而是先编写固件使LED闪烁,然后使用JTAG协议实现IDCODE请求。 我在Discovery板上拥有的ST-Link编程器和ST-Link Utility程序正在毫无问题地闪烁CS32F103C8T6,因此,确保了我的板在工作。 令我高兴的是,目标控制器K1986BE1QI(航空)通过TDO线高兴地发布了其IDCODE。


具有编码IDCODE响应的TDO信号线的波形图(c)-照片由


因此,SWD端口可用于调试调试器本身并检查IDCODE

CMSIS-DAP调试器(调试访问端口)有一个变体。 从ARM的源代码构建项目不是一件容易的事,我从X893获得了该项目,然后尝试了DAP42。 不幸的是,Keil uVision挂断了电话,不想与他们合作。 结果,我用专有的STM32F103C8T6替换了调试器芯片,并且不再出现此问题。


成功的J-Link STLink V2调试器

当将来的调试板的所有关键组件都已备妥时,我进入了Eagle CAD,发现它们不在元素库中。 无处可去-他们不得不画画。 同时,我为内存,HanRun连接器,以太网以及占用的电阻和电容器添加了框架。 项目文件和组件库可以在我的GitHub上找到

调试板MDB1986的示意图


该评估板由从USB端口获得的5伏直流电源供电。 板上有两个USB B型端口。 一种用于程序员,第二种用于K1986BE1QI控制器。 评估板可以从任何这些来源或同时使用这两个来源进行工作。 在电路D2和D3(SS24)的肖特基二极管上实现最简单的负载控制和电源线保护。 同样在该图上,您可以看到500mA的自愈保险丝F1和F2。 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滤波器。

我们还应该提到7段显示器MAX7221的驱动程序。 根据规范,推荐的电源为4至5.5伏,使用5V电源时,高信号电平(逻辑单元)至少为3.5V(0.7 x VCC)。 对于K1986BE1QI控制器(avia),逻辑单元的输出对应于2.8至3.3V的电压。 显然,信号电平不匹配会干扰正常操作。 我决定以4V为MAX7221供电,并将信号电平降低至2.8V(0.7 x 4 = 2.8)。 为此,将D4二极管(RS1A或FR103)与驱动器电源电路串联安装。 总压降为0.9V(肖特基二极管为0.3V,二极管为0.6V),一切正常。

K1986BE1QI微控制器(avia)的大多数端口与高达5V的信号兼容。 因此,使用也以5V供电的MCP2551 CAN收发器不会引起问题。 MAX3232芯片在图中显示为RS-232收发器,但实际上我使用了Texas Instruments的SN65C3232D,因为 它的工作电压为3.3V,并提供高达1Mbit / s的速度。

板上有4个石英谐振器-一个用于调试器(8 MHz),三个用于目标微控制器K1986BE1QI(avia),其值分别为32.768 kHz,16 MHz,25 MHz。 这些是必要的组件,因为 内置RC发生器的参数范围从6到10 MHz。 集成以太网控制器的运行需要25 MHz的频率。 由于某种原因,在Milander的站点上(可能是错误的),表明塑料盒中没有以太网。 但是我们将依靠规范和事实。

创建自己的调试板的一个重要诱因是能够使用本质上是并行端口的外部系统总线EBC(外部总线控制器)。 微控制器K1986BE1QI(avia)允许您连接和使用外部存储芯片和外围设备,例如ADC,FPGA等。 外部系统总线的功能非常强大-您可以使用8位,16位和32位静态RAM,ROM和NAND闪存。 要读取/写入32位数据,控制器可以针对16位电路以及8位-4操作自动执行2个相应的操作。 显然,对于32位数据总线,32位I / O操作将是最快的。 缺点包括需要程序使用32位数据进行操作,并且板上必须放置32条磁道。


二手的静态RAM芯片(猜测哪一个有缺陷)

平衡的解决方案是使用16位内存芯片。 我有Integrated Silicon Solutions Inc. (ISSI IS61LV25616AL,16 x 256k,10 ns,3.3V)。 当然, Milander公司拥有自己的1645RU系列静态存储器芯片 ,但是它们太昂贵且难以获得。 另外,还有Samsung K6R4016V1D引脚兼容。 早些时候,我提到微电路正在使用中,我最初安装的实例在第15条数据线上给出了故障和混乱值。 搜索硬件错误花了几天的时间,当我用工作正常的芯片更换损坏的芯片时,获得的满足感就更大了。 尽管如此,使用外部存储器的速度仍然有很多不足之处。

外部总线和StandAlone模式
K1986BE1QI微控制器(航空)具有独特的StandAlone模式,该模式设计用于通过外部总线直接外部访问以太网和MKIO控制器(MIL_STD_1553),并且内核处于复位状态,即 不使用。 对于没有以太网和/或MKIO的处理器和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封装中的存储器具有许多连接的引脚,并占用了印刷电路板上的大量空间。 在解决经济学领域的优化问题方面有经验,对我来说很明显,首先必须将这些微电路放置在板上。 在各种来源中,我都对TopoR CAD(拓扑路由器)赞不绝口。 我下载了试用版,只有删除了几乎所有组件,才能够从Eagle CAD导出项目。 不幸的是,即使有10个元素的TopoR程序也无法帮助我进入董事会。 首先,将所有组件放置在一个角上,然后沿着边缘放置。 这个选项使我不满意,很长时间以来,我在熟悉的Eagle CAD环境中以手动模式跟踪了电路板。

印刷电路板的重要元素是丝网印刷。 调试板不仅应具有电子组件的签名,而且所有连接器都应签名。 在板子的背面,我放置了带有控制器端口功能(主端口,备用端口,替代端口,实际端口)的备忘录表。 我下令在PCBWay的著名办事处在中国制造印刷电路板。 我不会赞美,因为质量很好。 他们可以做得更好,公差更少,但是要付费


制造的印刷电路板MDB1986,(c)作者照片

我不得不用40瓦的烙铁和POS-61焊料“在我的膝盖上”焊接组件,因为我很少进行焊接,一年1-2次,并且焊膏变干。 我不得不将中文CS32F103控制器更改为原始的STM32F103,然后还更换了内存。 总的来说,尽管我尚未验证RS-232和CAN的操作,但现在的结果完全适合我。


调试板MDB1986在工作-发光和发热,(c)照片作者:

您可以在Milander网站找到足够的培训材料来学习 1986BE9系列控制器(Cortex-M3内核),但是我看不到K1986BE1QI微控制器(航空电子)的任何内容。 在审查了那里发布的材料,大学的手册和实验室工作之后,我很高兴在全国范围内对人员进行培训,以便他们与俄罗斯控制人员一起工作。 大多数培训材料都是为与I / O端口,计时器,ADC,DAC,SPI,UART一起使用而准备的。 使用了不同的IDE开发环境(Keil,IAR,CodeMaster)。 他们使用CMSIS寄存器进行编程,而使用MDR库进行编程。 有必要提及Start Milandr资源,其中包含许多实用程序员的文章。 而且,当然,不应忘记米兰德论坛

米兰德的思想
俄罗斯正在发展微电子学,而Milander在这一过程中扮演着重要角色。 有一些有趣的新微控制器,例如198681和带有SpaceWire和MKIO接口的“ Power”(与1986BE1相同,并且可能有相同的问题)等。 但是普通学生,教师和土木工程师购买这种芯片是不现实的。 因此,工程师社区将无法快速识别该芯片的错误和问题。 在我看来,起初有必要在塑料盒中生产微电路,然后将其分发给所有相关方,只有在进行测试(拉丁文批准-批准,认可)之后,专家才能对金属陶瓷盒进行审核,并防止所有可怕的因素。 我希望不久的将来,我们所有人都对展览会上宣布的新项目感到满意。

由我开发的任何人(调试板)都可以在教育过程中重复,修改和使用。 首先,我为自己创建了一个董事会,但结果如此之好,以至于我决定与所有人共享

K1986BE1QI(avia)是一个非常有趣的控制器,具有独特的界面,可用于大学中的学生教育。 我认为,在纠正了在控制器中检测到的错误并通过了认证测试之后,控制器将按照字面意义飞行!

Source: https://habr.com/ru/post/zh-CN482716/


All Articles