AUTOSAR项目实战(6)-Port及Dio模块配置实践

admin 2025年2月10日10:38:50评论7 views字数 6117阅读20分23秒阅读模式

目录

AUTOSAR项目实战(6)-Port及Dio模块配置实践

前言

汽车电子嵌入式开始更新全新的AUTOSAR项目实战专栏内容,从01搭建一个AUTOSAR工程,内容会覆盖AUTOSAR通信协议栈、存储协议栈、诊断协议栈、MCAL、系统服务、标定、Bootloader、复杂驱动、功能安全等所有常见功能和模块,全网同步更新开发设计文档(后期也会更新视频内容)。本文为MCAL系列配置-PortDio模块配置实践。

AUTOSAR项目实战(5)-MCU模块配置实践》一文我们实现了MCU模块的配置,本文将实现PortDio模块的配置,配置了这三个模块后,理论上我们的MCU芯片就能正常跑起来了,能完成最简单的LED点灯的功能了!

环境

AUTOSAR BSW ToolVector

AUTOSAR MCAL ToolEB

Hardware Platform: Infineon Tricore TC387

Build Tool: Tasking

Debug Tool: UDE

AUTOSAR项目实战系类文章

AUTOSAR项目实战(1)-数据地址访问对齐问题分析

AUTOSAR项目实战(2)-内存访问异常问题分析

AUTOSAR项目实战(4)-系统总线及外设错误问题分析

AUTOSAR项目实战(3)-OsCounter访问权限问题分析

AUTOSAR项目实战(5)-MCU模块配置实践

注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1.硬件分析

如下图所示,我们的开发板使用了TC387芯片的很多Port引脚,但是,无论哪一个Port引脚要么是输入引脚,要么就是输出引脚。所以,我们选了一个输入引脚(CAN Rx, P20.7)和已给输出引脚(CAN Tx, P20.8)作为本文的示例来讲解,其他的Port引脚配置类似。

AUTOSAR项目实战(6)-Port及Dio模块配置实践

AUTOSAR项目实战(6)-Port及Dio模块配置实践

确定要配置的Port Pin引脚后,我们需要查看对应芯片手册(Infineon-AURIX_TC38x-UserManual-v02_00-EN.pdf)的引脚信息。

AUTOSAR项目实战(6)-Port及Dio模块配置实践

配置Port Pin的时候需要上图的信息。

2.Port模块配置

AUTOSAR项目实战(6)-Port及Dio模块配置实践

AUTOSAR项目实战(6)-Port及Dio模块配置实践

对于输入Pin脚,主要配置以下两个参数:

PortInInputPullResistor: 配置输出引脚是否需要MCU内部上拉还是下拉,还是不需要上下拉。

至于MCU的输入引脚什么时候需要上下拉,什么时候不需要上下拉,我们可以尝试问问ChatGPT.

2.1 什么是上下拉

问题1MCU的Port引脚为输入引脚时,什么时候要配置为上拉,什么时候要配置为下拉,什么时候配置为没有上下拉

ChatGPT回答

MCU 设计中,将 Port 引脚配置为输入模式 时,是否需要上拉、下拉或无上下拉,取决于具体应用场景。以下是不同情况下的选择依据:

