MPC5744的SIUL2可用于GPIO、多路复用和中断/DMA请求,这里只涉及GPIO和多路复用功能。
1.GPIO功能
SIUL2能够控制芯片引脚的电特性,包括:1)自旋率、2)驱动能力、3)上拉\下拉控制、4)输入输出控制、5)滞后、6)反转、7)开漏等,主要涉及的寄存器为MSCR,如下图所示,MSCR主要控制芯片引脚电特性和输入/输出缓存器的使能。
MSCR寄存器的各位如下所示,可通过字或位的形式进行访问。
MSCR中各位的含义如下:
SRC:包含电压转换速率控制和驱动能力控制,其值含义如下:
0b00 带电压装换速率半驱动能力 0b01带电压转换速率全驱动能力
0b10 不带电压转换驱动能力半驱动能力 0b11 不带电压转换速率全驱动能力
OBE:输出缓冲区使能,1使能,0关闭
ODE:开漏功能使能,1使能,0关闭
SMC:安全模式控制,设置该引脚输出缓存器在安全模式下是否失能,1在安全模式下失能
APC:模拟信号引脚控制,设为1表示该引脚用作模拟信号引脚
IBE:输出缓冲区使能,1使能,0关闭
HYS:输入延迟使能,1使能,0关闭
PUS:上拉选择,1上拉,0下拉
PUE:上拉功能使能,1使能,0关闭
INV:反转功能使能,1,使能,0关闭
SSS:源信号选择,用于多路复用功能,GPIO功能设为0
SIUL2.GPDOn:数据输出寄存器,以字节形式访问,最低位有效
1:设置该引脚为高电平 0:设置该引脚为高电平
SIUL2.GPDIn:数据输出寄存器,以字节形式访问,最低位有效
1:访问时该引脚上为高电平 0:访问时该引脚为低电平
上述寄存器与引脚直接的对应关系见《MPC5744P Data Sheet》 2.2.5 Generic pins/balls,部分对应关系如下:
1.初始化
GPIO的初始化需根据输入和输出进行不同的配置,设置引脚为输出时应选择GPIO功能,使能输出缓冲寄存器,关闭输入缓冲寄存器;设置引脚为输入时应该使能输入缓冲寄存器,关闭输出缓冲寄存器,初始化代码如下:
//GPIO端口定义
#define GPIO_PORTA 0
#define GPIO_PORTB 1
#define GPIO_PORTC 2
#define GPIO_PORTD 3
#define GPIO_PORTE 4
#define GPIO_PORTF 5
#define GPIO_PORTG 6
#define GPIO_PORTH 7
#define GPIO_PORTI 8
#define GPIO_PORTJ 9
//定义引脚号
#define GPIO_PIN0 0
#define GPIO_PIN1 1
#define GPIO_PIN2 2
#define GPIO_PIN3 3
#define GPIO_PIN4 4
#define GPIO_PIN5 5
#define GPIO_PIN6 6
#define GPIO_PIN7 7
#define GPIO_PIN8 8
#define GPIO_PIN9 9
#define GPIO_PIN10 10
#define GPIO_PIN11 11
#define GPIO_PIN12 12
#define GPIO_PIN13 13
#define GPIO_PIN14 14
#define GPIO_PIN15 15
//定义端口最大引脚数
#define GPIO_PIN_MAX 16
//GPIO输出输出定义
#define GPIO_IN 0
#define GPIO_OUT 1
***************************************************
* 函数名称 GPIO_Init
* 函数功能 GPIO引脚初始化
* 输入参数
* GPIO_PORTx
* 端口号,x可为A~J 如
* GPIO_PORTA 选择端口A
* GPIO_PINn
* 端口PORTx中选择的引脚号,n可为0:15 如
* GPIO_PIN0 选择PORTx的引脚0
* GPIO_Dir
* 输入输出选择,可有以下值
* GPIO_OUT 配置引脚为输出
* GPIO_IN 配置引脚为输入
* 返回值 无
* 示例 GPIO_Init(GPIO_PORTA,GPIO_PIN0,GPIO_DIR_OUT);//配置PORTA的引脚0为输出
***************************************************
*/
void GPIO_Init(uint8_t GPIO_PORTx,uint8_t GPIO_PINn,uint8_t GPIO_Dir)
{
if(GPIO_Dir==GPIO_OUT) //判断输入输出
{
SIUL2.MSCR[GPIO_PORTx*GPIO_PIN_MAX+GPIO_PINn].B.SSS=0; //选择GPIO功能
SIUL2.MSCR[GPIO_PORTx*GPIO_PIN_MAX+GPIO_PINn].B.OBE=1; //打开输出功能
SIUL2.MSCR[GPIO_PORTx*GPIO_PIN_MAX+GPIO_PINn].B.IBE=0; //关闭输入功能
SIUL2.GPDO[GPIO_PORTx*GPIO_PIN_MAX+GPIO_PINn].B.PDO=1; //配置输出高电平
}
else
{
SIUL2.MSCR[GPIO_PORTx*GPIO_PIN_MAX+GPIO_PINn].B.SSS=0; //选择GPIO功能
SIUL2.MSCR[GPIO_PORTx*GPIO_PIN_MAX+GPIO_PINn].B.OBE=0; //关闭输出功能
SIUL2.MSCR[GPIO_PORTx*GPIO_PIN_MAX+GPIO_PINn].B.IBE=1; //打开输入功能
}
}
2.设置输出或获取输入
在初始化完成后,设置输出或获取输入只需要向引脚对应的输出或输入寄存器设置对应的值即可。如
uint8_t get_bit=0;
GPIO_Init(GPIO_PORTA,GPIO_PIN0,GPIO_OUT);//初始化化PA0为输出
GPIO_Init(GPIO_PORTA,GPIO_PIN1,GPIO_IN);//初始化PA1位输入
SIUL2.GPDO[0].B.PDO=1; //设置PA0为高电平
get_bit=SIUL2.GPDI[1].B.PDI; //获取PA1的值
2.引脚复用功能
SIUL2的引脚复用功能通过设置对应引脚的MSCR和IMCR的寄存器来实现,具体引脚对应的MSCR和IMCR参见《MPC5744P Data Sheet》 2.2.5 Generic pins/balls。如若设置B6引脚复用为CLK_OUT引脚则配置如下:
//引脚多路复用,配置PORTB_PIN6为CLK_OUT功能
SIUL2.MSCR[22].B.SSS=1;
SIUL2.MSCR[22].B.OBE=1;
.
.
.
一般在模块初始化函数中,一般先配置所用外部引脚的多路复用功能,然后进行具体的模块配置