历史上的今天
返回首页

历史上的今天

今天是:2024年09月19日(星期四)

正在发生

2019年09月19日 | 第49章 在SRAM中调试代码—零死角玩转STM32-F429系列

2019-09-19 来源:eefocus

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、《Cortex-M3权威指南》、《Cortex-M4 Technical Reference Manual》(跟M3大部分是相同的,读英文不习惯可先参考《Cortex-M3权威指南》)。


学习本章时,配合《STM32F4xx 中文参考手册》"存储器和总线结构"及"嵌入式FLASH接口"章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。


49.1 在RAM中调试代码

一般情况下,我们在MDK中编写工程应用后,调试时都是把程序下载到芯片的内部FLASH运行测试的,代码的CODE及RW-data的内容被写入到内部FLASH中存储。但在某些应用场合下却不希望或不能修改内部FLASH的内容,这时就可以使用RAM调试功能了,它的本质是把原来存储在内部FLASH的代码(CODE及RW-data的内容)改为存储到SRAM中(内部SRAM或外部SDRAM均可),芯片复位后从SRAM中加载代码并运行。


把代码下载到RAM中调试有如下优点:


    下载程序非常快。RAM存储器的写入速度比在内部FLASH中要快得多,且没有擦除过程,因此在RAM上调试程序时程序几乎是秒下的,对于需要频繁改动代码的调试过程,能节约很多时间,省去了烦人的擦除与写入FLASH过程。另外,STM32的内部FLASH可擦除次数为1万次,虽然一般的调试过程都不会擦除这么多次导致FLASH失效,但这确实也是一个考虑使用RAM的因素。


    不改写内部FLASH的原有程序。


    对于内部FLASH被锁定的芯片,可以把解锁程序下载到RAM上,进行解锁。


相对地,把代码下载到RAM中调试有如下缺点:


    存储在RAM上的程序掉电后会丢失,不能像FLASH那样保存。


    若使用STM32的内部SRAM存储程序,程序的执行速度与在FLASH上执行速度无异,但SRAM空间较小。


    若使用外部扩展的SDRAM存储程序,程序空间非常大,但STM32读取SDRAM的速度比读取内部FLASH慢,这会导致程序总执行时间增加,因此在SDRAM中调试的程序无法完美仿真在内部FLASH运行时的环境。另外,由于STM32无法直接从SDRAM中启动且应用程序复制到SDRAM的过程比较复杂(下载程序前需要使STM32能正常控制SDRAM),所以在很少会在STM32的SDRAM中调试程序。


49.2 STM32的启动方式

在前面讲解的STM32启动代码章节了解到CM-4内核在离开复位状态后的工作过程如下,见图 491:


(1)    从地址0x00000000处取出栈指针MSP的初始值,该值就是栈顶的地址。


(2)    从地址0x00000004处取出程序指针PC的初始值,该值指向复位后应执行的第一条指令。

图 491 复位序列


上述过程由内核自动设置运行环境并执行主体程序,因此它被称为自举过程。


虽然内核是固定访问0x00000000和0x00000004地址的,但实际上这两个地址可以被重映射到其它地址空间。以STM32F429为例,根据芯片引出的BOOT0及BOOT1引脚的电平情况,这两个地址可以被映射到内部FLASH、内部SRAM以及系统存储器中,不同的映射配置见表 491。


表 491 BOOT引脚的不同设置对0地址的映射

image.png?imageView2/2/w/550

内核在离开复位状态后会从映射的地址中取值给栈指针MSP及程序指针PC,然后执行指令,我们一般以存储器的类型来区分自举过程,例如内部FLASH启动方式、内部SRAM启动方式以及系统存储器启动方式。


(1)    内部FLASH启动方式


当芯片上电后采样到BOOT0引脚为低电平时, 0x00000000和0x00000004地址被映射到内部FLASH的首地址0x08000000和0x08000004。因此,内核离开复位状态后,读取内部FLASH的0x08000000地址空间存储的内容,赋值给栈指针MSP,作为栈顶地址,再读取内部FLASH的0x08000004地址空间存储的内容,赋值给程序指针PC,作为将要执行的第一条指令所在的地址。具备这两个条件后,内核就可以开始从PC指向的地址中读取指令执行了。


(2)    内部SRAM启动方式


