[蓝桥杯嵌入式] 官方的I2C驱动bug

先说起因,我们看官方驱动里涉及到GPIO初始化的代码:

void SDA_Input_Mode()
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    GPIO_InitStructure.Pin = GPIO_PIN_7;
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_Output_Mode()
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    GPIO_InitStructure.Pin = GPIO_PIN_7;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void I2CInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_6;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}

很明显,这里官方忘记给GPIOB时钟使能了,导致初始化并没有成功。

但是,这个bug却很少被发现,原因是我们使用蓝桥杯嵌入式板卡的时候基本都会用到lcd,而lcd的初始化里会有对GPIOB时钟的使能。
如果是I2CInitLCD_Init之后调用,整个系统将不会出现问题;
而如果先调用了I2CInit,并且后来没有对GPIOB时钟进行使能的话,整个I2C的操作就跑不起来了。

posted @ 2024-01-24 17:26  Foriver  阅读(34)  评论(0编辑  收藏  举报