本篇文章介绍了在TC397平台使用EB-tresos对Port和Dio驱动模块进行配置的实战过程,配置完成之后,烧录到开发板上之后,对应的D107发光二极管会以一秒为周期进行闪烁。
目录
每个端口都有自己独立的“Port slice”,它们控制一组对应的输入/输出(GPIO) 硬线,这些硬线
由芯片封装外露引脚或焊盘连接至对应独立的pad之后再按照不同端口连接到对应的“Port slice”。
下图为TC3xx系列芯片的端口引脚的一般结构。
下图中红色全出的部分为Port与Dio在AUTOSAR架构中的位置,注意Port与Dio不可同日而语,Port是对硬线的配置,包括数字IO以及各种外设复用,而Dio提供数字IO的一层索引号,方便应用层控制数字IO高低。
Port驱动程序可帮助用户将不同端口的引脚分配给外设或当作普通数字IO使用,并提供配置由底层硬件提供的特性或配套功能。由于引脚有限,这些不同端口引脚共享片上外设,往往一个端口可以配置成不同的模式。但是需要注意的是,在任何给定时间点,端口引脚都只会工作在一个特定的模式(分配给特定的片内外设)。下面这张图介绍了软硬件调用关系(Mapping of hardware-software interfaces)。
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.1 | D107 | OUT | GPIO |
打开EB工程,增加Dio和Port模块至工程中。
这里我们主要关注两个配置项。
因为我们要操作的是P33.1,则我们如下图根据PortNumber选择到了序号为14的Container。
点进去之后,因为我们是P33.1,则选择PortPin_1。双击打开配置。
下图就是具体P33.1的配置界面。
下面介绍一下我们常用的配置项。
我们主要关注一下配置。
添加一条,修改DioPortId为33(因为我们操作的IO口为P33下的)。
点进去这个DioPort,选择DioChannel容器,增加一个Channel,注意DioChannelID需要选择为1(因为我们操作的IO口为P33.1),Channel名称表意连接的是D107发光二极管。
这里提供同时操作一组IO口的Channel组,我们暂时用不到,主要是DioPortMask配置,如果配置成0x06,即可控制Pin1和Pin2。
因为示例中需要用到延时,需要使用系统定时器,这里只用了Stm的Tick,所以不需要添加STM模块,使用MCU的STM即可。
配置核心使用资源,在CORE0中添加STM。
将代码在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.
欢迎关注?『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。