MPC5744-SIUL2

一、基本功能

MPC5744单片机提供从从A到J10组,每组16个共154个(J组有10个)GPIO口。各GPIO由SIUL2中的各寄存器控制。SIUL2模块中每个GPIO都可独立配置其输入输出模式。其中的32个引脚可以作为外部中断/DMA中断输入。此32个外部中断被分为4组,每组8个。每组可以发出一个中断请求。

二、寄存器介绍

MPC5744内部的SIUL2模块寄存器的基地址为0xFFFC0000。

1.MCU ID寄存器SIUL2_MIDR1、SIUL2_MIDR2

在这里插入图片描述

  • PARTNUM:MCU型号
    与MIDR2.PARTNUM[23:16]组合为完整的型号。
  • ED
    读值为0。
  • PKG:封装类型
    01101:144-pin QFP
    10000:208-ball BGA
  • MAJOR_MASK:主要掩码修订
  • MINOR_MASK:次要掩码修订
    在这里插入图片描述
  • SF:制造商
    0:飞思卡尔半导体
  • FLASH_SIZE_1:闪存大小的粗粒度
    此字段的值需要与FLASH_SIZE_2字段的值组合,以计算实际内存大小。
    0110:1 MB
    0111:2 MB
  • FLASH_SIZE_2:闪存大小的精细粒度
    此字段的值需要与FLASH_SIZE_1字段的值组合,以计算实际内存大小。
    0000: 0 x (FLASH_SIZE_1 / 8)
    0010: 2 x (FLASH_SIZE_1 / 8)
    0100: 4 x (FLASH_SIZE_1 / 8)
  • PARTNUM:MCU型号中的ASCII字符
    与MIDR1[PARTNUM] 组合为完整的型号。
    0x50:P

2.DMA/中断状态寄存器SIUL2_DISR0

在这里插入图片描述

  • EIFn(n=0…31)外部中断状态位
    读0:未发生中断或DMA事件。
    读1:发生中断或DMA事件。
    置1:清零该位。

3.DMA/中断使能标志寄存器SIUL2_DIRER0

在这里插入图片描述

  • EIREn(n=0…31)外部中断使能位
    置1:使能该路中断。
    置0:禁止该路中断。

4.DMA/外部中断选择寄存器SIUL2_DIRSR0

在这里插入图片描述

  • DIRSRn(n=0…3)DMA/外部中断选择位
    置0:相应引脚发生边缘触发事件时触发外部中断。
    置1:相应引脚发生边缘触发事件时触发DMA请求。
  • DIRSRn(n=4…31)DMA/外部中断选择位
    置0:相应引脚发生边缘触发事件时触发外部中断。

5.上升沿中断使能寄存器SIUL2_IREER0

在这里插入图片描述

  • IREEn(n=0…31)上升沿触发使能位
    置1:使能上升沿触发中断。
    置0:禁止上升沿触发中断。

6.下降沿中断使能寄存器SIUL2_IFEER0

在这里插入图片描述

  • IFEEn(n=0…31)下升沿触发使能位
    置1:使能下升沿触发中断。
    置0:禁止下升沿触发中断。

7.中断滤波器使能寄存器SIUL2_IFER0

在这里插入图片描述

  • IFEn(n=0…31)输入滤波器使能位
    置1:使能输入滤波器。
    置0:禁止输入滤波器。

8.中断滤波器最大计数器寄存器SIUL2_IFMCRn(n=0…31)

在这里插入图片描述

9.中断滤波器时钟预分频寄存器SIUL2_IFCPR

在这里插入图片描述

10.控制寄存器SIUL2_MSCRn(n=0…154)

在这里插入图片描述

  • SRC[1:0]回转速率控制位
    00:带转速率控制的半驱动强度。
    01:带回转率控制的全驱动强度。
    10:无回转速率控制的半驱动强度。
    11:无回转率控制的全驱动强度。
  • OBE输出缓存使能位
    置1:输出使能。
    置0:输出禁止。
  • ODE 开漏输出使能位
    开漏输出必须使能OBE。
    置1:使能开漏输出。
    置0:禁止开漏输出。
  • SMC安全模式控制位
    置1:不禁用。
    置0:芯片进入安全模式时,芯片禁用引脚的输出功能。芯片离开安全模式时,输出功能返回到其先前的状态。
  • APC模拟控制位
    置1:当相关目标是支持模拟I/O的芯片引脚时,启用引脚的模拟输入路径开关。
    置0:关闭开关。
  • IBE输入缓冲使能位
    置1:使能输入。
    置0:使能输出。
  • HYS输入之后使能位
    置1:使能输出滞后。
    置0:禁止输入滞后。
  • PUS上下拉选择位
    置1:上拉。
    置0:下拉。
  • PUE上下拉使能位
    置1:根据PUS位的设置使能上下拉。
    置0:根据PUS位的设置使能上下拉。
  • INV翻转使能位
    置1:在将SSS选择的信号传输到相关目的地(芯片引脚或模块)之前,将其反转。
    置0:不翻转。
  • SSS引脚输出复用设置位。
    设置引脚输出的复用功能。

