我有以下定义:

#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 ...,这样您就可以自己查看寄存器值。

10-08 06:53