El STM32 es una CPU de 32 bits, pero su ADC tiene una resolución configurable de 6, 8, 10 o 12 bits.
Si echa un vistazo a la Manual de referencia del STM32F407 (RM0090) (este enlace es lo que he encontrado ahora, para Rev 19 de Feb 2021), sección 12.4, figuras 48-50, se ve esto:
Con esto, puedes ver que se está accediendo a un registro de 16 bits, con el lugar para cada bit desde el menos significativo (D0) hasta el más significativo (D11 si estás usando la configuración de 12 bits). También puedes ver las implicaciones de la extensión de signo (SEXT), que suele ser una copia del bit más significativo después de aplicar el offset inyectado. También puedes ver el caso especial de alineación de 6 bits en la figura 50, que insinúa la utilidad de la alineación a la izquierda.
La alineación derecha es la más obvia: se obtienen los bits en bruto tal y como vienen del ADC, lo que da como resultado números de cero a . Si está capturando con un grupo inyectado puede restar un desplazamiento que puede hacer que el número sea negativo, de ahí los bits de extensión de signo.
La alineación a la izquierda es menos obvia, pero puede utilizarse como atajo cuando se trata de números de punto fijo. Si uno está considerando un "registro completo" como el número 1.0, entonces uno puede agregarlo fácilmente cuando se utiliza el ancho completo de los registros de 32 bits del STM32. Puedes sumar muchos de ellos y luego dividir/desplazar cuando el resultado final esté listo. Si se multiplican dos de ellos, se obtiene un valor de 32 bits, que se puede reescalar a 16 bits mediante un desplazamiento de 16 bits, que puede ser más rápido que, por ejemplo, un desplazamiento de 12 bits, porque sería sólo cuestión de mover media palabra. Luego, la mayor parte de esto se puede hacer también con una palabra de 12 bits alineada a la derecha, pero hay que gestionar los bits con mucho más cuidado. Tal vez la mayor ventaja provenga del hecho de que uno puede iniciar las operaciones matemáticas directamente, sin desplazar los datos primero. Dependiendo de la operación que estés haciendo, los bits añadidos a la derecha dan un resultado más fino, con menos instrucciones de máquina y menos riesgo de tener que gestionar tus resultados bit a bit*.
* En la parte del algoritmo, siempre hay que gestionarlo todo bit a bit. Sin embargo, hay menos posibilidades de error si "todas las operaciones son de 16 bits" que si tu posición es "esta operación es de 12 bits, ésta de 16 bits y ésta de 2*12-16=8 bits" y otras.
Ejemplo:
Estás aplicando un filtro IIR a la muestra de tu ADC (12 bits). Usted multiplica su muestra con un número, digamos que su coeficiente es de 16 bits y luego se acumula en la memoria para la siguiente iteración. La multiplicación resulta en un 12+16=28 bits. ¿Cómo se acumula? ¿Como 28-bits? ¿Como 12-bits para que sea la escala adecuada? ¿O un compromiso de 16-bits? En la primera opción, tienes que llevar la cuenta de que el número es realmente de 28-bits para cuando quieras utilizarlo en la siguiente operación. Si la siguiente operación es una multiplicación, tienes que escalarla antes de multiplicando. ¿Necesitas reducir la escala en 12 o 16 bits? ¿Recuerdas si el algoritmo está repartido por todo el código? ¿Y si utilizas el número en otras dos operaciones? ¿Mantendrás la pista del número de bits en cada una de ellas? Por otra parte, si lo escalas a 12 bits, pierdes todos los bits menos significativos. Si lo almacena como 16 bits, parece un compromiso, pero tiene que desplazarlo en 12 bits, lo que puede (o no, no conozco mucho la ISA) ser más lento.
Si te propones utilizar sólo 16 bits, multiplicas un número "virtual de 16 bits" por otro de 16 bits, luego lo desplazas 16 bits y sigues manteniendo 4 de los bits.
0 votos
No he encontrado eso en la hoja de datos, pero para mí indica que hay más espacios de bits en el registro de lo que está recibiendo de la A / D. Alineación derecha haría que el LSB de la A / D bit 0. La alineación izquierda indica lo mismo pero el MSB del resultado del A/D sería el MSB del registro. Los bits no se separarán y los valores no utilizados del registro se rellenarán con (leer hoja de datos). Piensa en un resultado de 12 bits de un registro A/D de 16 bits.