目录
- 一、基本功能
- 二、寄存器介绍
- 1.MCU ID寄存器SIUL2_MIDR1、SIUL2_MIDR2
- 2.DMA/中断状态寄存器SIUL2_DISR0
- 3.DMA/中断使能标志寄存器SIUL2_DIRER0
- 4.DMA/外部中断选择寄存器SIUL2_DIRSR0
- 5.上升沿中断使能寄存器SIUL2_IREER0
- 6.下降沿中断使能寄存器SIUL2_IFEER0
- 7.中断滤波器使能寄存器SIUL2_IFER0
- 8.中断滤波器最大计数器寄存器SIUL2_IFMCRn(n=0...31)
- 9.中断滤波器时钟预分频寄存器SIUL2_IFCPR
- 10.控制寄存器SIUL2_MSCRn(n=0...154)
- 11.输入控制寄存器SIUL2_IMCRn(n=32...233)
- 12.数据输出寄存器SIUL2_GPDOn(n=0...38)
- 13.数据输入寄存器SIUL2_GPDIn(n=0...38)
- 14.并行数据输出寄存器SIUL2_PGPDOn(n=0...9)
- 15.并行数据输入寄存器SIUL2_PGPDIn(n=0...9)
- 16.掩码并行数据输出寄存SIUL2_MPGPDOn(n=0...9)
- 三、例程分析
- 四、遗留问题
- 五、相关索引
一、基本功能
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。