汽车电子技术——ECU/MCU嵌入式软件开发
- 1. ECU/MCU软件开发知识储备
-
- 1.1 ECU/MCU相关基础知识
- 1.2 C语言编程知识
- 1.3 外围电路
- 2 MCU开发板实践学习
-
- 2.1 STM32F103开发板
- 2.2 MDK5软件集成开发
- 2.3 简单应用示例——流水灯
-
- 硬件设计
- 软件设计
- 3. 参考学习的书籍
ECU(Electronic Control Unit)电子控制单元,又称“行车电脑”、“车载电脑”等。
它和普通的电脑一样,由微控制器(MCU)、存储器(ROM、RAM)、输入/输出接口(I/O)、模数转换器(A/D)以及整形、驱动等大规模集成电路组成。用一句简单的话来形容就是“ECU就是车的大脑”。
在自己的前面的博文《汽车电子技术——传感器感知技术》已经论述过,自动驾驶汽车三大关键系统分为:感知、决策、执行等三个层面。“感知”环节即由摄像头、超声波雷达、毫米波雷达、激光雷达等各种传感器完成数据采集,再传输给各类传感器所对应的ECU(电子控制单元)进行数据的分析及处理,各类ECU将处理结果发送至决策微控制器(MCU),MCU将各类ECU发送的处理结果综合之后再向各类汽车系统(例如刹车系统、传动系统等)发出控制指令,最终接受到控制指令的汽车系统将指令予以执行,从而完成整个ADAS系统的功能。
同样博主也在前面的博文《汽车电子技术——软件、硬件、系统集成和项目管理之学习与分享概述》中讨论过,汽车电子控制系统被分为多个子系统,每个子系统包含一个或多个电子控制单元(ECU),软件定义汽车时代之下,一辆现代汽车的ECU数量更可高达上百个。目前博世,电装,大陆,德尔福,采埃孚等都是汽车ECU行业的领导者。
ECU通俗来讲就是MCU加上一些外围必要的电路组成的一个系统,可以对各种输入信 (传感器信 、车载 络信 等)进行加工处理,然后进行信 输出(控制执行器的信 、车载 络信 等)的一个专用嵌入式系统。博主本来在工作中就有接触ECU的实际开发及相关项目管理的部分内容,并且一直保持和开发工程师及软件PM虚心求教学习,本篇博文仅作简要论述下自己在ECU/MCU软件开发中的学习储备,并简要介绍下后续就基于MCU开发板做的一些实际开发学习思路,以供感兴趣的小伙伴参考及讨论。
关于MCU开发板的选择,其实我们公司的ECU中一般都是英飞凌的车规级32位MCU,可以满足安全性与动力要求总成的车用要求。但自己在学习过程中,综合考虑了目前市面上易于获得及学习材料较丰富等因素,我自己选择了意法半导体的主流MCU——STM32F103,这是STM32系列32位MCU,该系列的MCU由于其低廉的价格和强大的功能在嵌入式产品中被广泛应用,同样也可以满足自己了解和学习ECU/MCU软件开发的目的需要。
1. ECU/MCU软件开发知识储备
1.1 ECU/MCU相关基础知识
前面也已经说到,ECU通俗来讲就是MCU加上一些外围必要的电路组成的一个系统,所以本身在学习ECU/MCU软件开发的过程中,相关的基础知识是需要不断积累的。当然博主的博客专题中《汽车电子技术 博客专栏》已经分享了一些自己的学习思路及参考书目,感兴趣的小伙伴们可以查阅参考一下。不过在这里还是进一步分享一下自己的思路:
1.1.1 ECU/MCU相关硕博论文的学习
相比于参考书籍,我认为硕博论文是更加详实和丰富的材料。很多书籍一般都是概括总览性的介绍汽车电子方面的知识,但是往往不会深入到太具体ECU/MCU的开发细节,因为这也是可以理解的,不可能一本书把所有功能应用的技术都写到。具体到更深入的知识学习,则可以通过其他更丰富的资料去获取与学习。 上渠道就可以获取的,硕博论文是很不错的详实材料。关于这一点,自己研究生写硕士论文的时候也深有感悟,硕博论文需要将必要的基础知识与实际具体的研究应用都要逐步展开论述的,从知识的完备和技术论述的细节性来说,都是非常好的。所以找到相关ECU/MCU的硕博论文,仔细学习和深入理解,是很不错的。
1.1.2 工作中产品开发学习
掌握了基础知识之后,如果在实际项目中可以接触到ECU/MCU开发的细节,可以在实践交流中加深对知识的融会贯通。如果自身岗位涉及开发细节不多,那就需要自己创造条件,就拿博主自己来说,博主本身的岗位并不在软件开发岗位,但是整个项目中软件开发相关的PM、开发人员和测试人员等都是有接触的。每次开项目会的时候,关于软件开发进度和问题都是会上会讨论的,认真聆听和学习,是可以把整个软件开发的流程和进度管控等项目管理的点学到,并且会上讨论项目中的问题之时,开发的细节知识就会涉及,也可以好好研学。除此之外,工作之中找熟悉的软件开发相关同事,找他们了解学习工作实践的知识是更关键的,比如更细节具体的开发流程和知识,软件开发过程中的工具链,软件开发核心环节和常规问题及解决方案,以及相应供应链及合作内容等等,这些都是需要用自己的人际关系技能和团队技能去获取的,人际关系技能等也是项目经理的必备技能。如果处在一个完备的开发管理及项目管理的大公司,则公司本身就是一个很好的学习平台。
1.1.3 知识和实践的融会贯通
前面两点,需要融会贯通。知识是基础,是你在工作实践中,无论是去提问咨询或交流学习的基础;工作实践的内容,则是知识的应用和拓展,通过对工作实践中应用到的点,再去针对性学习和拓展自己的知识学习;以上两点不断地融会贯通,自己才能够一步一步加深学习相关领域的知识。
当然除了以上写出来的方法,还是有很多可以补充加深学习的。比如 上很多的公开课视频也是可以学习的,老师的视频授课的学习也是很有助于加深知识理解的,在这里自己推荐一门慕课——《吉林大学 微机原理与接口技术》。
《微机原理与接口技术》课程包括三部分内容:微处理器(CPU)的工作原理、汇编语言程序设计方法和微机接口技术。通过学习,学生可以了解微处理器的基本结构、指令系统和汇编语言程序设计方法、微处理器与主存储器的基本接口、微处理器与设备之间的基本输入输出接口、中断技术、数模(D/A)转换与模数(A/D)转换技术等,还将介绍几款典型数字接口芯片、数/模和模/数转换芯片,同学们由此入门可以达到举一反三触类旁通的效果。
MCU微控制器是ECU的组成基础器件,所以先学习其相关知识,是更好的理解ECU软件开发的。
1.2 C语言编程知识
在嵌入式编程中,C语言是需要掌握的。C语言被称为适合嵌入式系统开发的编程语言之一,是开发者和MCU进行沟通的语言,通过C程序告诉MCU你要它完成什么工作和实现什么样的功能(比如通过一个端口输出一个PWM)。从语法上来说C语言并不复杂,但真正要编写优质可靠的嵌入式C程序并非易事,不仅需要熟知硬件特性和缺陷,还需要对编译原理和计算机技术知识有着一定的了解。
博主在学校的时候考过了计算机二级C语言和三级数据库,并且后来常用的Fortran/Python等语言的学习中,本身对编程开发技术有一定的掌握,自己也买有C语言的经典教材《C Primer Plus》常翻翻和学习。但是学习编程语言,最重要的还是动手coding刷题来得快。
1.3 外围电路
MCU结合搭建相应的外围电路,才能实现其相应的功能,所以需要学习掌握MCU交互的外围电路的原理图。比如下面示例的LED电路图。
2.3 简单应用示例——流水灯
博主使用的是MDK528版本软件,在创建工程的时候,记得注意做好芯片类型和仿真器等配置工作,根据自己买的这块开发板信息,选择的是STM32f103ZE 这个芯片,不同的芯片区别在于对应的电路引脚图不同,也就是GPIO口可能会不同,不过道理和方法都还是一样的。仿真器为Fire-Debugger,其遵循ARM公司的CMSIS-DAP 标准,支持所有基于Cortex-M内核的单片机,常见的M3、M4 和M7 都可以完美支持。一些配置选项如下:
这些LED 灯的阴极都是连接到STM32 的GPIO 引脚,只要我们控制GPIO 引脚的电平输出状态,即可控制LED灯的亮灭。以点亮绿灯来举例,上图中LED_G是由MCU上的PB0端口控制,可以通过该端口来控制绿色LED的亮灭。本身LED一端接的是3V电压,则PB0控制为低电平时导通灯亮,控制为高电平时不导通灯灭。
总线构架和存储器
下图为STM32F10xxx的总线架构和存储器信息,系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。从AHB 总线延伸出来的两条APB2 和APB1 总线,上面挂载着STM32各种各样的特色外设,GPIO、串口、I2C、SPI这些外设就挂载在这两条总线上,两个AHB/APB桥在AHB和2个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。
bsp_led.h:注意LED相关的GPIO端口明确,置位函数与复位函数等函数定义。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!