Solo lea un registro

2

Estoy usando un STM32F103CBT6 como I2C Master. Después de enviar la dirección I2C del esclavo, necesito borrar el bit de Addr en el registro SR1. Los estados de la hoja de datos:

"DIRECCIÓN: dirección enviada (modo maestro) / coincidente (modo esclavo) Este bit es borrado por el software que lee el registro SR1 seguido por la lectura SR2 "

Por lo tanto, tengo dos líneas después de que el bucle de espera ocupado busque el bit como este:

uint16_t a = I2C1->SR1;
uint16_t b = I2C1->SR2;

Esto funciona bien y el compilador no optimizará las lecturas, ya que los registros se declaran como volatile , pero me advierte que las dos variables nunca se leen y, por lo tanto, son inútiles. Me gustaría deshacerme de estas advertencias. ¿Se garantiza que funcione, cuando cambie las líneas de esta manera?

I2C1->SR1;
I2C1->SR2;

¿O debería borrar el bit manualmente sin leer SR2 alguna vez?

Gracias de antemano

    
pregunta user5675428

2 respuestas

0

Si puede borrar el bit manualmente, esto haría que su código sea más claro. Si la única manera de borrar el bit es leer los registros, entonces una buena manera de hacerlo es:

//Reading SR1 and SR2 automatically clears the ADDR bit
(void)I2C1->SR1;
(void)I2C1->SR2;

lo que hace que sea obvio para los futuros lectores que realmente quieres leer la variable e ignorar su valor. Mientras I2C1 sea un puntero a una estructura volátil (que lo es), el compilador hará lo que usted espera.

    
respondido por el Adam Haun
0

La forma habitual de hacerlo, de forma segura y portátil:

volatile uint16_t dummy = I2C1->SR1;
(void)dummy;

Esto generalmente funciona incluso en compiladores disfuncionales. Si el compilador aún advierte, debe presentar un informe de error al proveedor del compilador.

    
respondido por el Lundin

Lea otras preguntas en las etiquetas