嵌入式__恩智浦__KEA128__KBI模块

0X00 KBI简介

恩智浦Kinetis KE0x、KEA 系列MCU片上集成有KBI ( Keyboard Interrupts )键盘中断模块。KEA128有两个支持引脚中断的 KBI 模块,KBI0和KBI1。KBI使用总线时钟,SIM_SCGC寄存器使能KBI总线时钟。

1,KBI 端口分配

KBI 端口
KBI0P0 ~ KBI0P7 PTA0 ~ PTA7
KBI0P8 ~ KBI0P15 PTB0 ~ PTB7
KBI0P16 ~ KBI0P23 PTC0 ~ PTC7
KBI0P24 ~ KBI0P31 PTD0 ~ PTD7
KBI1P0 ~ KBI1P7 PTE0 ~ PTE7
KBI1P8 ~ KBI1P15 PTF0 ~ PTF7
KBI1P16 ~ KBI1P23 PTG0 ~ PTG7
KBI1P24 ~ KBI1P31 PTH0 ~ PTH7

0X01 KEA常用驱动功能

1,KBI初始化

//======================================================================
//函数名称:kbi_init
//功能概要:初始化KBI,选择使用模块,并选择端口号作为KBI功能引脚,选择触发模式和条件
//参 数:(1)kbiNo:模块通道号。
// (2)kbiMod:模式选择:0:仅边缘检测,1:边缘检测和电平控制。
// (3)EdgeSelect:触发条件:0:下降沿或低电平, 1:上升沿或高电平。
//返 回: 无
//说 明:无
//======================================================================
void kbi_init(uint_16 kbiNo, uint_8 kbiMod, uint_8 EdgeSelect);

2,KBI模块中断使能

//======================================================================
//函数名称:kbi_enable_irq
//功能概要:KBI模块中断使能函数
//参 数: kbiNo:模块通道号。
//返 回: 无
//说 明: 无
//======================================================================
void kbi_enable_irq(uint_16 module);

3,禁用KBI引脚中断

//======================================================================
//函数名称:kbi_disable_pin_irq
//功能概要:禁用KBI引脚中断
//参 数: kbiNo:模块通道号。
//返 回: 无
//说 明:无
//======================================================================
void kbi_disable_pin_irq(uint_16 kbiNo);

4,使能KBI引脚中断

//======================================================================
//函数名称:kbi_enable_pin_irq
//功能概要:使能KBI引脚中断
//参 数: kbiNo:模块通道号。
//返 回: 无
//说 明: 无
//======================================================================
void kbi_enable_pin_irq(uint_16 kbiNo);

0X02 常用驱动功能配置

1,初始化

void kbi_init(uint_16 kbiNo, uint_8 kbiMod, uint_8 EdgeSelect)
{
    //(1)声明局部变量
	uint_8 module; //模块号
	uint_8 chn;   //通道号

	//(2)解析模块号和通道号
	kbi_mux_val(kbiNo,&module,&chn);

	//(3)根据不同模块号进行设置
	switch(module)
	{
	//(3.1)KBI0模块
	case 0:
		SIM_SCGC |=  SIM_SCGC_KBI0_MASK; // 使能KBI0总线时钟
		KBI0_SC = 0;					//初始化KBI0_SC寄存器(状态寄存器)
		if (kbiMod == 0)  //进行边缘检测
		{
			KBI0_SC |= 0x00;
		}
		else                         //否则 检测和电平控制
		{
			KBI0_SC |= 0x01;
		}
		//触发条件
		if(EdgeSelect == 0)  //下降沿或低电平触发
		{
			KBI0_ES |= KBI_ES_KBEDG(0x00);	//当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发
			PORT_PUE0 |= 1<<chn;
		}
		else  //上升沿或低电平触发
		{
			KBI0_ES |= KBI_ES_KBEDG(1<<chn);//当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发
		}
		KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
		break;
		//(3.1)KBI1模块
	case 1:
		SIM_SCGC |=  SIM_SCGC_KBI1_MASK; // 使能KBI1总线时钟
		if (kbiMod == 0)  //边缘检测
		{
			KBI1_SC |= 0x00;
		}
		else  //边缘检测和电平控制
		{
			KBI1_SC |= 0x01;
		}
		if(EdgeSelect == 0)		//触发条件:0-31位每一位代表每个引脚
		{
			KBI1_ES |= KBI_ES_KBEDG(0x00);	//当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发
			PORT_PUE1 |= 1<<chn;  //上拉引脚
		}
		else
		{
			KBI1_ES |= KBI_ES_KBEDG(1<<chn);  //当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发
		}
		KBI1_PE |= KBI_PE_KBIPE(1<<chn);  //中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
		break;
	}
}

2,KBI模块中断使能

void kbi_enable_irq(uint_16 kbiNo)
{
	//(1)声明局部变量
	if(kbiNo == 0)
	{
		KBI0_SC |= KBI_SC_KBSPEN_MASK;     //使能清除中断源引脚寄存器
		KBI0_SC |= KBI_SC_RSTKBSP_MASK;    //中断源引脚寄存器清0
		KBI0_SC |= KBI_SC_KBIE_MASK;       //使能KBI0中断
	}
	else
	{
		KBI1_SC |= KBI_SC_KBSPEN_MASK;    //使能清除中断源引脚寄存器
		KBI1_SC |= KBI_SC_RSTKBSP_MASK;   //中断源引脚寄存器清0
		KBI1_SC |= KBI_SC_KBIE_MASK;      //使能KBI1中断
	}

	//(2)清空中断寄存器
	NVIC_ClearPendingIRQ(table_irq_kbi[kbiNo]);

	//(3)使能中断
	NVIC_EnableIRQ(table_irq_kbi[kbiNo]);
}

3,禁用KBI引脚中断

void kbi_disable_pin_irq(uint_16 kbiNo)
{
	//(1)声明局部变量
	uint_8 module;  //模块号
	uint_8 chn;  //通道号

	//(2)解析模块号和通道号
	kbi_mux_val(kbiNo,&module,&chn);

	//(3)根据不同模块号进行设置
	switch(module)
	{
	//(3.1)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
	case 0:
		KBI0_PE &= ~KBI_PE_KBIPE(1<<chn);
		break;
	//(3.2)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
	case 1:
		KBI1_PE &= ~KBI_PE_KBIPE(1<<chn);
		break;
	}
}

4,使能KBI引脚中断

void kbi_enable_pin_irq(uint_16 kbiNo)
{
	//(1)声明局部变量
	uint_8 module; //模块号
	uint_8 chn;  //通道号

	//(2)解析模块号和通道号
	kbi_mux_val(kbiNo,&module,&chn);

	//(3)根据不同模块号进行设置
	switch(module)
	{
	//(3.1)KBI0模块
	case 0:
		KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
		break;
    //(3.2)KBI1模块
	case 1:
		KBI1_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
		break;
	}
}

其中kbiNo定义KBIx_Py,选择对应的检测模式,通道号定义相应的引脚

你可能感兴趣的:(嵌入式)