LM3S615的返回值读取
while(1)
{
Dval0=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_0);
Dval1=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_1);
Dval3=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_3);
Dval4=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_4);
Dval5=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_5);
Dval6=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_6);
Dval7=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_7);
//Dval11=*(volatile unsigned long*)(GPIO_PORTD_BASE);
if(!GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_0))
{ PWMGenDisable(PWM_BASE,PWM_GEN_1);
PWMPulseWidthSet(PWM_BASE,PWM_OUT_2,50);
PWMPulseWidthSet(PWM_BASE,PWM_OUT_3,600);
}
else if(!GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_1))
{
PWMGenDisable(PWM_BASE,PWM_GEN_1);
PWMPulseWidthSet(PWM_BASE,PWM_OUT_2,100);
PWMPulseWidthSet(PWM_BASE,PWM_OUT_3,500);
}
long?GPIOPinRead(unsigned?long?ulPort,?unsigned?char?ucPins)??
读取所选GPIO端口指定管脚的值,返回1个位组合的字节。该字节提供了由ucPins指定管脚的状态,对应的位值表示GPIO?管脚的高低状态。ucPins未指定的管脚位值是0。返回值已强制转换为long型,因此位31:8应该忽略。?这个函数应该在相应管脚已经设置为输出状态的情况下,由于GPIO得管脚结构我们知道在输出模式下,不管是开漏还是推挽用此函数读回来的值都是管脚的输出锁存值
GPIOPinRead(),其功能为读取某端口某管脚的状态,该函数也在gpio.c中,其定义为:
Long GPIOPinRead(unsigned long ulPort, unsigned char ucPins)
{
ASSERT(GPIOBaseValid(ulPort));
return(HWREG(ulPort + (GPIO_O_DATA + (ucPins << 2)))); // Return the pin value(s).
}
其中HWREG(ulPort + (GPIO_O_DATA + (ucPins << 2)))这句很重要,体现了一种利用地址线屏蔽而实现可对任意位操作的机制,将地址总线的位[9:2]用作屏蔽位,在读操作过程中,如果与数据位相关联的地址位被设为1,那么读取该值,如果与数据位相关联的地址位被设为0,那么不管它的实际值是什么,都将该值读作0。
读取端口的输出锁存值,需要直接读取对应端口的 GPIOx_ODR,其中 x 为实际端口的对应编号A、B、C
等;
具体在程序中就是
GPIOx.ODR;
GPIOx 是各芯片提供的头文件中预先定义的 GPIO_TypeDef 类型的结构体;内容对应每个端口的寄存器组;
返回的管脚就是管脚上面的电平状态,其实就是管脚值。