zhouqiming 发表于 2025-2-28 10:52:23

关于I2C与GPIO配置冲突的问题

下面这段代码,我只要注释掉I2C_Config(),LED灯就可以正常闪烁,一旦去掉注释,LED灯就是常亮,为啥啊?

#include "Config.h"
#include "Type_def.h"
#include "STC8G_H_GPIO.h"
#include "STC8G_H_delay.h"
#include "STC8G_H_I2C.h"
#include "STC8G_H_Switch.h"

void GPIO_Config()
{
P1_MODE_OUT_PP(GPIO_Pin_0);
P3_MODE_IO_PU(GPIO_Pin_2);
P3_MODE_IO_PU(GPIO_Pin_3);
}

void I2C_Config()
{
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Speed = 58;
I2C_InitStructure.I2C_Enable = ENABLE;
I2C_InitStructure.I2C_Mode = I2C_Mode_Slave;
I2C_InitStructure.I2C_MS_WDTA = ENABLE;
I2C_InitStructure.I2C_SL_ADR = 0x78;
I2C_InitStructure.I2C_SL_MA = ENABLE;

I2C_Init(&I2C_InitStructure);

I2C_SW(I2C_P33_P32);

}
void main()
{
GPIO_Config();
// I2C_Config();
while(1)
{
P10 = 0;
delay_ms(1000);
P10 = 1;
delay_ms(1000);

}

}

我问了AI,AI帮我改了一下代码,这样貌似可以工作了,这又是为啥?
void main()
{
    // 配置GPIO
    GPIO_Config();
   
    // 确认GPIO配置是否生效,没有下面这4行代码,LED不会闪烁,或者不亮(只有前2行)或者常亮(只有后2行)。
    P10 = 0;
    delay_ms(1000);
    P10 = 1;
    delay_ms(1000);

    // 配置I2C
    I2C_Config();

    while(1)
    {
      P10 = 0;
      delay_ms(1000);
      P10 = 1;
      delay_ms(1000);
    }
}

zhouqiming 发表于 2025-2-28 11:41:48

还有一个问题,这个LED闪烁的频率好像跟我程序里的对不上。

如果我注释掉I2C_Config(),则上述问题就都不存在了。

zhouqiming 发表于 2025-2-28 13:16:20

我找到原因了
delay_ms的函数声明是voiddelay_ms(unsigned char ms),最大不超过255,我用了1000,所以就出错了。

改成voiddelay_ms(unsigned int ms) 就好了

Lkck8210 发表于 2025-2-28 13:29:31

zhouqiming 发表于 2025-2-28 13:16
我找到原因了
delay_ms的函数声明是voiddelay_ms(unsigned char ms),最大不超过255,我用了1000,所以就 ...

不对啊,AI也没动delay函数啊

zhouqiming 发表于 2025-2-28 14:20:15

Lkck8210 发表于 2025-2-28 13:29
不对啊,AI也没动delay函数啊

我用的不是AI,是STC8H,我也是从官方下载的库函数,确实是unsigned char的

Lkck8210 发表于 2025-2-28 14:54:14

zhouqiming 发表于 2025-2-28 14:20
我用的不是AI,是STC8H,我也是从官方下载的库函数,确实是unsigned char的


496649247 发表于 2025-2-28 16:38:13

{:4_167:}
页: [1]
查看完整版本: 关于I2C与GPIO配置冲突的问题