Entendiendo las escrituras atómicas a GPIO en diferentes ARM Cortex-M

0

Este video describe sucintamente por qué la lectura / modificación / tienda tiene problemas potenciales cuando se trata de interrupciones. Muy claro y comprensible.

Utiliza el TI Stelarris Cortex-M4 como un tablero de enseñanza y en el minuto que he enlazado anteriormente se describe cómo se diseñó ese tablero de manera que se pueda escribir en cada bit GPIO o en un grupo de bits como era una dirección única que utiliza 256 registros diferentes de 32 bits .

Lo estoy siguiendo junto con una placa STM32F103C8T6 y una página 150 de la manual de referencia dice:

  

Nota: para el establecimiento / restablecimiento de bits atómicos, los bits ODR se pueden configurar individualmente   y se borra escribiendo en el registro GPIOx_BSRR (x = A .. G).

El código de Dave Welche hace exactamente esto. Funciona exactamente como se esperaba y parpadea el LED de a bordo.

Mi pregunta entonces: ¿Hay alguna forma de escribir atómicamente en el tablero de la píldora azul de la manera que se describe en el video? ¿O es que cada fabricante maneja este tipo de cosas de manera diferente y en el caso de la blue-pill ST ha decidido usar un solo registro para manejar esto?

    
pregunta Sam Hammamy

1 respuesta

3

El diseño de GPIO es nominalmente único para cada licenciatario de ARM, y potencialmente puede diferir entre las diferentes subfamilias de un proveedor.

Sin embargo, la mayoría de las MCU ARM están configuradas para colocar el GPIO en la región de banda de bits, que asigna alias a cada bit individual a su propia dirección distinta, una característica proporcionada por el diseño ARM, en lugar del proveedor.

Sin embargo, las partes de Stellaris en cuestión tienen una capacidad novedosa que parece ser un aspecto de su diseño GPIO, en lugar de una banda de bits ARM:

  

Para ayudar en la eficiencia del software, los puertos GPIO permiten la modificación de bits individuales en el   El registro de datos GPIO (GPIODATA) (consulte la página 662) mediante el uso de bits [9: 2] del bus de direcciones como máscara.   De esta manera, los controladores de software pueden modificar pines GPIO individuales en una sola instrucción sin   afectando el estado de los otros pines. Este método es más eficiente que el método convencional de   realizar una operación de lectura-modificación-escritura para establecer o borrar un pin GPIO individual. Para implementar esto   característica, el registro GPIODATA cubre 256 ubicaciones en el mapa de memoria.

La implicación aquí es que puede enmascarar cualquier combinación de 8 bits en uno de estos chips con un número relativamente grande de puertos de 8 bits relativamente pequeños.

En contraste, el STM32 BSRR / BRR es otro esquema exclusivo del proveedor. Tenga en cuenta que dado que el registro BSRR tiene bits distintos para cada configuración y restablecimiento, también es posible realizar una operación enmascarada en una combinación arbitraria de bits de un registro GPIO de 16 bits más amplio aquí. Sin embargo, los datos tendrían que procesarse previamente para dividir los conjuntos de los restablecimientos (en comparación con la solución de TI que es una escritura binaria enmascarada) y parece que la lectura requiere un enmascaramiento posterior por parte del software.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas