S32K3 GPIO/DIO 中断 使用介绍 —— 基于MCAL

8 篇文章 12 订阅
本文详细介绍了基于S32K3xx芯片的MCAL层DIO模块配置,包括DIO通道、端口、通道组的概念和配置方法,以及EBtresos配置步骤,如port、DioModule和PortModule的设置。此外,还涉及到中断配置和相关API的使用,为S32DS平台的开发者提供了清晰的指导。
摘要由CSDN通过智能技术生成

本文基于 S32K3xx系列芯片、S32 Design Studio for S32 Platform开发平台以及EB tresos 28.0.0,介绍 MCAL层的开发。

缩写说明:

Dio digital IO
MSCR Multiplexed Signal Configuration Register

Mcal使用注意

  • 解决找不到Mcal头文件的问题:Fatal error: Mcal.h: No such file or directory.

在使用Mcal例程时,可能会出现如下报错:
在这里插入图片描述
原因是安装RTD/Mcal时,我们改变了安装路径。如果是保持的默认安装路径,则不会报错。
解决办法如下:
对工程右键,选择属性:
在这里插入图片描述

更改Linked Resources的路径为你实际安装的路径:
在这里插入图片描述

更改Build Variables中MACAL_PLUGIN_PATH为实际安装路径:
在这里插入图片描述

最后点击Apply and Close,重新编译工程即可。

  • S32DS工程目录与EB tresos工程目录注意事项:

EB tresos工程目录应位于S32DS工程一级目录下,这是默认目录方式,在
EB tresos中代码是按照这个目录方式默认生成存放于S32DS目录下generate文件夹中的
在这里插入图片描述

DIO简介

基本特性

在这里插入图片描述

  • DIO channel:表示一个通用输入输出引脚。
  • DIO port:表示一组DIO引脚(硬件上就打包好的,比如Port A_L表示PTA0–PTA15)
  • DIO channel group:表示一个逻辑组里的多个相邻引脚,一个DIO channel group是一个DIO port的子集。(比如一个16bit的port中的2–6引脚)

3.2.DIO硬件
当调用 Dio_WriteChannel();函数时
在这里插入图片描述

参数ChannelID = DioChannelID + DioPortID * 16;

  • 其中DioChannelID是每个port的channel的值,范围从0–15。(对于PTX16–PTX31也对应的映射到0–15)
  • DioPortID是每个DIO port的数字标识符,如下图所示:
    在这里插入图片描述

Channel group简介:

在这里插入图片描述

1.Dio Port Bit Number:在某一组port中要使用的连续IO的个数
2.Dio Port Offset: IO的偏移量,偏移到要使用的IO的位置
3.Dio Port Mask: DioPortMask = DioPortBitNumber << DioPortOffset
例子:
要使用PTX5、PTX6、PTX7、PTX8这四个IO,则在1处填4,在2处填5

Dio的EB tresos配置

port模块配置

右键ID instance选择Module configurations
在这里插入图片描述
对于在原有工程的基础上,新添加port模块需要特别注意。将调试器用到的引脚添加到其中,否则代码在初始化过程中会把所有不用的引脚初始化一遍,即我们的调试引脚会被初始化为非调试功能,导致调试报错。
添加port模块时进行如下选择会自动生成UntouchedIMCR
在这里插入图片描述

若添加port时忘记上述操作,后续手动添加如下:
图中的4个引脚均为PE调试引脚
在这里插入图片描述

如果这个模块中不添加引脚,那么调试代码执行到如下模块后就会出错:
在这里插入图片描述

要使用Dio,还需添加Dio和Port,如下图所示:
在这里插入图片描述

Dio Module配置

General

在这里插入图片描述

1.Dio FlipChannel Api:使能或失能 Dio_FlipChannel() 函数,此函数用于翻转输出引脚的电平状态。
2.Dio Masked Wrote Port Api:使能或失能Dio_MaskedWritePort() 函数,此函数根据Masked值写port。
3.Dio VirtWrapper Support:此功能为多核下的功能,要求至少一个EcuPartition被定义。
4.Dio Reverse Port Bits:如果使能,写port时bit会反转,比如写3,则实际14/15引脚会被设置;如果失能,则正常,比如写3,实际0/1引脚会被设置。
5.Dio Read Zero For Undefined Port Pins:如果使能,则调用Dio_ReadPort()函数去读未定义的引脚时,会返回0.

DioPort

此列表下展示了所有的io口,可按需求根据port依次配置
在这里插入图片描述

每个port中可配置此port中的channel和channelgroup
在这里插入图片描述