类似地,当芯片上电后采样到BOOT0和BOOT1引脚均为高电平时,0x00000000和0x00000004地址被映射到内部SRAM的首地址0x20000000和0x20000004,内核从SRAM空间获取内容进行自举。


在实际应用中,由启动文件starttup_stm32f429_439xx.s决定了0x00000000和0x00000004地址存储什么内容,链接时,由分散加载文件(sct)决定这些内容的绝对地址,即分配到内部FLASH还是内部SRAM。(下一小节将以实例讲解)


(3)    系统存储器启动方式


当芯片上电后采样到BOOT0引脚为高电平,BOOT1为低电平时,内核将从系统存储器的0x1FFF0000及0x1FFF0004获取MSP及PC值进行自举。系统存储器是一段特殊的空间,用户不能访问,ST公司在芯片出厂前就在系统存储器中固化了一段代码。因而使用系统存储器启动方式时,内核会执行该代码,该代码运行时,会为ISP提供支持(In System Program),如检测USART1/3、CAN2及USB通讯接口传输过来的信息,并根据这些信息更新自己内部FLASH的内容,达到升级产品应用程序的目的,因此这种启动方式也称为ISP启动方式。


49.3 内部FLASH的启动过程

下面我们以最常规的内部FLASH启动方式来分析自举过程,主要理解MSP和PC内容是怎样被存储到0x08000000和0x08000004这两个地址的。


见图 492 ,这是STM32F4默认的启动文件的代码,启动文件的开头定义了一个大小为0x400的栈空间,且栈顶的地址使用标号"__initial_sp"来表示;在图下方定义了一个名为"Reset_Handler"的子程序,它就是我们总是提到的在芯片启动后第一个执行的代码。在汇编语法中,程序的名字和标号都包含它所在的地址,因此,我们的目标是把"__initial_sp"和"Reset_Handler"赋值到0x08000000和0x08000004地址空间存储,这样内核自举的时候就可以获得栈顶地址以及第一条要执行的指令了。在启动代码的中间部分,使用了汇编关键字"DCD"把"__initial_sp"和"Reset_Handler"定义到了最前面的地址空间。

图 492 启动代码中存储的MSP及PC指针内容


在启动文件中把设置栈顶及首条指令地址到了最前面的地址空间,但这并没有指定绝对地址,各种内容的绝对地址是由链接器根据分散加载文件(*.sct)分配的,STM32F429IGT6型号的默认分散加载文件配置见代码清单 491。


代码清单 491 默认分散加载文件的空间配置


1 ; *************************************************************


2 ; *** Scatter-Loading Description File generated by uVision ***


3 ; *************************************************************


4


5 LR_IROM1 0x08000000 0x00100000 { ; load region size_region


6 ER_IROM1 0x08000000 0x00100000 { ; load address = execution address


7 *.o (RESET, +First)


8 *(InRoot$$Sections)


9 .ANY (+RO)


10 }


11 RW_IRAM1 0x20000000 UNINIT 0x00030000 { ; RW data


12 .ANY (+RW +ZI)


13 }


14 }


15


分散加载文件把加载区和执行区的首地址都设置为0x08000000,正好是内部FLASH的首地址,因此汇编文件中定义的栈顶及首条指令地址会被存储到0x08000000和0x08000004的地址空间。


类似地,如果我们修改分散加载文件,把加载区和执行区的首地址设置为内部SRAM的首地址0x20000000,那么栈顶和首条指令地址将会被存储到0x20000000和0x20000004的地址空间了。


为了进一步消除疑虑,我们可以查看反汇编代码及map文件信息来了解各个地址空间存储的内容,见图 493,这是多彩流水灯工程编译后的信息,它的启动文件及分散加载文件都按默认配置。其中反汇编代码是使用fromelf工具从axf文件生成的,具体过程可参考前面的章节了解。


图 493 从反汇编代码及map文件查看存储器的内容


从反汇编代码可了解到,这个工程的0x08000000地址存储的值为0x20000400,0x08000004地址存储的值为0x080001C1,查看map文件,这两个值正好是栈顶地址__initial_sp以及首条指令Reset_Handler的地址。下载器会根据axf文件(bin、hex类似)存储相应的内容到内部FLASH中。


