I2C, DCMI перестает работать после выхода из режима STOP в stm32f4 - PullRequest
0 голосов
/ 31 мая 2019

I2C и DCMI перестают работать на моей пользовательской плате после выхода из режима STOP. Я деинициализирую GPIO перед переходом в режим STOP. После пробуждения от STOP для I2C я всегда получаю HAL_BUSY как для чтения, так и для записи, а для камеры на DCMI я получаю некоторые случайные данные вместо изображения JPEG. Но если я не деинициализирую GPIO, то все работает без проблем, но в режиме STOP энергопотребление выше. Ниже приведен мой код для деинициализации GPIO

void MX_GPIO_Deinit()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();

    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Pin = GPIO_PIN_All;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

    /* Disable GPIOs clock */
    __HAL_RCC_GPIOA_CLK_DISABLE();
    __HAL_RCC_GPIOB_CLK_DISABLE();
    __HAL_RCC_GPIOC_CLK_DISABLE();
    __HAL_RCC_GPIOH_CLK_DISABLE();
}

Можно ли правильно сбросить I2C и DCMI после выхода из режима STOP? Вызов функций MX_I2C2_Init() и MX_DCMI_Init() не работает. Как правильно обработать это и заставить I2C и DCMI работать?

1 Ответ

0 голосов
/ 31 мая 2019

Периферийные устройства могут быть сброшены с помощью RCC (Сброс и управление часами).

Найдите биты, соответствующие периферийным устройствам, подлежащим сбросу, в регистрах RCC...RSTR, установите их в 1 и очистите их в 0. Например. для DCMI это будет

RCC->AHB2RSTR |= RCC_AHB2RSTR_DCMIRST;
RCC->AHB2RSTR &= ~RCC_AHB2RSTR_DCMIRST;

HAL предоставляет некоторые макросы, которые избавляют вас от необходимости искать имена регистров, например

__HAL_RCC_DCMI_FORCE_RESET();
__HAL_RCC_DCMI_RELEASE_RESET();

Биты регистра и макросы для периферийного устройства I2C можно найти в Справочном руководстве или в заголовках HAL.

...