各位大哥大神,我刚接触stm32,最近有个项目程序在我手上,准备改动,现在我连IO口读取都没法理解
主程序main()中输入程序是这样的
//输入刷新,这里输入有很多个,其他我就省略,只列出一两个
void IN_refurbish(void)
{if(T1>Refurbish_time)
{IDATA1= USER_I_DataRead(); TM1=0;TM2=1;
AIW0=USER_ADCRead(0)>>2; //AIW0 传感器1
AIW1=USER_ADCRead(1)>>2; //AIW1 传感器2
}
if(T2>Refurbish_time)
{ IDATA2= USER_I_DataRead(); TM2=0;TM1=1;
}
IDATA=(IDATA1 & IDATA2 )& (IDATA1 |IDATA2);/*MI00上开关 MI01下开关
if(IDATA&0x0001) MI00= 1 ;else MI00= 0;
if(IDATA&0x0002) MI01= 1 ;else MI01= 0;
}
USER_I_DataRead程序是这样的:
uint16_t USER_I_DataRead(void)
{uint8_t i;uint16_t j=0;for(i=0;i<In;i++)//这里In为定义输入的数量
{ j=j>>1;
if(USER_I_Read((I_TypeDef)i)) j=j|0X0800;
}return j;
}
USER_I_Read程序是这样的:
uint8_t USER_I_Read(I_TypeDef I)
{if(GPIO_ReadInputDataBit(I_PORT[I], I_PIN[I])==0) //读取指定端口的位
return 1;
else return 0;
}
问题有:
1、这里调用了库函数GPIO_ReadInputDataBit去读取输入,但是库函数中返回的值是bitstatus,是个状态还是输入的值啊?
2、而且USER_I_Read 返回的是1或者0,所以USER_I_DataRead中返回的J的结果怎么会是IO口的输入状态呢?
3、从1和2两个疑问,我不明白IDATA调用USER_I_DataRead去获取IO口的值怎么能得到啊?
4、就算读取到IO口的值,为什么要 j=j|0X0800?
(因为这程序我已经在设备上调试过没问题,就是不明白这里怎么获取输入的值)
我看了好久都没理解,脑子快炸了,求大神帮帮解答,谢谢! |