He estado usando STMCUBE combinado con Keil desde hace algún tiempo. En su mayor parte, me gusta la biblioteca HAL y la documentación para los controladores STM32f1xx es bastante buena.
Estoy haciendo un proyecto en el que estoy usando la tarjeta Nucleo STM32f103rb combinada con un gyro / acelerómetro MPU6050.
Utilizo la herramienta de generación de código STM32CubeMX para generar la función de iniciación. Sin embargo, cuando quiero implementar I2C tengo un problema extraño. STM32Cube genera todos los pasos de inicio necesarios, el identificador se configura y luego los pines GPIO se configuran como OD; finalmente, el reloj se habilita utilizando la macro __HAL_RCC_I2C1_CLK_ENABLE()
. Sin embargo, cuando esta macro se ejecuta dentro de HAL_I2C_MspInit
, el indicador de ocupado I2C parece estar configurado, y no se borra, por lo tanto no puedo comunicarme con el dispositivo MPU6050.
Noté que si pongo algo (por ejemplo, una sonda de medición) en la línea SDA mientras se ejecuta la macro __HAL_RCC_I2C1_CLK_ENABLE()
, el indicador de ocupado no se establece y mi comunicación I2C funciona hasta que reinicio el microcontrolador.
Otra forma (que es mejor que poner una sonda física?) que parece funcionar es que después de ejecutar la macro __HAL_RCC_I2C1_CLK_ENABLE()
, uso macros __HAL_RCC_I2C1_FORCE_RESET()
y __HAL_RCC_I2C1_RELEASE_RESET()
. De esta manera mi comunicación I2C funciona bien.
Creo que es extraño y realmente no puedo explicar el comportamiento. Pero desde que agregué las macros de reinicio forzado y liberación reinicio, no he tenido ningún problema de I2C, funciona perfectamente.
Avísame si necesito compartir un código más.