【MCAL】TC397+EB-tresos之Port&Dio配置实战 - LED灯闪烁
本篇文章介绍了在TC397平台使用EB-tresos对Port和Dio驱动模块进行配置的实战过程,配置完成之后,烧录到开发板上之后,对应的D107发光二极管会以一秒为周期进行闪烁。
目录
概述
每个端口都有自己独立的“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四个发光二极管
涉及的软件如下。
- EB-tresos:用于生成动态代码,具体工程搭建参考《【AUTOSAR MCAL】MCAL基础与EB tresos工程新建》。
- HighTech:用于编译生成elf文件,具体的工程搭建参考《【MCAL】HighTec集成TC3xx对应MCAL的Demo》。
- UDE 5.2:用于下载和调试程序。
涉及的参考文档如下表。
序号 | 参考资料 | 内容 |
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-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.
欢迎关注?『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!