基于MCAL的S32K3 GPIO外部中断使用

0、简介

本文基于S32K312 介绍GPIO的外部中断,主要是记录开发流程,本文基于《基于MCAL的S32K3 MCU使用》的工程,环境如下:

MCU:NXP S32k312

RTD版本:SW32K3_S32M27x_RTD_R21-11_4.0.0_D2311

EB版本:tresos Studio 29.0

本文是软件模拟SPI(后简称SSPI)的前提,故使用相关pin。

2、MCAL

2.1 PORT配置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.2 ICU配置

IcuHwInterruptConfigList

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

IcuSiul2

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

IcuChannel

在这里插入图片描述
在这里插入图片描述

### S32K3 GPIO 锁存功能配置详解 S32K3 系列微控制器的 GPIO 模块支持锁存(Latch)功能,该功能用于在特定条件下保持引脚的状态不变,即使输入信号发生变化也不会影响输出状态。这种机制在需要防止意外状态变化或确保稳定输出的应用中非常有用。 #### 1. GPIO 锁存功能的基本概念 GPIO 锁存功能通常通过寄存器配置实现,主要涉及以下两个方面: - **数据方向控制**:设置引脚为输出模式,以便可以写入数据。 - **锁存使能配置**:启用锁存功能,使得一旦设置了某个引脚的状态,即使后续尝试更改该引脚的状态,也无法改变其当前值,除非显式解锁。 #### 2. 配置步骤 要配置 S32K3GPIO 锁存功能,需使用 MCAL(Microcontroller Abstraction Layer)提供的 API 或直接操作寄存器。以下是基于 MCAL 的配置方法: ##### (1) 初始化 Port 模块 首先,确保已经正确初始化了 `Port` 模块,这是配置任何 GPIO 功能的前提条件。可以通过调用 `Port_Init()` 函数并传入相应的配置结构体来完成初始化 [^3]。 ```c Port_Init(&Port_Config); ``` ##### (2) 设置引脚方向为输出 为了能够写入数据到引脚,必须将引脚的方向设置为输出。这可以通过调用 `Port_SetPinDirection()` 函数来实现,并且需要确保该函数在配置中是启用的 [^3]。 ```c Port_SetPinDirection(PortChannel_X_PinY, PORT_PIN_DIRECTION_OUTPUT); ``` ##### (3) 写入初始电平值 在启用锁存功能之前,通常会先设置一个初始的高或低电平值。可以使用 `Dio_WritePort()` 或 `Dio_WriteChannel()` 函数来写入电平值 [^2]。 ```c Dio_WriteChannel(DioChannel_X_Y, STD_HIGH); // 设置为高电平 ``` ##### (4) 启用锁存功能 S32K3GPIO 锁存功能通常是通过配置 `PORTx_PCRn[LK]` 寄存器位来实现的。这个位一旦被置位,就不能再被修改,直到系统复位。因此,在调用相关函数或操作寄存器之前,请确保确实需要永久锁定该引脚的状态。 如果使用的是 MCAL,可能需要手动操作寄存器,因为标准的 MCAL API 可能不直接提供锁存配置接口。例如: ```c PORTX->PCR[PinNumber] |= PORT_PCR_LK_MASK; // 启用锁存功能 ``` 其中 `PORTX` 是对应的端口寄存器组(如 `PORTA`, `PORTB` 等),`PinNumber` 是要配置的引脚编号。 #### 3. 注意事项 - **不可逆性**:一旦启用了锁存功能(即 `LK` 位被置位),就无法再通过软件清除该位,只有系统复位才能解除锁存状态。 - **安全性**:由于锁存功能会影响系统的灵活性,建议仅在必要时启用,并确保在设计阶段充分考虑其影响。 - **调试困难**:启用锁存后,调试过程中可能会遇到难以追踪的问题,因为引脚状态不会随程序逻辑而变化。 #### 4. 示例代码 下面是一个完整的示例代码片段,展示了如何使用 MCAL 和底层寄存器操作来配置 S32K3GPIO 锁存功能: ```c #include "Port.h" #include "Dio.h" int main(void) { /* 初始化平台驱动 */ Platform_Init(NULL_PTR); /* 安装中断处理程序(可选) */ Platform_InstallIrqHandler(SIUL_2_IRQn, &SIUL2_EXT_IRQ_16_23_ISR, NULL_PTR); /* 启用中断(可选) */ Platform_SetIrq(SIUL_2_IRQn, TRUE); /* 初始化 Port 模块 */ Port_Init(&Port_Config); /* 设置引脚方向为输出 */ Port_SetPinDirection(PortChannel_C_14, PORT_PIN_DIRECTION_OUTPUT); // 假设使用 PTC14 /* 写入初始高电平 */ Dio_WriteChannel(DioChannel_C_14, STD_HIGH); /* 启用锁存功能 */ PORTC->PCR[14] |= PORT_PCR_LK_MASK; // 锁定 PTC14 引脚 while (1) { // 主循环 } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值