11.输入控制寄存器SIUL2_IMCRn(n=32…233)

在这里插入图片描述

  • INV翻转使能位
    置1:在将SSS选择的信号传输到相关目的地(芯片引脚或模块)之前,将其反转。
    置0:不翻转。
  • SSS引脚输入复用设置位。
    设置引脚输入的复用功能。

12.数据输出寄存器SIUL2_GPDOn(n=0…38)

在这里插入图片描述

  • PDO_4nj(n=0…38;j=0,1,2,3)数据输出位
    置1:输出高电平
    置0:输出低电平
    每个32位的寄存器中有4个有效位,39个寄存器对应156个GPIO。计算方式为寄存器序号nx4+j,j为在寄存器中位的序号。
    例如在SIUL2_GPDO5中第23位数据输出位对应的GPIO位4x5+2=22。
    GPIO31对应在SIUL2_GPDO7的第31位(4x7+3=30)

13.数据输入寄存器SIUL2_GPDIn(n=0…38)

在这里插入图片描述

  • PDI_4nj(n=0…38;j=0,1,2,3)数据输出位
    置1:输入高电平
    置0:输入低电平
    每个32位的寄存器中有4个有效位,39个寄存器对应156个GPIO。
    计算方式为寄存器序号4xn+j,j为在寄存器中位的序号。
    例如:
    在SIUL2_GPDO5(n=5)中第23位(j=2)数据输出位对应的GPIO位4x5+2=22。
    GPIO31对应在SIUL2_GPDO7(n=7)的第31位(j=3)(4x7+3=30)。

14.并行数据输出寄存器SIUL2_PGPDOn(n=0…9)

在这里插入图片描述

  • PPDO并行数据输出
    置1:输出高电平。
    置0:输出低电平。
    每个寄存器有16(j=0…15)位有效位,共10(n=0…9)个寄存器。
    GPIO序号计算方式为16xn+j。
    例如:
    在SIUL2_PGPDO3(n=3)中Bit7(j=7)对应的GPIO序号为16x3+7=55。
    GPIO44对应在SIUL2_PGPDO2(n=2)的Bit12(j=12)(16x2+12=44)。

15.并行数据输入寄存器SIUL2_PGPDIn(n=0…9)

在这里插入图片描述

  • PPDI并行数据输出
    置1:输入高电平。
    置0:输入低电平。
    每个寄存器有16(j=0…15)位有效位,共10(n=0…9)个寄存器。
    GPIO序号计算方式为16xn+j。
    例如:
    在SIUL2_PGPDO3(n=3)中Bit7(j=7)对应的GPIO序号为16x3+7=55。
    GPIO44对应在SIUL2_PGPDO2(n=2)的Bit12(j=12)(16x2+12=44)。

16.掩码并行数据输出寄存SIUL2_MPGPDOn(n=0…9)

在这里插入图片描述

  • MASK掩码位
    置1:MPPDO中对应的数据被输出。
    置0:MPPDO中的对应数据被忽略。
  • MPPDO数据位
    置1:输出高电平。
    置0:输出低电平。
    每个寄存器有Bitj(j=0…15)共16位掩码位,有Bit(j+16)(j=0…15)共16位数据位,共10个寄存器(n=0…9)。
    GPIO序号计算方式为16xn+j。
    例如:
    在SIUL2_MPGPDO7(n=7)中掩码位Bit0与数据位Bit16(j=0)对应的GPIO序号为16x7+0=112。
    GPIO5对应在SIUL2_MPGPDO0(n=0)的掩码位Bit5与数据位Bit21(j=5)(16x0+5=5)。
  • 该寄存器只支持32位写,不支持16位、8位读写

三、例程分析

例程使用PA5作为输入引脚,PA9到PA12作为输出,PA5触发外部上升沿中断,在中断中翻转PA9的输出,同时使用PA10到PA12跟踪PA5的状态。验证GPIO初始化设置、外部中断、使用各种方式读取设置引脚状态等技术。

