- //固件库
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, BitStatus, BitAction;
//为了封装我重新定义的
/*typedef basic data-type*/
typedef GPIO_TypeDef GPIO_PORT;
typedef GPIO_Pin_TypeDef GPIO_PIN;
typedef BitStatus BitVar;
//如果我没理解错typedef的话,从此,BitVar和BitStatus应该是一模一样的。
复制代码以下是我的一段测试代码、
- int main(void)
{
BitVar Result;
SetGpioMode(GREEN_LED,OUT_PP);
SetGpioMode(KEY,IN_PU);
while(1)
{
// things very strange,i couldn't use SET as a logical-result as i want.
// but RESET ! or just ' ' works well.
//but also with the function re-package by myself.
//(so they are right,but because of the same reason as above...)
// set could be only 1.
// but why (BitStatus couldn't force to change it?)
Result = Gpio_ReadPin(KEY);
if(Result)
WriteGpioPin(GREEN_LED,SET);
else
WriteGpioPin(GREEN_LED,RESET);
}
//------------------------
BitVar Gpio_ReadPin(U8 pin)
{
U8 RealPort;
U8 RealPin;
RealPort = GetPort(pin);
RealPin = GetPin(pin);
switch(RealPort)
{
case PA:
return ((BitVar)( GPIOA->IDR & (GPIO_PIN)(1<<RealPin) ));
break;
case PB:
return ((BitVar)(GPIOB->IDR & (GPIO_PIN)(1<<RealPin)));
break;
case PC:
return ((BitVar)(GPIOC->IDR & (GPIO_PIN)(1<<RealPin)));
break;
case PD:
return ((BitVar)(GPIOD->IDR & (GPIO_PIN)(1<<RealPin)));
break;
case PE:
return ((BitVar)(GPIOE->IDR & (GPIO_PIN)(1<<RealPin)));
break;
case PF:
return ((BitVar)(GPIOF->IDR & (GPIO_PIN)(1<<RealPin)));
break;
default:
return SET;
break;
}
}
//-------------------------
}
复制代码这段代码不完全是使用的原始的固件库。不过我已经测试过了。效果和使用原始固件库是一样的。
只是有一个奇怪的问题(这个问题换成 就是直接调用原始固件库还是一样的现象。很奇怪)
当我写成
- if(Result == SET)
WriteGpioPin(GREEN_LED,SET);
else
WriteGpioPin(GREEN_LED,RESET);
复制代码这段代码却没有起到应该起的作用。
但是。如果我把SET 换成RESET 或者 逻辑反 !或者啥都没有(就是判断为零还是非零)。它就完全正常。
我心想。
这个 typedef enum{}BitStatus 应该是定义一个 枚举型数据类型吧。
既然如此。为什么强制转换对它不起作用呢?
我试过如下测试
Status = SET;
if(Status == (BitVar)4)
这个条件是假。
这个非常奇怪。
此帖出自
小平头技术问答
PS:固件库里也是这么干的,类似的。
一周热门 更多>