S32的进阶之路->7,S32DS的外部中断配置

硬件: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);//清标志位
}

编译-烧录-运行,实验成功。

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值