【MCAL】TC397+EB-tresos之Port&Dio配置实战 - LED灯闪烁

发布时间:2023年12月28日

本篇文章介绍了在TC397平台使用EB-tresos对Port和Dio驱动模块进行配置的实战过程,配置完成之后,烧录到开发板上之后,对应的D107发光二极管会以一秒为周期进行闪烁。

目录

概述

Port简介

Dio简介

环境与目标?

EB-tresos配置

Port配置?

PortGeneral

PortContainer

Dio配置

DioGeneral

DioPort?

DioChannel

DioChannelGroup?

MCU配置?

ResourceM配置?

Port&Dio驱动使用与调试


概述

每个端口都有自己独立的“Port slice”,它们控制一组对应的输入/输出(GPIO) 硬线,这些硬线
由芯片封装外露引脚或焊盘连接至对应独立的pad之后再按照不同端口连接到对应的“Port slice”。

下图为TC3xx系列芯片的端口引脚的一般结构。

下图中红色全出的部分为Port与Dio在AUTOSAR架构中的位置,注意Port与Dio不可同日而语,Port是对硬线的配置,包括数字IO以及各种外设复用,而Dio提供数字IO的一层索引号,方便应用层控制数字IO高低。


Port简介

Port驱动程序可帮助用户将不同端口的引脚分配给外设或当作普通数字IO使用,并提供配置由底层硬件提供的特性或配套功能。由于引脚有限,这些不同端口引脚共享片上外设,往往一个端口可以配置成不同的模式。但是需要注意的是,在任何给定时间点,端口引脚都只会工作在一个特定的模式(分配给特定的片内外设)。下面这张图介绍了软硬件调用关系(Mapping of hardware-software interfaces)。


Dio简介

Port外设的使用责任由AUTOSAR拆分为两个模块。Port驱动程序配置和设置端口引脚的属性。Dio?驱动程序读取或写入到数字IO引脚 。Dio 驱动程序提供基于Port的通道和通道组读写访问
来驱动内部数字IO端口。Dio 驱动程序中的所有读取和写入服务均未缓冲。通道对应于单个通用 IO 引脚,通道组是指由一个逻辑组表示的多个相邻 Dio?通道的配置的逻辑组合。请注意,Dio 通道组应属于一个 Dio Port。一个Dio Port对应一个芯片的“Port slice”。下图为Dio模块的软硬件调用关系(Mapping of hardware-software interfaces)。


环境与目标?

本文使用的为英飞凌提供的开发板KIT_A2G_TC397XA_TFT,参照原理图可以看到P33.1~P33.4连接到了D107~D110四个发光二极管

涉及的软件如下。

涉及的参考文档如下表。

序号参考资料内容
1《MC-ISAR_TC3xx_UM_Mcu.pdf》英飞凌提供的针对TC3xx芯片MCAL配置用户手册
《ApplicationKitManual-TC3X7-ADAS-V21.pdf》开发板KIT_A2G_TC397XA_TFT说明
2《MC-ISAR_TC3xx_Config_Verification_Manual_Port.pdf》英飞凌提供的针对TC3xx芯片Port配置验证手册,介绍动态代码与配置项的对应。
3《MC-ISAR_TC3xx_Config_Verification_Manual_Dio.pdf》英飞凌提供的针对TC3xx芯片Dio配置验证手册,介绍动态代码与配置项的对应。
4《MC-ISAR_TC3xx_UM_Dio.pdf》英飞凌提供的TC39x芯片Dio用户手册
5《MC-ISAR_TC3xx_UM_Port.pdf》英飞凌提供的TC39x芯片Port用户手册

配置目标如下。

芯片引脚对端方向模式
P33.1D107OUTGPIO

EB-tresos配置

打开EB工程,增加Dio和Port模块至工程中。


Port配置?

PortGeneral

这里我们主要关注两个配置项。

  • PortSetPinDirectionApi:用于配置Port_SetPinDirection()接口是否提供给应用层可用,API端口引脚运行时引用引脚的方向。下图为API说明。

  • PortSetPinModeApi:用于配置Port_SetPinMode()驱动接口是否提供给应用层可用。API用于设置Pin的复用模式,例如CAN或者SPI之类的。下图为API说明。


PortContainer

因为我们要操作的是P33.1,则我们如下图根据PortNumber选择到了序号为14的Container。

点进去之后,因为我们是P33.1,则选择PortPin_1。双击打开配置。