int main(void)
{
	xcptn_xmpl ();

    MC_ME.RUN_PC[0].R=0x00000000;
    MC_ME.RUN_PC[1].R=0x000000FE;

    

    MC_CGM.SC_DC0.B.DIV=3;//系统时钟分频器分频系数为3,PBRIDGEn_CLK的频率为系统时钟频率的(3+1)=4分之一
    MC_CGM.SC_DC0.B.DE=1;//使能系统时钟分频器

    MC_CGM.AC3_SC.B.SELCTL=0;//选择IRCOSC作为 PLL0的输入
    MC_CGM.AC4_SC.B.SELCTL=1;//选择XOSC作为 PLL1的输入

    //PLL0输入为IRCOSC的16MHz时钟,将PHI配置为160MHz,PHI1配置为40MHz
    //fPLL0_PHI=fPLL0_ref*PLL0DV[MFD]/(PLL0DV[PREDIV]*PLL0DV[RFDPHI])=16MHz*20/(1*2)=160MHz
    //fPLL0_PHI1=fPLL0_ref*PLL0DV[MFD]/(PLL0DV[PREDIV]*PLL0DV[RFDPHI1])=16MHz*20/(1*8)=40MHz
    PLLDIG.PLL0DV.B.RFDPHI1=8;
    PLLDIG.PLL0DV.B.RFDPHI=2;
    PLLDIG.PLL0DV.B.PREDIV=1;
    PLLDIG.PLL0DV.B.MFD=20;

    //PLL1输入为XOSC的40MHz时钟,将PHI配置为160MHz
    //fPLL1_PHI=fPLL1_ref*(PLL1DV[MFD]+PLL1FD[FRCDIV]/2^12)/(2*PLL1DV[RFDPHI]))=40MHz*(16+0)/(2*2)=160MHz
    PLLDIG.PLL1DV.B.RFDPHI=2;
    PLLDIG.PLL1DV.B.MFD=16;

    MC_ME.DRUN_MC.R=0x001300F2;  //FLAON=11Flash正常工作模式,PLL1ON=1PLL1打开,PLL0ON=1PLL0打开,XOSCON=1XOSCON打开,IRCON=1IRCON打开,SYSCLK=primary PLL(PLL0_PHI)系统时钟选择PLL0_PHI
    MC_ME.MCTL.R=0x30005AF0;//调整至DRUN模式,输入两次KEY
    MC_ME.MCTL.R=0x3000A50F;
    while(MC_ME.GS.B.S_MTRANS==1);  //等待模式转换完成

	SIUL2.MSCR[9].B.SSS=0;//作为GPIO PA9
	SIUL2.MSCR[9].B.OBE=1;//输出使能
	SIUL2.MSCR[9].B.IBE=1;//输入禁止
	//SIUL2.MSCR[9].B.INV=1;//将输出翻转
	SIUL2.GPDO[9].B.PDO=1;//输出高电平

	SIUL2.MSCR[10].B.SSS=0;//作为GPIO PA10
	SIUL2.MSCR[10].B.OBE=1;//输出使能
	SIUL2.MSCR[10].B.IBE=0;//输入禁止
	//SIUL2.MSCR[10].B.INV=1;//将输出翻转
	SIUL2.GPDO[10].B.PDO=1;//输出高电平

	SIUL2.MSCR[11].B.SSS=0;//作为GPIO PA11
	SIUL2.MSCR[11].B.OBE=1;//输出使能
	SIUL2.MSCR[11].B.IBE=0;//输入禁止
	SIUL2.MSCR[11].B.INV=1;//将输出翻转
	SIUL2.GPDO[11].B.PDO=1;//输出高电平

	SIUL2.MSCR[12].B.SSS=0;//作为GPIO PA12
	SIUL2.MSCR[12].B.OBE=1;//输出使能
	SIUL2.MSCR[12].B.IBE=0;//输入禁止
	//SIUL2.MSCR[12].B.INV=1;//将输出翻转
	SIUL2.GPDO[12].B.PDO=1;//输出高电平

	INTC_0.PSR[243].B.PRC_SELN0=1;//允许中断
	INTC_0.PSR[243].B.PRIN=10;//优先级为10

	SIUL2.DIRER0.B.EIRE5=0;//中断禁止

	SIUL2.MSCR[5].B.OBE=0;//禁止输出
	SIUL2.MSCR[5].B.ODE=0;//禁止开漏
	SIUL2.MSCR[5].B.IBE = 1;//输入使能

	SIUL2.IMCR[178].B.SSS=1;//选择外部中断输入

	SIUL2.DIRSR0.B.DIRSR5=0;选择触发外部中断
	SIUL2.IFEER0.B.IFEE5=0;//下降沿触发禁止
	SIUL2.IREER0.B.IREE5=1;//上升沿触发使能

	SIUL2.DIRER0.B.EIRE5=1;//中断使能

	for(;;) {
	   	SIUL2.GPDO[12].B.PDO=SIUL2.GPDI[5].B.PDI;//读取PA5的输入输出到PA12
		if(SIUL2.PGPDI[0].R & (1<<10))
		{
			SIUL2.PGPDO[0].B.PPDO |=1<<5;//读取PA5的输入输出到PA10
			SIUL2.MPGPDO[0].R=0x00100010;//读取PA5的输入输出到PA11
		}
		else
		{
			SIUL2.PGPDO[0].B.PPDO &=~(1<<5);
			SIUL2.MPGPDO[0].R=0x00100000;
		}
	}
}

