AUTOSAR 架构简要概述

汽车ECU嵌入式系统

汽车ECU 嵌入式系统分为:应用软件层(Application Software Layer,ASW)、运行时环境(Runtime Environment,RTE)、基础软件层(Basic Software Layer,BSW)和微控制器(Microcontroller);如下图所示:
AUTOSR 分层架构示意图
ASW: 为应用层逻辑实现,由用户自定义开发,与控制器逻辑强相关,一般为模型;
RTE: 中间接口层,起着ASW与BSW 之间的桥梁作用,ASW 与BSW 的接口通过Rte连接;
BSW基础软件:包含控制器的基础服务模块,如通讯,存储,复杂驱动这些常用的控制器功能;同时BSW将各个通用的服务模块封层封装,便于向上兼容不同的ASW 逻辑,向下适配不同的芯片; BSW 是AUTOSAR开发的重点部分,后续大部分内容的讲解会围绕BSW 展开;
**Microcontroller:**微控制器MCU,软件运行的载体;

BSW 模块

BSW 分为服务层(Service Layer),ECU 抽象层(ECU Abstraction Layer),硬件抽象层(MCAL),复杂驱动(CDD)

BSW 架构概览
**服务层:**为BSW 的最上层,提供如下功能/接口:
➢ Os功能
➢ 通信与网络管理
➢ 内存服务(NVRAM 管理)
➢ 诊断服务(包括 UDS 通信、错误内存和故障处理)
➢ ECU状态管理、模式管理
➢ 逻辑和时间程序流监控(WdgM)
**ECU 抽象层:**为上层提供抽象层Api 用于外部驱动设备,实现ECU 所有设备(MCU+外设)的封装,如ADC,TIM操作操作接口;
**硬件抽象层MCAL:**提供对主芯片操作的接口,如IO操作,PWM控制,SPI通讯操作配置等接口;这些MCU 操作都具备一些通用的功能,一般MCAL 使用配置功能进行配置,如EB软件;后续会再做介绍;
**复杂驱动层:**不属于通用AUTOSAR协议栈,是用户手写代码实现外设控制的逻辑,比如BCM 上电机驱动芯片的控制逻辑(L9369S),BMS上电芯采样芯片控制逻辑(BQ79616),是手写外设驱动实现,这就属于CDD;一般可理解为主控MCU 控制外设其他外设芯片的逻辑;

如下图,BSW 根据不同的功能 在各个层级做了更细的划分:
AUTOSAR BSW
后面几节,我们会根据功能对BSW 模块进行讲解。

### L9369 SPI传输示例代码 对于L9369设备通过SPI接口进行数据传输的操作,通常涉及初始化SPI外设以及发送接收命令数据的过程。下面提供一段基于STM32平台的C语言实现方式来完成这一功能。 #### 初始化SPI外设 为了使能SPI通信,在程序启动阶段需先设置相应的GPIO引脚为SPI功能,并配置SPI工作模式、波特率等因素: ```c void SPI_Init(void){ // 配置SPI GPIO端口时钟使能 __HAL_RCC_GPIOA_CLK_ENABLE(); // 定义并初始化SPI1的GPIO引脚(PA5, PA6, PA7) GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 开启SPI模块时钟 __HAL_RCC_SPI1_CLK_ENABLE(); // 设置SPI参数 hspi.Instance = SPI1; hspi.Init.Mode = SPI_MODE_MASTER; hspi.Init.Direction = SPI_DIRECTION_2LINES; hspi.Init.DataSize = SPI_DATASIZE_8BIT; hspi.Init.CLKPolarity = SPI_POLARITY_LOW; hspi.Init.CLKPhase = SPI_PHASE_1EDGE; hspi.Init.NSS = SPI_NSS_SOFT; hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi.Init.TIMode = SPI_TIMODE_DISABLE; hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 初始化SPI if (HAL_SPI_Init(&hspi) != HAL_OK){ Error_Handler(); } } ``` 上述代码完成了对SPI外设的基础设定[^1]。 #### 发送指令给L9369并通过SPI读取返回的数据 当需要向L9369发出特定命令或请求其状态信息时,可以通过调用`HAL_SPI_TransmitReceive()`函数来进行同步的数据交换操作: ```c uint8_t SendCommandToL9369(uint8_t cmd, uint8_t *pData, uint16_t Size){ uint8_t status; // 构建要发送的消息包头(这里假设cmd即为消息头部) uint8_t txBuffer[Size + 1]; txBuffer[0] = cmd; memcpy(&txBuffer[1], pData, Size); // 执行SPI传输过程 HAL_StatusTypeDef result = HAL_SPI_TransmitReceive(&hspi, txBuffer, pData, Size + 1, HAL_MAX_DELAY); if(result == HAL_OK){ status = pData[0]; // 获取响应的第一个字节作为状态码 }else{ status = ERROR_COMMUNICATION_FAILED; } return status; } ``` 这段代码展示了如何构建一个简单的命令帧并向目标器件发送它的同时等待回应。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈_大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值