由此可知,BOOT0为低电平时,内核复位后,从0x08000000读取到栈顶地址为0x20000400,了解到子程序的栈空间范围,再从0x08000004读取到第一条指令的存储地址为0x080001C1,于是跳转到该地址执行代码,即从ResetHandler开始运行,运行SystemInit、__main(包含分散加载代码),最后跳转到C语言的main函数。


对比在内部FLASH中运行代码的过程,可了解到若希望在内部SRAM中调试代码,需要设置启动方式为从内部SRAM启动,修改分散加载文件控制代码空间到内部SRAM地址以及把生成程序下载到芯片的内部SRAM中。


49.4 实验:在内部SRAM中调试代码

本实验将演示如何设置工程选项实现在内部SRAM中调试代码,实验的示例代码名为"RAM调试—多彩流水灯",学习以下内容时请打开该工程来理解,它是从普通的多彩流水灯例程改造而来的。


49.4.1 硬件设计

本小节中使用到的流水灯硬件不再介绍,主要讲解与SRAM调试相关的硬件配置。在SRAM上调试程序,需要修改STM32芯片的启动方式,见图 494。

图 494 实验板的boot引脚配置


在我们的实验板左侧有引出STM32芯片的BOOT0和BOOT1引脚,可使用跳线帽设置它们的电平从而控制芯片的启动方式,它支持从内部FLASH启动、系统存储器启动以及内部SRAM启动方式。


本实验在SRAM中调试代码,因此把BOOT0和BOOT1引脚都使用跳线帽连接到3.3V,使芯片从SRAM中启动。


49.4.2 软件设计

本实验的工程从普通的多彩流水灯工程改写而来,主要修改了分散加载文件及一些程序的下载选项。


1.    主要步骤

(1)    在原工程的基础上创建一个调试版本;


(2)    修改分散加载文件,使链接器把代码分配到内部SRAM空间;


(3)    添加宏修改STM32的向量表地址;


(4)    修改仿真器和下载器的配置,使程序能通过下载器存储到内部SRAM;


(5)    根据使用情况选择是否需要使用仿真器命令脚本文件*.ini;


(6)    尝试给SRAM下载程序或仿真调试。


2.    创建工程的调试版本

由于在SRAM中运行的代码一般只是用于调试,调试完毕后,在实际生产环境中仍然使用在内部FLASH中运行的代码,因此我们希望能够便捷地在调试版和发布版代码之间切换。MDK的"Manage Project Items"可实现这样的功能,使用它可管理多个不同配置的工程,见图 495,点击"Manage Project Items"按钮,在弹出对话框左侧的"Project Target"一栏包含了原工程的名字,如图中的原工程名为"多彩流水灯",右侧是该工程包含的文件。为了便于调试,我们在左侧的"Project Target"一栏添加一个工程名,如图中输入"SRAM_调试",输入后点击OK即可,这个"SRAM_调试"版本的工程会复制原"多彩流水灯"工程的配置,后面我们再进行修改。


图 495 使用Manage Project Items添加一个工程配置


当需要切换工程版本时,点击MDK工程名的下拉菜单可选择目标工程,在不同的工程中,所有配置都是独立的,例如芯片型号、下载配置等等,但如果两个工程共用了同一个文件,对该文件的修改会同时影响两个工程,例如这两个工程都使用同一个main文件,我们在main文件修改代码,两个工程都会被修改。

图 496 切换工程


在下面的教程中我们将切换到"SRAM_调试"版本的工程,配置出一个代码会被存储到SRAM的多彩流水灯工程。


3.    配置分散加载文件

为方便讲解,本工程的分散加载只使用手动编辑的sct文件配置,不使用MDK的对话框选项配置,在"Options for Target->linker"的选项见图 497。


图 497 使用新建的"SRAM_调试.sct"文件


为了防止"多彩流水灯"工程的分散加载文件被影响,我们在工程的Output路径下新建了一个名为"SRAM_调试.sct"的文件,并在上图中把它配置为"SRAM_调试"工程专用的分散加载文件,该文件的内容见代码清单 492,若不了解分散加载文件的使用,请参考前面的章节。


代码清单 492 分散加载文件配置(SRAM_调试.sct)


1 ; *************************************************************


2 ; *** Scatter-Loading Description File generated by uVision ***


3 ; *************************************************************


4


