文章目录
本文基于 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中都要添加
代码
编写中断回调函数