下图就是具体P33.1的配置界面。

下面介绍一下我们常用的配置项。

  • Name:引脚命名,修改为PortPin_D107表意到开发板上发光二极管的丝印。
  • PortPinDirection:引脚方向,配置为PORT_PIN_OUT,输出。
  • PortPinDirectionChangeable:引脚的方向可以在程序运行时修改。
  • PortPinInitialMode:引脚的模式,可以通过查芯片手册查看不同复用模式,这里我们就用作普通IO口,所以选择GPIO即可
  • PortPinLevelValue:初始电平状态,因为我们需要上电D107是熄灭的,根据原理图可得此处应该配置为高。
  • PortPinModeChangeable:引脚的模式可以在程序运行时修改。
  • PortPinInputPullResistor:是否内接上/下拉电阻,此处不需要,选择PORT_PIN_IN_NO_PULL即可。
  • PortPinOutputPinDriveMode:引脚的驱动模式,可以按需要配置为推挽或者是开漏,此处配置为推挽。

Dio配置

DioGeneral

我们主要关注一下配置。

  • DioFlipChannelApi:打开电平反转函数Dio_FlipChannel(),API说明如下。

  • DioDevErrorDetect:默认错误跟踪器 (Det) 检测和通知开关,我们这里不用,不勾选即可。
  • DioSafetyEnable:安全检查和所有相关通知,这里我们不用,不勾选即可。


DioPort?

添加一条,修改DioPortId为33(因为我们操作的IO口为P33下的)。


DioChannel

点进去这个DioPort,选择DioChannel容器,增加一个Channel,注意DioChannelID需要选择为1(因为我们操作的IO口为P33.1),Channel名称表意连接的是D107发光二极管。


DioChannelGroup?

这里提供同时操作一组IO口的Channel组,我们暂时用不到,主要是DioPortMask配置,如果配置成0x06,即可控制Pin1和Pin2。


MCU配置?

因为示例中需要用到延时,需要使用系统定时器,这里只用了Stm的Tick,所以不需要添加STM模块,使用MCU的STM即可。


ResourceM配置?

配置核心使用资源,在CORE0中添加STM。


Port&Dio驱动使用与调试

将代码在EB生成之后,因为动态代码会生成到HighTec工程里,则不需要再剪切到工程里,直接使用HighTec编译之后,使用UDE下载到板卡中即可。下面是示例代码的Cpu0_Main.c如下。

#include "Ifx_Ssw_Infra.h"
#include "IFX_Os.h"

#include "Port.h"
#include "Dio.h"
#include "McalLib.h"


//stm 100MHZ ticks 0.00000001s, 1s 100000000
void delay_ms(uint32 ms)
{
  uint32 CurrSTMTick = Mcal_DelayGetTick();
  uint32 BaseSTMTick = CurrSTMTick;
  while ((uint32)((CurrSTMTick - BaseSTMTick) & 0xffffffff) <
           ms * 100000)
  {
    CurrSTMTick = Mcal_DelayGetTick();
  }
}


void core0_main (void)
{
  volatile unsigned short LoopFlag = 1U;
  unsigned short cpuWdtPassword;
  unsigned short safetyWdtPassword;

  ENABLE();
  /*
   * !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
   * Enable the watchdog in the demo if it is required and also service the watchdog periodically
   * */
  cpuWdtPassword = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[0]);
  safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPassword();
  Ifx_Ssw_disableCpuWatchdog(&MODULE_SCU.WDTCPU[0], cpuWdtPassword);
  Ifx_Ssw_disableSafetyWatchdog(safetyWdtPassword);

  /* init gpio high, led close */
  Port_Init(&Port_Config);

  while (LoopFlag == 1U)
  {
    /* close led */
    Dio_WriteChannel(DioConf_DioChannel_D107_LED_P33_1, STD_HIGH);
    delay_ms(500);
    /* open led */
    Dio_WriteChannel(DioConf_DioChannel_D107_LED_P33_1, STD_LOW);
    delay_ms(500);
  }
}

测试的结果可以看到灯以1秒周期闪烁。使用示波器直接量R106主控芯片一侧与地电压如下。


十六宿舍 原创作品,转载必须标注原文链接。

?2023 Yang Li. All rights reserved.

欢迎关注?『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

文章来源:https://blog.csdn.net/geek_liyang/article/details/135228600
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。