5 LR_IROM1 0x20000000 0x00010000 { ; load region size_region


6 ER_IROM1 0x20000000 0x00010000 { ; load address = execution address


7 *.o (RESET, +First)


8 *(InRoot$$Sections)


9 .ANY (+RO)


10 }


11 RW_IRAM1 0x20010000 0x00020000 { ; RW data


12 .ANY (+RW +ZI)


13 }


14 }


15


在这个分散加载文件配置中,把原本分配到内部FLASH空间的加载域和执行域改到了以地址0x20000000开始的64KB(0x00010000)空间,而RW data空间改到了以地址0x20010000开始的128KB空间 (0x00020000)。也就是说,它把STM32的内部SRAM分成了虚拟ROM区域以及RW data数据区域,链接器会根据它的配置给工程中的各种内容分配到SRAM地址。


在具体的应用中,虚拟ROM及RW区域的大小可根据自己的程序定制,配置完毕编译工程后可在map文件中查看具体的空间地址分配。


4.    配置中断向量表

由于startup_stm32f429_439xx.s文件中的启动代码不是指定到绝对地址的,经过它由链接器决定应存储到内部FLASH还是SRAM,所以SRAM版本工程中的启动文件不需要作任何修改。


重点在于启动文件定义的中断向量表被存储到内部FLASH和内部SRAM时,这两种情况对内核的影响是不同的,内核会根据它的"向量表偏移寄存器VTOR"配置来获取向量表,即中断服务函数的入口。VTOR寄存器是由启动文件中Reset_Handle中调用的库函数SystemInit配置的,见代码清单 493。


代码清单 493 SystemInit函数(system_stm32f4xx.c文件)


1 /**


2 * @brief Setup the microcontroller system


3 * Initialize the Embedded Flash Interface, the PLL and update the


4 * SystemFrequency variable.


5 * @param None


6 * @retval None


7 */


8 void SystemInit(void)


9 {


10 /* ..其它代码部分省略 */


11


12 /* Configure the Vector Table location add offset address ----*/


13 #ifdef VECT_TAB_SRAM


14 SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* 向量表存储在SRAM */


15 #else


16 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* 向量表存储在内部FLASH */


17 #endif


18 }


代码中根据是否存储宏定义VECT_TAB_SRAM来决定VTOR的配置,默认情况下代码中没有定义宏VECT_TAB_SRAM,所以VTOR默认情况下指示向量表是存储在内部FLASH空间的。


由于本工程的分散加载文件配置,在启动文件中定义的中断向量表会被分配到SRAM空间,所以我们要定义这个宏,使得SystemInit函数修改VTOR寄存器,向内核指示向量表被存储到内部SRAM空间了,见图 498,在"Options for Target-> c/c++ ->Define"框中输入宏VECT_TAB_SRAM,注意它与其它宏之间要使用英文逗号分隔开。


图 498 在c/c++编译选项中加入宏VECT_TAB_SRAM


配置完成后重新编译工程,即可生成存储到SRAM空间地址的代码指令。


5.    修改FLASH下载配置

得到SRAM版本的代码指令后,为了把它下载到芯片的SRAM中,还需要修改下载器的配置,见图 499,"Options for Target->Utilities->Settings"中的选项。


图 499 下载配置


这个配置对话框原本是用于设置芯片内部FLASH信息的,当我们点击MDK的(下载、LOAD)按钮时,它会从此处加载配置然后下载程序到FLASH中,而在上图中我们把它的配置修改成下载到内部SRAM了,各个配置的解释如下:


    把"Download Function"中的擦除选项配置为"Do not Erase"。这是因为数据写入到内部SRAM中不需要像FLASH那样先擦除后写入。在本工程中,如果我们不选择"Do not Erase"的话,会因为擦除过程导致下载出错。


    "RAM for Algorithm"一栏是指"编程算法"(Programming Algorithm)可使用的RAM空间,下载程序到FLASH时运行的编程算法需要使用RAM空间,在默认配置中它的首地址为0x20000000,即内部SRAM的首地址,但由于我们的分散加载文件配置,0x20000000地址开始的64KB实际为虚拟ROM空间,实际的RAM空间是从地址0x20010000开始的,所以这里把算法RAM首地址更改为本工程中实际作为RAM使用的地址。若编程算法使用的RAM地址与虚拟ROM空间地址重合的话,会导致下载出错。


    "Programming Algorithm"一栏中是设置内部FLASH的编程算法,编程算法主要描述了FLASH的地址、大小以及扇区等信息,MDK根据这些信息把程序下载到芯片的FLASH中,不同的控制器芯片一般会有不同的编程算法。由于MDK没有内置SRAM的编程算法,所以我们直接在原来的基础上修改它的基地址和空间大小,把它改成虚拟ROM的空间信息。


