Category: Embedded System Development/IOT
-
嵌入式开发相关概念知识系列(五)-KEA128 CAN网络通信技术简介
在现代汽车上,汽车电控方面的应用需求挺多,从发动机、变速器、制动、转向等动力控制系统到舒适与安全、仪表报警、电源管理等控制系统均采用了电子控制技术。为了实现各电子控制系统之间的相互通信,最初采用了传统的布线方式,即需要相互通信的两者之间都要通过专属的布线实现”点对点“通信。但随着电子控制系统的增多,传统的布线方式会带来布线复杂、占用空间、成本提高、可靠性和可维护性降低等诸多问题。为此,车载网络(汽车总线)技术应运而生。利用控制器局域网(Controller Area Network,CAN)将汽车电子控制系统进行互联,利用CAN网络后,汽车电子控制系统之间的通信线束大大减少,节省了空间,降低了成本,实现了资源共享,提高了系统的工作可靠性和可维护性。 车载网络也有很多类型,CAN是德国Bosch公司针对汽车电子领域开发的具有国际标准的现场总线,由于CAN具有很强的可靠性、安全性和实时性,目前CAN广泛应用于汽车电子、工业控制、农业控制、机电产品等领域的分布式测控系统中。利用CAN可以很方便地实现多机互联。目前越来越多的MCU内部已经集成了CAN控制器,使得CAN节点硬件电路设计大大简化,KEA 128芯片内部集成了1路CAN控制器。 CAN只使用了物理层、数据链路层和应用层,从而提高了通信的实时性。CAN为多主工作方式,任一节点均可在任意时刻主动地向CAN总线上发送数据,而不分主从。CAN系统采用“边说边听”方式的非破坏性仲裁机制。CAN节点只要检测到总线上有其他节点在发送数据,就要等待总线处于空闲状态。当多个节点同时向总线上发送数据时,数据优先级高的节点先发送。在CAN系统中,帧ID的大小就对应着数据包的实时性要求,优先级越高,对应的帧ID就越小,CAN系统的仲裁机制就是当有多个节点同时向总线上发送数据时,总线上的结果是这多个数据“逻辑与”的值。当一个节点向CAN总线上发送数据包时,首先向总线上发送自己的帧ID,如果一个节点收发的数据一致,就有向总线发送数据的优先权机会。 在汽车场景中,一般会有多个MCU节点,如在汽车的车门CAN系统中,左前车门,左后车门,右前车门,右后车门都有一个对应的MCU,之间通过CAN BUS连接。 基于CAN通信的开发模式和之前的一些开发方法类似,不同的节点(MCU)可以通过提供实现的接口实现发送和接收信息。和之前编程的中断模式有点类似,其中接收CAN信息一般也要采用中断方式进行,一般发送和接收CAN数据帧时,要定义待发送的帧ID和预想接收的帧ID。具体的细节如MCU CAN驱动及应用的实现后续会在相关课程中详细介绍。
-
嵌入式开发相关概念知识系列(四)-KEA 128利用UART实现上位机和下位机的通信
为了实现上位机PC和下位机MCU之间的通信,可以采用UART、USB、Ethernet等多种通信方式,其中UART是最简单的一种通信方式。 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器,接收双方有各自的时钟)可实现异步串行通信功能。有时还将UART称为SCI(Serial Communication Interface,串行通信接口),简称串口。UART通信一般需要三根线:发送线TxD、接收线RxD和地线GND。由于MCU的UART引脚使用TTL(transistor-transistor logic gate )高低电平信号表达数字逻辑”1″和“0”,因此需要地线GND。现在的PC上的串口(RS232串口)接口一般都消失了,不过可以通过TTL-USB转换器在PC端通过USB接口实现基于串口协议的通信。 串口通信的波特率(bit/s)有1200,1800,2400,4800,9600,19200,38400等待。随着波特率的提高,位长(位的持续时间,及波特率的倒数)变小,导致通信易受电磁干扰,降低长距离通信的可靠性。 KEA128芯片中有三个UART模块,分别是UART0、UART1和UART2。一般在编程实现时,发送方主动控制着数据的发送,因此发送不必采用中断方式,而接收是被动任务,因此为了确保及时接收到对方发送过来的每帧数据,UART接收一般采用中断方式。 在开发过程中,有一个启动文件名为”startup_SKEAZ1284.S”,在该文件中,通过一个数组定义中断源的中断向量编号序列,在编译时,由链接文件将这个数组加载到中断向量表的位置。如我们使用UART2这个串口,就需要通过实现”UART2_IRQHandler”函数实现相应的接收和发送功能(可以理解为类似接口实现的编程方法)。 编写好程序后按照前面文章中所描述的,将编译好的hex文件下载到板子上,然后将USB-TTL的连线接到板子上对应的串口,另一端USB接入到PC的USB端口。打开PC端串口调试软件,选择对应的串口号和对应的波特率等配置,打开串口,即可在上面的窗口中显示对应的从MCU端发送的字符串内容。 References
-
嵌入式开发相关概念知识系列(三)-中断及其实现
中断(interrupt)是计算机中常常提及的概念,中断好比一种”优先级别高的特权”请求,让正在运行的cpu程序暂停下来并保留现场,转去先服务中断的服务请求,当完成中断请求的服务后,再转回到当前程序现场继续执行。在PC等含有操作系统的设备上,常见的中断服务情景是调用外设如等待用户输入的情景,这时程序调用相关函数(如c语言中的scanf函数),而这些函数进入系统调用从用户态转入到内核态并根据中断表调用中断服务。 在KEA 128的cortex arm cm0+嵌入式芯片中,也有类似的中断概念,比如有FTM(FlexTimer,综合定时器),这个时候基于FTM的中断实现的程序就由两部分组成,一部分为主程序,主要实现应用的逻辑,其中就有使能FTM中断的功能,第二部分就是FTM的中断服务,这个中断服务的逻辑可以按自定义逻辑进行实现,不过中断程序的名称要使用系统提供的函数名(满足arm cm0+的相关开发框架)。这样采用了中断的嵌入式应用程序,一共就有两条独立的程序运行线路,一条主程序,一条中断程序运行线路。 中断的基本过程一般分为中断请求、中断检测、中断响应与中断处理等过程,其中(1)、中断请求是中断源主动将CPU中对应的中断标志位置1,以便向CPU发出中断请求信号;(2)、中断检测,CPU在每条指令结束时会检查中断请求或系统是否满足异常条件,若系统中有中断请求信号,则CPU将会暂停当前运行的任务,转而去对中断请求进行响应;(3)、中断响应与中断处理,首先保护现场,CPU内部寄存器的数据要依次压入RAM堆栈中,然后执行中断服务,中断服务结束后再从RAM堆栈中依次弹出CPU内部寄存器的数据、再返回到中断前的程序。不过这些保护现场与恢复现场的过程是系统自动完成的,用户编程时只需关注主程序和中断服务程序的设计。 一般在操作系统里,进程运行的进本信息在PCB(进程控制块)里,如存在系统调用,处于效率考虑,一般会进行进程切换,调度其他可以运行的进程继续运行,当前进程处于挂起状态,等待终端(外围设备)返回如用户输入结束后唤醒进程进入ready状态等待调度。具体的中断细节和进程调度是操作系统课程里边会有详细描述。 在cortex arm cm0+芯片上,中断的实现方式要简单些,具体可以参考引文中的描述,作为应用程序开发,一般不需要了解中断处理中的CPU上下文的切换的具体过程,程序员只需关注实现使能中断的方式和中断服务程序的编写即可。 关于中断的更多的背景知识和开发细节,后续再具体更新,或在相关课堂或材料中再补充说明。 References
-
嵌入式开发相关概念知识系列(二)-KEA128开发环境
Kinetis® EA系列32位Arm® Cortex®MCU广泛适用于质量要求和长期供货保证要求都很高的汽车和工业应用。KEA 128为车规级微控制器芯片,汽车计算机基础这门课程采用该芯片的开发板进行教学和实验。本篇文章主要介绍相关的软硬件开发环境,包括SWD,J-Link软件和Keil MDK集成开发环境。 (1)、SWD下载器,Serial Wire Debug,代表串行线调试,是ARM设计的协议,用于对其微控制器进行编程和调试。基于Cortex-M内核的单片机,目前主流的下载接口就是JTAG和SWD。市面上支持SWD调试接口的下载器很多,比如:ST-Link、 J-Link、 e-Link、 GD-Link等市面上绝大部分用于Cortex-M内核处理器的下载器都支持。通俗的来说程序下载器的作用就是结合软件(如下面介绍的J-Link)将程序烧制到嵌入式设备上。 (2)、J-Link软件安装,JFlash软件的使用,J-Flash是J-Link系列工具里用于FLASH操作的GUI工具,也支持命令行方式操作。支持各大厂商不同嵌入式芯片的程序烧制,如下图所示为选择了SKEAZ128系列的设备。 (3)、集成开发环境Keil MDK,提供了arm的c编译器等环境。可以将c程序通过编译器和工具生成hex文件。 (4)、通过SWD(一端和mcu相连,一端和pc机器相连)后,通过菜单target->connect即可以完成mcu和pc机器的连接(连接状态可以从下图中的下方的状态表中可以看到),J-Flash 的file菜单里的open data file可以加载上述编译完成的hex程序文件。然后 、Target→Production Programming,可将载入的.hex 文件下载到目标 MCU 中。如果下载成功,则会在 J-Flash 的“LOG”窗口中显示“Target erased,programmed and verified successfully”,选择 J-Flash 菜单中的“Target→Manual Programming→Start Application”命令,使MCU 开始运行程序,观察程序运行效果。当然,也可以通过重新给 MCU 通电的方式,使MCU 开始运行程序。 References
-
嵌入式开发相关概念知识系列(一)-硬件基础知识和开发环境
嵌入式开发是个比较大的宽泛的应用开发范畴,有基于智能家居物联网的嵌入式应用,也有车载嵌入式芯片这种功能较为庞大复杂的应用。宽泛源于实际应用需求的多样性带来的所需计算设备的多样性,下面就计算设备和开发环境的相关知识和概念做一下说明和归类,有的内容不一定完全正确,欢迎批评指正以便后续进行勘误。 1、指令集:几种常见的cpu架构和指令集的关系如下:(1)、intel x86架构,CPU可能实现了多个指令集x86,x86-64,MMX,SSE,SSE2,SSE3,SSSE3 ,而这些指令集中的指令让cpu完成的动作都比较复杂,所以也称为CISC(Complex Instruction Set Computers 复杂指令集);(2)AMD amd64架构的cpu 兼容了x86指令集还拓增了3D-Now!指令集,用于加强对3D显示的支持。(3)ARM ARMv1~ARMv7架构的cpu实现了Thumb指令集和ARM指令集。这些指令集中的一条指令让cpu完成的动作都比较简单,所以也称为RISC指令集(Reduced Insturction Set Computers 精简指令集)。(4)Atmel AVR系列是一种基于改进的哈佛架构、精简指令集(Reduced Instruction Set Computing, RISC)的微控制器,Arduino不仅仅是全球最流行的开源硬件,也是一个优秀的硬件开发平台,更是硬件开发的趋势。在此需要注意的是处理器架构和指令集架构的区别。我们常用的嵌入式设备开发板有:(1),基于arduino硬件的微控制器的应用,arduino的开发板作为优秀的硬件开发平台,在嵌入式开发中经常会用到;(2)基于Cortex-M0为32位、3级流水线RISC处理器,其核心仍为冯.诺依曼结构,是指令和数据共享同一总线的架构。Kinetis® EA系列32位Arm® Cortex®MCU广泛适用于质量要求和长期供货保证要求都很高的汽车和工业应用。(3)soc片上系统,是为特定的功能设计的完成特定目标功能的系统。 2、单片机和计算机:单片机和CPU是包含关系,单片机通过超大规模集成电路技术将处理器CPU、随机存储器RAM、存储器ROM、输入输出和中断系统、定时器/计数器等功能集成在硅片上。(主要分为CPU、硬盘、内存、主板四部分)单片机主要应用于嵌入式系统,如智能家居、工业控制、汽车电子等领域,因为它们小巧、低功耗、高可靠性。计算机采用存储器与处理器分离的硬件架构,其中存储器与处理器由不同的芯片实现,并通过总线进行通信。而soc是片上系统,是一个产品,是一个有专用目标的集成电路,其中包含完整系统并有嵌入软件的全部内容。如nvidia的orin soc系统就是基于智能驾驶系统及应用构建的片上系统。 3、开发环境:(1),支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件的keil mdk集成开发环境,包括行业领先的ARM C/C++编译工具链等;(2)、arduino集成开发环境Arduino IDE;单片机通常不具备操作系统。简单来说,单片机是一种集成了微处理器、内存、输入输出和其他外设的微型计算机系统。它通常被用于嵌入式系统中,用于执行特定的任务,如控制和监控设备。由于资源有限,单片机通常使用裸机编程,即直接编写和操作硬件的程序,程序员直接管理硬件资源和任务调度,实现输入输出、数据处理、控制等功能,而不依赖于操作系统。上述的IDE编译的程序会烧制到开发板直接启动程序运行。至于带有操作系统的soc甚至异构多核soc上面的开发,一般也会提供专有的开发环境工具实现程序的编写,调试和烧制。 References