从STOP模式唤醒后,I2C和DCMI在我的定制板上停止工作。我在进入STOP模式之前先取消初始化GPIO。在从I2C的STOP唤醒后,我总是得到读和写的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();
}是否有从STOP模式唤醒后正确重置I2C和DCMI的方法?调用函数MX_I2C2_Init()和MX_DCMI_Init()不起作用。处理这种情况并使I2C和DCMI正常工作的正确方法是什么?
发布于 2019-05-31 22:17:46
可以使用 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头中找到。
https://stackoverflow.com/questions/56395718
复制相似问题