为什么要在port中去配置channel:
在IO相关的许多函数中都需要ChannelID 这个参数,而这个阐述是根据DioChannelID和DioPortID 中计算出来的。ChannelID = DioChannelID + DioPortID * 16;
简单说来,在Dio中的配置我们只是定位了要使用某个port的某个channel,方便Mcal生成对应的引脚定位代码。

Port Module配置

General

  • 对未使用的GPIO的配置:
    在这里插入图片描述

1.PortPin Pull Enable:打钩,即使能上下拉模式,就要去设置2中的上拉或者下拉。对于不使用的引脚,推荐不使用上下拉,避免产生电流,增加MCU的功耗。
2.PortPin Pull Select:打钩即上拉,不打钩即下拉。PortPin Direction:输入or输出。
3.PortPin Level Value:当某个pin被配置为输出时,PORT_PIN_LEVEL_HIGH表示对PDO寄存器写1,即将输入的数据存储在pin上,写0则表示不将输入数据存储在pin中。

  • 对使用的GPIO的相关配置:
    在这里插入图片描述

1.Port SetPINDirection:使能Port_SetPinDirection()函数。
2.Port SetPinMode Api:使能配置IO模式的相关函数
3.Port Signal Inversion Config Enable:使能引脚的PortPin Invert Control功能,在每个单独的引脚中可以配置是否使能。

PortContainer

在这里插入图片描述

新建一个容器,新的pin即放在容器中(也可以建几个container,分开放PIN)
在这里插入图片描述

这里面包括了GPIO的各基础设置。如下图所示:
在这里插入图片描述

1.PortPin Pull Enable:使能则表示pin可以配置为上拉或者下拉
2.PortPin Pull Select:打钩即上拉,不打钩即下拉。
3.PortPin with Read Back:使能即打开输入buffer,可读数据(对于输入pin)
4.PotPin Pull Keeper:在standby模式使能或者失能pad keeping。
5.PortPin Direction Changeable:使能这个配置,则我们可以在代码中去改变pin的输入输出方向
6.PortPin Invert Control:实际是配置MSCR寄存器的bit 17来使能或者失能反转电平的功能。
7.PortPin Mscr(dynamic range):根据Dio port数字标识符计算如PTB19的值 2 * 16 + 19 = 51,也可以直接查表S32K3xx_IOMUX.xlxs
8.PortPin Mode:选择引脚的默认功能or复用功能。

软件

基础配置:

OsIf_Init(NULL_PTR);
用于初始化system tick,最后是往一个固定地址写东西,但是手册里没查到这个地址。

Mcu_Init(&Mcu_Config);
初始化电源和复位的相关寄存器

Mcu_InitClock(McuClockSettingConfig_A_HighPerf);
初始化PLL和相关时钟

Mcu_DistributePllClock();
待PLL稳定后,使能PLL

Mcu_SetMode(McuModeSettingConf_Run);
设置电源模式

Platform_Init(NULL_PTR);
初始化外设驱动和中断

Port_Init(&Port_Config);
初始化所有PIN

Dio相关API

Dio_LevelType Dio_ReadChannel( Dio_ChannelType ChannelId);
读PIN的电平

void Dio_WriteChannel( Dio_ChannelType ChannelId, Dio_LevelType Level);
写PIN的电平

Dio_LevelType Dio_FlipChannel( Dio_ChannelType ChannelId );
PIN被配置为输出,调用此函数翻转输出。如果PIN被配置为输入,则没有影响。

Dio_PortLevelType Dio_ReadPort( Dio_PortType PortId );
返回port的电平值

void Dio_WritePort( Dio_PortType PortId, Dio_PortLevelType Level);
写一个port的电平值

Interrupt configuration

Port配置

在这里插入图片描述

Icu配置

IcuHwInterruptConfigList

根据需求添加硬件物理中断通道,并使能中断。
在这里插入图片描述

IcuSiul2

在IcuSiul2中添加中断通道号
在这里插入图片描述

IcuChannel

在这里插入图片描述

在这里插入图片描述

注意第二个参数IcuChannelRef,添加对应的依赖

Platform配置

Interrupt controller

在这里插入图片描述

在这里插入图片描述

SUIL_0_IRQn对应0-7的外部引脚中断
SUIL_1_IRQn对应8-15的外部引脚中断
SUIL_2_IRQn对应16-23的外部引脚中断
SUIL_3_IRQn对应24-31的外部引脚中断

Generic Interrupt Setting

在这里插入图片描述

SIUL2_EXT_IRQ_8_15_ISR对对应的源文件中寻找。
在这里插入图片描述

依赖关系

主要是Icu模块的依赖关系,如下图所示:
在这里插入图片描述

相应的在EB和S32DS中都要添加

代码

在这里插入图片描述

编写中断回调函数
在这里插入图片描述

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值