仅运行一次KeilC

问题描述

我正在使用STM32F051接口通过I2C协议与APDS Sensor一起为我的项目编写代码。但是我的代码仅在我连接ST-Link并加载代码后才运行。然后关闭电源,再打开,然后我的代码无法运行。我发现问题是发送i2c配置功能。但是我不明白为什么我在加载代码时会运行。请帮助我解决该问题。谢谢! 功能发送I2C:

void writeDataTo(uint8_t Address,uint8_t reg,uint8_t data)
{

        I2C_SlaveAddressConfig(I2C1,Address); 
        I2C_MasterRequestConfig(I2C1,I2C_Direction_Transmitter);
        I2C_AckNowledgeConfig(I2C1,ENABLE);
        //------------------------------------------------
        I2C_GenerateSTART(I2C1,ENABLE);
    
        I2C_NumberOfBytesConfig(I2C1,2);
        
        I2C_SendData(I2C1,reg);
        while(I2C_GetFlagStatus(I2C1,I2C_ISR_TXE) == Bit_RESET)
      {
      }
        I2C_SendData(I2C1,data);
        while(I2C_GetFlagStatus(I2C1,I2C_ISR_TXE) == Bit_RESET)
      {
      }
        I2C_GenerateSTOP(I2C1,ENABLE);

}

传感器配置功能

*void APDS_9500_Configuration(void)
{

        writeDataTo(APDS9500_ADDRESS,APDS9500_R_RegBankSet,0x00);         // select bank 0
      // Define cursor limits
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_CursorClampLeft,0x07);    // min horiz value
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_CursorClampRight,0x17);    // max horiz value
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_CursorClampup,0x06);       // min vert value
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_Int2_En,0x01);             // enable interrupt on proximity
      // Auto exposure/Auto gain Controls
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_AELedOff_UB,0x2D);        // exposure time upper bound
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_AELedOff_LB,0x0F);        // exposure time lower bound
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_AE_Exposure_UB_L,0x3C);   // low byte auto exposure upper bound
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_AE_Exposure_UB_H,0x00);   // high byte auto exposure upper bound
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_AE_Exposure_LB_L,0x1E);   // low byte auto exposure lower bound
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_AE_Gain_LB,0x20);         // auto gain upper bound
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_Manual,0x10);             // enable auto exposure
      writeDataTo(APDS9500_ADDRESS,0x5E,0x10);                          // don't kNow
      writeDataTo(APDS9500_ADDRESS,0x60,0x27);                          // don't kNow
      // Set up Interrupt
      writeDataTo(APDS9500_ADDRESS,APDS9500_InputMode_GPIO_0_1,0x42);   // set GPIO0 as OUTPUT,GPIO1 as INPUT
      writeDataTo(APDS9500_ADDRESS,APDS9500_InputMode_GPIO_2_3,0x44);   // set GPIO2 as INPUT,GPIO3 as INPUT
      writeDataTo(APDS9500_ADDRESS,APDS9500_InputMode_INT,0x04);        // set INT as INPUT
      // Detection thresholds
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_Cursor_objectsizeTh,0x01); // object size threshold for cursor mode
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_NoMotionCountThd,0x06);    // no motion counter threshold
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_ZDirectionThd,0x0A);       // gesture detection z threshold
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_ZDirectionXYThd,0x0C);     // gesture detection x and y thresholds
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_ZDirectionAngleThd,0x05);  // angle threshold for forward and backward detection
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_RotateXYThd,0x14);         // rotation detection threshold
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_Filter,0x3F);              // filter weight and frame position threshold
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_FilterImage,0x19);         // use pixel brightness for weak average filter
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_YtoZSum,0x19);             // z-direction mapping parameter
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_YtoZFactor,0x0B);          // z-direction mapping parameter
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_FilterLength,0x03);        // filter length for cursor object center
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_WaveThd,0x64);             // wave gesture counter and angle thresholds
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_AbortCountThd,0x21);       // abort gesture counter threshold
            
        //writeDataTo(APDS9500_ADDRESS,APDS9500_R_Prox_UB,0x00);                          // Proximity up bound
            
            
      // Change to Bank 1
      writeDataTo(APDS9500_ADDRESS,0x01);          // select bank 1
    
      // Image size settings  
      writeDataTo(APDS9500_ADDRESS,APDS9500_Cmd_HStart,0x0F);            // horizontal starting point
      writeDataTo(APDS9500_ADDRESS,APDS9500_Cmd_vstart,0x10);            // vertical starting point
      writeDataTo(APDS9500_ADDRESS,APDS9500_Cmd_HV,0x02);                // vertical flip
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_LensShadingComp_EnH,0x01); // enable lens shading compensation
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_Offest_Y,0x39);            // vertical offset of lens,set to 55
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_LSC,0x7F);                 // Lens shading coefficient,set to 127
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_LSFT,0x08);                // shift amount,initialize to 10
      writeDataTo(APDS9500_ADDRESS,0x3E,0xFF);                            // don't kNow
      writeDataTo(APDS9500_ADDRESS,0x3D);                            // don't kNow
      /* Sleep mode parameters */
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_IDLE_TIME_L,0x96);         // idle time low byte = 150 which is set for ~120 fpsenter code here
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_IDLE_TIME_SLEEP_1_L,0x97); // idle time for weak sleep,set for report rate ~ 120 Hz
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_IDLE_TIME_SLEEP_2_L,0xCD); // idle time for deep sleep,low byte
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_IDLE_TIME_SLEEP_2_H,0x01); // idle time for deep sleep,high byte
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_Object_TIME_2_L,0x2C);     // deep sleep enter time,APDS9500_R_Object_TIME_2_H,0x01);     // deep sleep enter time,APDS9500_R_TG_EnH,0x01);              // enable time gating
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_Auto_SLEEP_Mode,0x35);     // no object weak and deep sleep,object wake
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_Wake_Up_Sig_Sel,0x00);     // interrupt on time gate start
      /* Start sensor */
      writeDataTo(APDS9500_ADDRESS,APDS9500_R_SRAM_Read_EnH,0x01);       //SRAM read enable
    
      // Change back to bank 0 for data read
      writeDataTo(APDS9500_ADDRESS,0x00);         // select bank 0

}*

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)