我有以下定义:
#define DEVICE_ID ((uint8_t)0x3f)
而且我有以下功能:
void LIS3DSH_Init(LIS3DSH_InitTypeDef* LIS3DSH_InitStruct)
{
// uint8_t ctrl=0x00;
uint8_t ident=0x00;
LIS3DSH_LowLevel_Init();
LIS3DSH_Read(&ident,
LIS3DSH_WHOAMI_REG_ADDR,
1);
if(DEVICE_ID==ident)
{
// LIS3DSH detected
}
else
{
// LIS3DSH not detected
failureHandler();
}
} // LIS3DSH_Init
现在,如果我逐步使用此函数,则在LIS3DSH_Read函数调用之后,ident变量将获得值0x3f,这没关系。我的问题是,为什么 hell if子句跳到failureHandler? DEVICE_ID和ident的值是相同的-如果不应该跳转到failureHanlder(),则均为0x3f。我正在使用IAR C / C++和STM32F4 Discovery Board开发LIS3DSH加速器库。这是情况的屏幕截图:
最佳答案
您应该将if(DEVICE_ID==ident)
类型转换为if( (uint8_t)DEVICE_ID == (uint8_t)ident)
过去,这一直是我的问题。
是的,将ident声明为volatile,并且出于调试目的,请尝试通过其中包含__no_operation();
的for循环在比较之前添加延迟。请注意,在其前面有2个下划线,而不是1(本机NOP指令),并且在一个168MHz板上,通过示波器测量,单个NOP大约需要29ns。
另外,由于您具有IAR,因此不妨弹出“汇编” View ,然后查看实际上正在比较哪些寄存器和/或常量。同时打开“寄存器” View ...,这样您就可以自己查看寄存器值。