从这个例子可了解到,这里的配置是跟我们的分散加载文件的实际RAM空间和虚拟ROM空间信息是一致的,若您的分散加载文件采用不同的配置,这个下载选项也要作出相应的修改,不能照抄本例子的空间信息。


这个配置是针对程序下载的,配置完成后点击MDK的按钮(下载、LOAD),程序会被下载到STM32的内部SRAM中,复位后程序会正常运行 (前提是BOOT0和BOOT要被设置为SRAM启动) 。芯片掉电后这个存储在SRAM的程序会丢失,想恢复的话必须要重新下载程序。


6.    仿真器的配置

上面的下载配置使得程序能够加载到SRAM中全速运行,但作为SRAM版本的程序,其功能更着重于调试,也就是说我们希望它能支持平时使用按钮(调试、debug)时进行的硬件在线调试、单步运行等功能。


要实现调试功能,还要在"Options for Target->Debug->Settings"中进行配置,见图 4910。

图 4910 设置仿真前检查代码并下载程序到FLASH中


在图中我们需要勾选"Verify Code Download"及"Download to FLASH"选项,也就是说点击调试按钮后,本工程的程序会被下载到内部SRAM中,只有勾选了这两个选项才能正常仿真。(至于为什么FLASH版本的程序不需要勾选,不太清楚)


经过这样的配置后,硬件仿真时与平时内部FLASH版本的程序无异,支持软件复位、单步运行、全速运行以及查看各种变量值等 (同样地,前提是BOOT0和BOOT要被设置为SRAM启动) 。


7.    不需要修改BOOT引脚的仿真配置

假如您使用的硬件平台中BOOT0和BOOT1引脚电平已被固定,设置为内部FLASH启动,不方便改成SRAM方式,可以使用如下方法配置调试选项实现在SRAM调试:


(1)    与上述步骤一样,勾选"Verify Code Download"及"Download to FLASH"选项;


(2)    见图 4911,在"Options for Target->Debug"对话框中取消勾选"Load Application at startup"选项。点击"Initialization File"文本框右侧的文件浏览按钮,在弹出的对话框中新建一个名为"Debug_RAM.ini"的文件;


图 4911 新建一个ini文件


(3)    在Debug_RAM.ini文件中输入如代码清单 494中的内容。

推荐阅读

史海拾趣

ZTE高新兴(Gosuncn)公司的发展小趣事

对于J-107B型高频双头式热合机电路,网友可能提出的问题及回答如下:

问题一:J-107B型高频双头式热合机的主要工作原理是什么?

回答:J-107B型高频双头式热合机的主要工作原理是利用高频电场作用于塑料材料,使其内部分子发生极化现象,并在高频电场的快速变化下,这些被极化的分子以同样极快的速度跟随变化,从而因介电损耗产生大量的热量。这些热量聚集并达到高温,使塑料材料熔化。在熔化状态下,通过施加一定的压力,可以使两块或多块塑料熔合粘结在一起,实现高频热合的目的。

问题二:J-107B型高频双头式热合机的电路结构有哪些主要部分?

回答:J-107B型高频双头式热合机的电路结构主要包括以下几个主要部分:

  1. 高频振荡电路:这是热合机的核心部分,通常由电子管(如Fu-33中功率发射电子管)组成,用于产生高频电场。电子管通过自激振荡方式工作,利用电子管的授间电容作振荡回路的主电窖,组成考毕兹振荡器。

  2. 时间控制电路:用于控制热合的时间,通常由电子管(如6P6P电子管)和时间控制元件(如RP1和RP2调节器)组成。通过调整这些元件,可以精确地控制热合过程中的各个阶段时间,如预热时间、熔合时间和冷却时间。

  3. 电源电路:为整个热合机提供稳定的电源供应,确保高频振荡电路和时间控制电路的正常工作。电源电路需要满足一定的电压和电流要求,通常要求电源电压在190~230V范围内。

  4. 保护电路:为了防止电路过载、短路等异常情况的发生,热合机还配备了保护电路。这些电路能够在检测到异常情况时迅速切断电源,保护设备和操作人员的安全。

