硬件:S32K144开发板
软件:S32DS 2.2
1,S32K144硬件连接说明
IO口分配情况如下,S32K144开发板具有3个按键和4个LED灯,具体与芯片的引脚连接情况如下所示。
* IO口分配情况
* KEY1 PTC12
* KEY2 PTC13
* KEY3 PTB2
* LED1 PTD16
* LED2 PTD15
* LED3 PTD1
* LED4 PTD0
2,S32K144的GPIO配置
S32DS的外设配置通过图形配置工具Component Inspector来实现。双击Components下方的pin_mux按钮打开图形配置工具Component Inspector(可能要多次双击)。可以双击图形配置工具Component Inspector空白处让它最大化方便我们进行配置。
选择GPIO进行配置,将按键引脚配置成输入input,将LED灯引脚配置成输出output。
接下来配置输入引脚为下拉模式,默认电平为低电平。这样按键按下则为高电平,抬起则为低电平。右击PTC12,选择第二个选项Pin Functional Properties,将上下拉模式选择为下拉,默认电平为低电平。完成后点击Done完成GPIO引脚配置。关闭图形配置工具Component Inspector回到工程。
3,S32K144的GPIO常用函数说明
1,配置端口引脚外部中断函数PINS_DRV_SetPinIntSel。输入变量base为PORT_Type 类型的端口号,输入变量pin为引脚号,输入变量intConfig为中断模式。
/*功能**********************************************************************
*
* 函数名称 : PINS_DRV_SetPinIntSel
* 描述:此功能配置端口引脚中断/DMA 请求。
*
* 工具:PINS_DRV_SetPinIntSel_Activity
*结束**************************************************************************/
void PINS_DRV_SetPinIntSel(PORT_Type * const base,
uint32_t pin,
port_interrupt_config_t intConfig)
中断模式宏定义如下。
PORT_INT_LOGIC_ZERO = 0x8U, /*!< Interrupt when logic 0. */
PORT_INT_RISING_EDGE = 0x9U, /*!< Interrupt on rising edge. */
PORT_INT_FALLING_EDGE = 0xAU, /*!< Interrupt on falling edge. */
PORT_INT_EITHER_EDGE = 0xBU, /*!< Interrupt on either edge. */
PORT_INT_LOGIC_ONE = 0xCU, /*!< Interrupt when logic 1. */
2,安装中断处理程序函数INT_SYS_InstallHandler。输入变量irqNumber为中断号,输入变量newHandler为新的中断处理函数地址。
/*功能**********************************************************************
*
* 函数名称 : INT_SYS_InstallHandler
* 描述:为给定的 IRQ 编号安装中断处理程序
* 此功能将允许应用程序注册/替换中断
* 处理程序。IRQ 0 将从 Vector 16 地址开始。
*结束**************************************************************************/
void INT_SYS_InstallHandler(IRQn_Type irqNumber,
const isr_t newHandler,
isr_t* const oldHandler)
3,中断使能函数INT_SYS_EnableIRQ。输入变量irqNumber为中断号。
/*功能**********************************************************************
*
* 函数名称 : INT_SYS_EnableIRQ
* 描述 : 为给定的 IRQ 编号启用中断。
*结束**************************************************************************/
void INT_SYS_EnableIRQ(IRQn_Type irqNumber)
4,读取端口中断状态标志函数PINS_DRV_GetPortIntFlag。输入变量base为PORT_Type 类型的端口号。
/*功能**********************************************************************
*
* 函数名称 : PINS_DRV_GetPortIntFlag
* 描述:此函数读取整个端口中断状态标志。
*结束**************************************************************************/
uint32_t PINS_DRV_GetPortIntFlag(const PORT_Type * const base)
5,清除端口中断标志函数PINS_DRV_ClearPortIntFlagCmd。输入变量base为PORT_Type 类型的端口号。
/*功能**********************************************************************
*
* 函数名称 : PINS_DRV_ClearPortIntFlagCmd
* 描述 : 此功能清除整个端口中断状态标志。
*结束**************************************************************************/
void PINS_DRV_ClearPortIntFlagCmd(PORT_Type * const base)
4,S32K144的GPIO实战
按下三个KEY后,三个LED对应进行状态翻转。
中断配置初始化如下。
int main(void)
{
//....省略为基础工程初始化
//配置GPIO外部中断模式
PINS_DRV_SetPinIntSel(PORTC, 12, PORT_INT_RISING_EDGE);
PINS_DRV_SetPinIntSel(PORTC, 13, PORT_INT_RISING_EDGE);
PINS_DRV_SetPinIntSel(PORTB, 2, PORT_INT_RISING_EDGE);
//配置中断
INT_SYS_InstallHandler(PORTC_IRQn, &PTC_EXT_IRQ, NULL);
INT_SYS_EnableIRQ(PORTC_IRQn);
INT_SYS_InstallHandler(PORTB_IRQn, &PTB_EXT_IRQ, NULL);
INT_SYS_EnableIRQ(PORTB_IRQn);
while(1);
}
外部中断处理函数如下。
/* 按键外部中断处理函数 */
uint32_t keyInitFlag;
void PTB_EXT_IRQ(void)
{
keyInitFlag = PINS_DRV_GetPortIntFlag(PORTB);
if((keyInitFlag >> 2) & 0x01)
{
PINS_DRV_TogglePins(PTD,1 << 1);
}
PINS_DRV_ClearPortIntFlagCmd(PORTB);//清标志位
}
void PTC_EXT_IRQ(void)
{
keyInitFlag = PINS_DRV_GetPortIntFlag(PORTC);
if((keyInitFlag >> 12) & 0x01)
{
PINS_DRV_TogglePins(PTD,1 << 16);
}
if((keyInitFlag >> 13) & 0x01)
{
PINS_DRV_TogglePins(PTD,1 << 15);
}
PINS_DRV_ClearPortIntFlagCmd(PORTC);//清标志位
}
编译-烧录-运行,实验成功。