今天要探究的是下面的函数
void PORT_PinOpenDrainConfig(uint32_t instance, uint8_t pin, bool status)
{
SIM->SCGC5 |= SIM_GPIOClockGateTable[instance];
(status) ? (PORT_InstanceTable[instance]->PCR[pin] |= PORT_PCR_ODE_MASK):(PORT_InstanceTable[instance]->PCR[pin] &= ~PORT_PCR_ODE_MASK);
}
第一句代码昨天我已经研究过了,这里又出现了一次,可见写这个函数的人,为了保证每一个函数的功能完成性,在整体上其实是增大了代码的重复率,换句话说,是降低了效率的。也算是一个弊端了。
那么我们着重讲后面一句,后面一句是个三目运算符。这句代码等价于下面的代码
if(status==1){
PORT_InstanceTable[instance]->PCR[pin] |= PORT_PCR_ODE_MASK;
}
else{
PORT_InstanceTable[instance]->PCR[pin] &= ~PORT_PCR_ODE_MASK;
}
关于左边的地址,昨天也说过了0x4004D000+0x4*6。右边的定义如下:
#define PORT_PCR_ODE_MASK 0x20u
那么我们看一下技术手册的图,其实还是昨天的那一张图,
那句代码表示将第5位(从0开始的)的值修改。还是那句话具体的实际含义就想不说了,等我把整段代码都分析完了再统一说。