问题三:如何维护和保养J-107B型高频双头式热合机?

回答:为了保持J-107B型高频双头式热合机的良好性能和延长使用寿命,需要进行定期的维护和保养。以下是一些建议:

  1. 定期检查电源线和插头:确保它们没有损坏或松动,避免电源问题导致的故障。

  2. 清洁机器内部:定期清理机器内部的灰尘和杂物,保持机器内部的清洁和干燥。这有助于防止电子元件因灰尘积累而损坏。

  3. 检查电子元件:定期检查高频振荡电路和时间控制电路中的电子元件是否损坏或老化。如有需要,应及时更换以确保电路的正常工作。

  4. 调整和维护模具:模具是热合机的关键部件之一,需要定期进行调整和维护。确保模具的接合位置准确、平整,避免模具损坏导致的热合质量下降。

  5. 注意安全操作:在操作过程中,应注意安全用电和防火措施。避免在潮湿或腐蚀性气体环境下使用热合机,以防止触电或设备损坏。

  6. 定期校准:对于需要精确控制时间或温度的热合机,应定期进行校准以确保其准确性。这有助于提高热合质量和生产效率。

GeneSiC Semiconductor公司的发展小趣事

GeneSiC Semiconductor公司的发展故事

故事一:技术先驱与高性能SiC器件的开创

GeneSiC Semiconductor自成立以来,便致力于高性能碳化硅(SiC)功率器件的研发与生产。作为碳化硅技术的先驱,GeneSiC在2000年代初便开始布局,并成功开发出多款领先业界的SiC二极管和MOSFET技术。其产品覆盖从650V到6.5kV的广泛电压范围,满足从20W到20MW不同应用场景的需求。这些技术突破不仅提升了系统效率,还显著增强了设备的可靠性和耐用性,为汽车、工业和国防等多个领域带来了革命性的变化。

故事二:政府机构项目的深度参与

GeneSiC与全球多个政府机构紧密合作,参与了众多前沿技术研发项目。例如,为美国能源部(DOE)开发的6.5kV SiC晶闸管用于储能系统,以及为NASA金星探测任务提供的500°C单片集成SiC超结晶体管JBS二极管(MIDSJT)。这些项目不仅展示了GeneSiC在极端环境下的技术实力,还推动了SiC技术在关键领域的广泛应用。通过不断的技术创新与合作,GeneSiC在提升全球科技水平方面做出了重要贡献。

故事三:电动汽车市场的深度布局

随着电动汽车市场的快速崛起,GeneSiC迅速调整战略,将SiC技术应用于电动汽车的关键部件中。其高性能的SiC MOSFET和二极管不仅提升了电动汽车的充电效率和续航里程,还降低了电池系统的热损耗和重量。此外,GeneSiC还为快速充电站开发了高效、稳健的解决方案,如SK Signet的350kW快速充电器便采用了GeneSiC的SiC二极管,为电动汽车的快速普及提供了有力支持。

故事四:工业领域的广泛应用

在工业领域,GeneSiC的SiC技术同样展现出强大的竞争力。以埃克西德技术为例,该公司采用GeneSiC的SiC功率半导体,确保了其下一代工业材料处理设备的高频快速充电器的可靠性、安全性和易用性。GeneSiC的SiC MOSFET和MPS肖特基二极管在高频、大功率的应用场景下表现出色,为工业自动化和智能制造提供了强有力的技术支持。

故事五:与纳微半导体的战略合并

2022年,氮化镓(GaN)功率芯片领导者纳微半导体宣布收购GeneSiC Semiconductor,这一战略合并标志着两家公司在下一代功率半导体领域的强强联合。合并后的公司不仅拥有全面的SiC和GaN技术组合,还通过资源整合和市场拓展,进一步巩固了其在全球功率半导体市场的领先地位。GeneSiC的丰富技术积累和纳微半导体的市场渠道优势相结合,为双方带来了新的增长动力和市场机遇。

德力康(DLK)公司的发展小趣事

在扩大产品线的同时,DLK公司也积极拓展国内外市场。通过参加各种行业展会、建立营销网络、加强客户服务等方式,DLK公司成功将产品销往全球多个国家和地区。在品牌建设方面,DLK公司注重产品质量和服务质量的提升,积极塑造企业形象和品牌形象。通过多年的努力,DLK已经成为了国内外知名的连接器品牌之一。