void Ext0_isr(void)
{
	SIUL2.DISR0.B.EIF5=1;
	SIUL2.GPDO[9].B.PDO=~SIUL2.GPDI[9].B.PDI;//翻转PA9的输出
}
  • 第3行:新建工程时自动生成代码。
  • 第5~32行:单片机初始化的一些操作。
  • 第34行:将PA9引脚作为GPIO功能。可在下表中查到PA9所对应的MSCR为9。
    在这里插入图片描述
  • 第35行:输出使能,将该引脚作为输出使用,用来驱动LED灯。
  • 第36行:允许输入(PA10、PA11、PA12禁止输入)。
  • 第37行:使用极性翻转位使输出电平翻转,及程序中输出设置为1时引脚输出低电平,设置为0时输出高电平(PA9、PA10、PA12该功能已被注释,PA11启用该功能)。
  • 第38行:输出电平设为高电平(PA11由于开启极性翻转,实际输出位低电平)。
  • 第40~56行:同样的方法设置PA10、PA11、PA12。
  • 第58~59行:由于需要使用PA5作为输入,触发外部中断,根据下表查得,PA5外部中断号为5,同时需要将IMCR[178].SSS位设置为0001。
    在这里插入图片描述
    根据下表查得,REQ5所对应的外部中断向量为0。
    在这里插入图片描述
    通过查询中断向量表得外部中断0所对应的向量位243。所以设置INTC_0.PSR[243]寄存器的PRIN位来设置中断优先级为10,设置PRC_SELN0允许该中断请求发送至处理器。
    在这里插入图片描述
  • 第61行:设置中断时需要先将其禁止。
  • 第63~65行:禁止PA5输出,允许输入。
  • 第67行:将PA5的输入连接至外部中断输入。
  • 第69行:外部边沿事件触发外部中断,不触发DMA事件。
  • 第70~71行:使能上升沿触发,禁止下降沿触发。
  • 第73行:使能中断。
  • 第76行:使用PDO、PDI寄存器来获取设置引脚电平。
  • 第77~86行:使用PGPDI、PGPDO、MPGPDO寄存器来获取设置引脚电平。
  • 第90~94行:外部中断服务函数。
  • 第92行:清除中断标志。
  • 第93行:将PA9的输出翻转。翻转输出可以通过读取输出寄存器后取反输出来实现。但是PA9初始化时使能了输入功能,所以可以直接读取输入寄存器取反后输出来实现翻转功能。
    同时需要将中断服务函数注册到中断向量表。在intc_SW_mode_isr_vectors_MPC5744P.c文件中声明中断服务函数,并使用声明的函数代替dummy。
    在这里插入图片描述
    在这里插入图片描述

四、遗留问题

1.关于中断滤波器
中断滤波器在实验中未使用,需要更进一步了解,目前可以禁用滤波器,不影响正常中断功能。
2.关于DMA功能
DMA触发功能测试未涉及。
3.关于SIUL2_IMCRn.INV
该位的翻转功能经过测试,对于处于GPIO模式下的引脚,并不能翻转其输入值,但对于其它模块的影响没有测试。

五、相关索引

  • 1.SIUL2模块:MPC5744P-Reference Manual.pdf第445页。
  • 2.引脚复用功能列表:MPC5744P-Reference Manual.pdf第107页Table 4-7。
  • 3.中断向量列表:MPC5744P-Reference Manual.pdf第193页Table 7-16。
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值