1. 配置为上拉(Pull-up

适用情况

·默认输入为高电平(逻辑 1,防止浮空状态。

·开关按键、拨动开关等:通常一端接地,按下时接地,不按时需要上拉到高电平。

·I²C 总线(SDASCLI²C 规范要求必须有上拉电阻,否则通信无法正常工作。

·外部信号可能是开漏(Open-Drain)或集电极开路(Open-Collector)输出,需要上拉提供逻辑 1

·低功耗应用:上拉比下拉通常消耗更少的功耗,减少电流泄漏。

示例

·按键输入(按下接地,松开为高电平):

o配置 MCU 内部上

o或使用外部上拉电阻(如 10kΩ

MCU Pin ----[10kΩ]---- VCC

                        |

                     [SW]

                        |

                     GND

2. 配置为下拉(Pull-down

适用情况

·默认输入为低电平(逻辑 0,防止浮空状态。

·开关按键、拨动开关等:通常一端接 VCC,按下时接 VCC,不按时需要下拉到低电平。

·某些总线或协议要求默认低电平,如部分 SPI 片选信号(CS)。

·MCU 的特殊功能要求默认低电平,例如 Boot 模式选择(某些芯片上电时通过某个引脚的状态决定启动模式)。

示例

·按键输入(按下为高电平):

o配置 MCU 内部下

o或使用外部下拉电阻(如 10kΩ

                   VCC

                      |

                    [SW]

                       |

MCU Pin ----[10kΩ]---- GND

3. 无上下拉(Floating/Hi-Z

适用情况

·外部有明确的信号源驱动(如传感器、通信信号等)。

·多设备共用一个信号线,不应强制上拉或下拉,例如UART RX 引脚、SPI MISO(主机输入)

·高阻态(Hi-Z)应用,如多设备共用某个 I/O 端口(总线),需要避免影响其他设备驱动信号。

·某些低功耗模式下,避免不必要的电流消耗(避免上拉或下拉导致漏电流)。

示例

·UART RX 引脚(由外部设备驱动,不需要内部上拉/下拉)

·SPI MISO(主机输入

·外部传感器数据输入端(由传感器提供高低电平)

·ADC(模拟输入),通常不使用上拉/下拉,以免影响测量准确性

4. 何时避免浮空(未定义状态

如果输入引脚未连接到明确的高/低电平(悬空),可能会导致:

·电平不稳定(受环境噪声影响),误触发中断或错误读取数据。

·不必要的功耗,由于 CMOS 输入级在悬空时可能进入高阻状态,导致输入级 MOS 管部分导通,产生漏电流

一般情况下,不建议让输入引脚悬空,除非有特定应用需要(如 ADC 模拟输入)。

5.

场景

配置

按键(常开,按下接地)

上拉

按键(常开,按下接 VCC

下拉

I²C 总线(SCL/SDA

上拉(必须)

SPI MISO(主设备输入)

无上下拉

UART RX

无上下拉

传感器数据输入

无上下拉(通常由传感器驱动)

低功耗应用

无上下拉或根据需要选择最优方案

需要默认高电平

上拉

需要默认低电平

下拉

场景

配置

如果不确定,可以:

1.查看设备手册(Datasheet,看是否推荐上拉/下拉。

2.观察信号是否悬空,如果 MCU 读到不稳定值(0/1 交替),通常需要上拉或下拉。

3.考虑功耗,在低功耗应用中,选择合适的上下拉方式以减少电流损耗。

2.2 CAN Rx是否应该配置为上下拉

问题2MCUCAN控制器的Rx输入引脚,应该配置为上拉还是下来,还是不需要配置上下拉?

ChatGPT回答MCU CAN 控制器 RX(接收)引脚通常不需要配置上下拉,即保持浮空(Hi-Z

原因分

1.CAN 总线是差分信号

oCAN 通信使用CAN_H(高电平)CAN_L(低电平)两根信号线进行差分传输,而Rx 直接接收 CAN 收发器(CAN Transceiver)的输出,其信号是由收发器决定的。

o由于 CAN 本质上是一个物理层收发器驱动的信号MCU 不需要内部上拉或下拉来维持电平。

2.CAN 收发器的输出已被设计为有效信号

oCAN 接收器(PHY,如TJA1050SN65HVD230)的 RX 引脚是推挽输出(Push-Pull,信号稳定,不需要 MCU 额外提供上拉/下拉。

o外部 CAN 收发器已经决定了 CAN RX 的逻辑电平,如果 MCU 再加上拉或下拉,可能会影响通信质量。

3.错误配置可能导致的问题

o上拉(Pull-up:会影响 RX 信号,可能使接收到的信号失真或增加不必要的电流消耗。

o下拉(Pull-down:可能导致 CAN_RX 低电平滞留,影响数据接收,甚至影响 CAN 总线的正常通信。

正确的配

·MCU  CAN RX 引脚应配置为输入模式(Input Floating / Hi-Z,不加内部上拉或下拉。

·需要一个外部 CAN 收发器(如TJA1050SN65HVD230MCP2551),收发器的RX 输出直接连 MCU RX,它已经提供了稳定的信号。

CAN 总线 ---> CAN 收发器(TJA1050---> MCU CAN RX (浮空输入)

CAN_H ---+

                 |  差分信号

CAN_L ---+

CAN 收发器

-----------------

TXD <--- MCU CAN TX

RXD ---> MCU CAN RX (无上下拉)

-----------------

总结

MCU  CAN RX 引脚应该配置为浮空输入(Hi-Z),不使用上拉或下拉CAN 收发器已经提供了稳定的输出信号,不需要额外干预不要配置内部上拉或下拉,否则可能影响 CAN 通信的稳定性

综上所述,P20.7这个CAN Rx输入引脚的PortInInputPullResistor参数配置为NO PULL.

PortPinInputPadLevel: 配置Pin脚数字电路逻辑电平标准。现在的MCU一般都是用CMOS工艺,所以一般都选着CMOS_AUTOMOTIVE.

AUTOSAR项目实战(6)-Port及Dio模块配置实践

对于输出Pin脚,主要配置以下三个参数:

PortPinInitalMode: 这个需要参考第一章节中的引脚分析,MCUPort引脚一般都具有复用功能,我们使用Pin 20.8作为CAN00Tx引脚,所以需要选着ALT 5.

PortPinLevelValue: 配置输出引脚的默认电平,这个根据实际需求来配置即可。

PortPinOutPinDriveMode: 配置输出引脚是开漏(Open drain)输出,还是推挽(Push Pull)输出

2.3 什么是开漏和推挽输出

问题3MCU的输入引脚什么时候配置为开漏(Open drain)输出,什么时候配置为推挽(Push Pull)输出

ChatGPT回答 MCU 设计中,开漏(Open-Drain  推挽(Push-Pull 是两种常见的 GPIO 输出模式。选择哪种模式,取决于具体的应用需求。以下是详细的分析

1. 开漏输出(Open-Drain

工作原

·仅能输出低电平(0),不能主动输出高电平(1

· MCU 输出 低电平(0 时,内部 MOSFET 导通,引脚被拉低到 GND

· MCU 输出 高电平(1 时,内部 MOSFET 关闭引脚处于高阻态(Hi-Z),需要外部上拉电阻 提供高电平

·典型的上拉电阻值:4.7kΩ ~ 10kΩ(根据电流需求调整)

适用场

场景

原因

I²C 总线(SDASCL

I²C 需要多设备连接,必须使用 开漏+上拉电阻 形成线与逻辑(Wired-AND)。

多个设备共享信号线(如中断 INT、复位 RESET

确保多个设备能共同拉低信号线,而不会发生短路。

外部晶体管驱动电路(如驱动继电器、LED

通过外部上拉到较高电压(如 12V),从而控制更大电流。

异步通讯接口,如 SMBus1-Wire

需要开漏以支持线与逻辑和双向通信。

外部设备要求开漏(如某些 EEPROM LCD 驱动)

设备数据手册要求使用开漏。

电路示

MCU GPIO ----+---- 4.7kΩ ---- VCC

                           |

                      [设备]

                           |

                         GND

2. 推挽输出(Push-Pull

工作原

·能够主动输出高电平(1)和低电平(0

·内部有两个 MOSFET(一个 P-MOS 负责输出高电平,一个 N-MOS 负责输出低电平)

·无需外部上拉电阻,输出电流能力更强

适用场

场景

原因

普通 GPIO 控制(如 LED、蜂鸣器)

直接驱动负载,无需额外上拉电阻。

SPIUARTCAN 等高速通讯接口

需要稳定的高低电平转换,提高信号质量。

PWM 输出(驱动马达、伺服等)

推挽输出可以直接驱动负载,提高效率。

片选信号(CS)和控制信号(如 RESET, ENABLE

需要快速、可靠的高低电平切换,避免悬空状态。

高速信号传输(如时钟信号)

推挽模式提供更强的驱动能力,提高信号完整性

电路示

MCU GPIO ---- 设备输入

无需额外电阻,直接连接目标设备

3.选择开漏还是推挽?

场景

推荐模式

I²C 通信(SDA, SCL

开漏 + 上拉

多设备共享信号(如外部中断)

开漏 + 上拉

控制 LED、蜂鸣器

推挽

SPIUARTCANPWM 等高速信号

推挽

复位信号 RESET

开漏 + 上拉

外部晶体管或功率驱动(MOSFET, 继电器)

开漏 + 上拉

·开漏输出(Open-Drain

o适用于多个设备共享信号线、I²C、低速信

o必须外接上拉电

o仅能主动输出低电平(0,高电平由外部上拉提供

·推挽输出(Push-Pull

o适用于普通 GPIOSPIUARTPWM、高速信

o无需上拉电

o能主动输出高低电平,驱动能力强

综上所述,我们的P20.8 CAN Tx应该配置为推挽输出,一般没有特殊功能或者用途都默认配置为推挽输出。开漏输出需要外部上拉电路支持。

3.Dio模块配置

AUTOSAR项目实战(6)-Port及Dio模块配置实践

Dio封装了Port模块,配置也很简单,如上图所示,按照Port组(e.g. DioPort_20)依次配置需要的Channel即可。

CAN00_RX这个Dio Chanel就对应 --> P 20.7这个输入引脚。

CAN00_TX这个Dio Channel就对应 --> P 20.8 这个输入引脚。

Dio配置生成代码Dio_Cfg.h中就会有Dio Channel的宏定义,我们在使用Dio_ReadChannelDio_WriteChannel读写Port口的时候,需要用到Channel号。

AUTOSAR项目实战(6)-Port及Dio模块配置实践

5.Dio模块的使用

AUTOSAR架构下Dio模块的使用一般有两种方式。

5.1 其他模块引用Dio Channel

如下图所示,CanTrcv模块需要配置Can Rx引脚,引用的就是Dio模块的CAN00_Rx Channel.

AUTOSAR项目实战(6)-Port及Dio模块配置实践

CanTrcv的静态代码会直接调用Dio_ReadChannel读取CAN Rx的电平信号。

AUTOSAR项目实战(6)-Port及Dio模块配置实践

5.2 直接通过IoHwAb模块封装Dio接口使用

如果用户需要直接读写Port引脚,就会使用IoHwAb模块封装Dio接口。

Example

#include “Dio.h”void IoHwAb_Write_CAN00_Tx(Dio_LevelType Level){    Dio_WriteChannel(DioConf_DioChannel_CAN02_TX, Level);}

注意AUTOSAR架构软件,SWC调用IoHwAb的接口需要经过RTE接口,这些AUTOSAR方法论的内容,我们后面再讲解。

6.上板测试

如下图所示,CanTrcv会使用到Dio_ReadChannelDio_WriteChannel读写Port引脚。

AUTOSAR项目实战(6)-Port及Dio模块配置实践

AUTOSAR项目实战(6)-Port及Dio模块配置实践

在使用Dio, Port模块的实际工程中经常会遇到这样的问题:

SWC开发工程师抱怨:我读不到Port引脚的高低电平啊?我控制不了Port引脚的电平啊?

这个时候,除了需要排查SWC的控制逻辑和调用接口是否正确外,我们可以通过观测Port引脚模块的寄存器直接看Port的输入输出是否符合我们的要求,这比使用万用表外部测量电平要简单点,当然,前提是有调试仿真环境。

AUTOSAR项目实战(6)-Port及Dio模块配置实践

AUTOSAR项目实战(6)-Port及Dio模块配置实践

AUTOSAR项目实战(6)-Port及Dio模块配置实践

AUTOSAR项目实战(6)-Port及Dio模块配置实践

7.总结

本文详细介绍了AUTSOAR架构下的PortDio模块的配置和使用,看起来好像很简单,实际工程在bringup的时候,Port模块的配置至关重要,Port模块没有配置正确就会导致各种CAN, LIN, ETH, SPI等模块功能异常,极大的影响开发进度,所以需要我们真正理解Port模块的配置和调试。

End

原文始发于微信公众号(汽车电子嵌入式):AUTOSAR项目实战(6)-Port及Dio模块配置实践

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月10日10:38:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   AUTOSAR项目实战(6)-Port及Dio模块配置实践https://cn-sec.com/archives/3720724.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息