FDI [Future Designs , Inc.]公司的发展小趣事

随着环保意识的提高,电子产品的绿色环保问题日益受到关注。FDI公司积极响应这一趋势,投入大量资源研发绿色电子产品。公司采用环保材料和生产工艺,推出了一系列符合国际环保标准的电子产品。这些产品不仅具有优良的性能和品质,而且对环境友好,深受消费者的喜爱。

Directed Energy Inc公司的发展小趣事

作为一家在电子行业中具有影响力的企业,Directed Energy Inc深知自己肩负的社会责任。公司积极参与各种公益活动和社会事务,为社会的发展贡献自己的力量。同时,公司还注重环保和可持续发展,努力降低生产过程中的能耗和排放,推动绿色生产。这种积极履行社会责任的态度赢得了社会的广泛赞誉和支持,也为公司的成长提供了有力保障。

请注意,以上故事均为模拟构建,旨在展示Directed Energy Inc公司在电子行业中的可能发展历程和成就。实际情况可能有所不同,具体细节和数据请以公司官方发布的信息为准。

Bombardier Inc公司的发展小趣事

除了航空领域,庞巴迪公司在铁路运输方面也取得了重要进展。其生产的CITYFLO系列自动列车控制系统在全球范围内得到了广泛应用。该系统采用了先进的电子技术和算法,实现了列车的自动驾驶和精确控制,大大提高了铁路运输的安全性和效率。此外,庞巴迪还生产了各种铁路车辆和相关电子设备,为全球铁路运输业的发展做出了重要贡献。

以上五个故事展示了庞巴迪公司在电子行业发展中的关键历程和成就。从水上飞机到现代商用喷气客机,从航空电子系统到铁路运输控制系统,庞巴迪凭借其卓越的技术实力和创新能力,在电子行业中树立了杰出的品牌形象。

问答坊 | AI 解惑

直 流 稳 压 电 源

  直 流 稳 压 电 源 …

查看全部问答>

LM3S8962学习心得2010.5.24

最新的学习心得,该学生目前已经能够写一点简单的程序了,呵呵~~~~ …

查看全部问答>

关于手写板的问题

我现在在用89S51外扩8255来控制一个32*32的红外二级对管阵列,就是其中心是一个手写板性质的东西。 1、现在,老师要求我先对这个手写板进行采样(怎么采样)? 2、MFC上做一个相应的界面,在这个界面上,读出我在这个手写板上画下的图像,请问下 ...…

查看全部问答>

vc6.0+ddk报错调试问题

我用的是vc6.0+xpddk。调试passthru的时候,在output栏里点击报的错误,不能回到程序错误的地方。但是调试其他DDK带的PASSTHRU是不会出现这种情况的。 请问这是怎么回事啊 急死了…

查看全部问答>

【我给xilinx资源中心做贡献】三线SPI接口的VHDL源码

三线SPI接口的VHDL源码说明:该段代码为三线制SPI接口(CS,SDA,SCK)的源码,像一般的AD或者DA器件或者时钟芯片如DS1302采用的都是这种接口.本段代码是 我的的一个系统中的一个接口部分,功能比较简单,实现的功能是通过12个SCK完成一次数据的设定.经过 ...…

查看全部问答>

LPC11U14 PS2 协议

有没有人用LPC11xx 的普通GPIO模拟过PS2协议的收发啊,程序怎么实现啊。谢谢!…

查看全部问答>

论坛管理员要求补充信息的邮件被QQ邮箱判为垃圾邮件啦

今天查看了一下QQ邮箱的垃圾邮件,发现了一个管理员要求补全信息的邮件,还好论坛的资料更新过已经收到板子啦,没收到的兄弟们注意查查垃圾邮件哦…

查看全部问答>

之前买了个beaglebone black,感觉有不少坑啊

XDS100仿真器去掉了,Jtag接口还要自己焊上去。习惯了裸板编程,这下可有点不知所措了。。。 听说c2000 launchpad 上的xds100 V2 可以仿真其他的器件,不知道各位有没有吃灰的,低价转让一个呗。。。。 [ 本帖最后由 airqj 于 2013-9-29 13:48 编 ...…

查看全部问答>

2014 TI 联赛最终参考赛题

本帖最后由 paulhyde 于 2014-9-15 02:54 编辑  …

查看全部问答>