¿Estrategia para las velocidades de reloj de los periféricos Cortex M0?

Estoy empezando a aprender el Cortex M y vengo de un entorno de 8 bits.

Tengo mi placa de demostración, parpadeando un LED y obteniendo un proyecto de trabajo de STM32Cube.

Estoy trabajando en los registros del sistema, pero estoy un poco bloqueado sobre qué pensar sobre las velocidades de reloj para los periféricos. Esto no es realmente una consideración para ningún firmware de 8 bits que haya escrito.

Para la arquitectura ARM Cortex M0, ¿cuáles son las principales consideraciones al establecer velocidades de reloj para periféricos APB1?

Digamos que ralentizo demasiado el reloj de mi periférico, ¿qué sucede?

¿Cómo podría calcular qué velocidad quiero para los periféricos?

¿Las velocidades de los relojes periféricos representan gran parte del consumo total de energía del sistema?

Esta es una pregunta bastante amplia. Pero diría que comience con lo que quiere hacer con su periférico, qué velocidad de reloj desea. Luego simplemente configure el divisor en consecuencia.
Bien, ¿qué determina qué velocidad de reloj quiero para un periférico? ¿Cómo empiezas con ese cálculo?
¿Qué periférico? Si es algo como UART, seleccionará el mejor reloj para obtener la tasa de baudios deseada. Si es algún ADC seleccionarás el que te dará la tasa de muestreo deseada. Si es un temporizador... bueno, supongo que entendiste la idea.
@Eugene: está bien, lo entiendo libremente. Pero digamos que mi SysClK es de 8 MHz y mi APBI Periph Clock es de 0,25 MHz. ¿Cuál es mi tasa de baudios UART ahora? No sé nada sobre arquitectura de autobuses. Solo hago que los bits mágicos vayan 0/1 en el software...
No puedo decirlo, pero debería haber una fórmula en la hoja de datos de su MCU específico en la sección UART que toma estos 0.25MHz y muchos otros parámetros y le da la velocidad en baudios.

Respuestas (1)

Digamos que ralentizo demasiado el reloj de mi periférico, ¿qué sucede?

Habrá retraso en el acceso a los registros de esos periféricos ya que hay que esperar el bus (AHB).

¿Cómo podría calcular qué velocidad quiero para los periféricos?

La mayoría de las veces solo corren a toda velocidad. A menos que el presupuesto energético requiera lo contrario.

¿Las velocidades de los relojes periféricos representan gran parte del consumo total de energía del sistema?

Eso depende de los periféricos que haya habilitado. Algunos periféricos tienen hambre, otros no. Esto depende de su complejidad.
La hoja de datos tendrá una tabla con la clasificación uA/MHz de los periféricos .
Por ejemplo en el STM32F072:tabla de consumo de corriente de periféricos stm32f072

Al observar estos números, es posible que decida que, cuando solo usa un temporizador para generar PWM de 100 Hz, poner ese bus a 1 MHz en lugar de 48 MHz que van al núcleo mismo. Y tal vez no use TIM1 o TIM2.

Sin embargo, esto afecta a todos los periféricos de ese bus. Incluyendo CAN o UART, y dependiendo de la complejidad del chip las memorias.

No hay mucho que calcular. Tendrás sysclk desde el PLL, y de ahí en adelante solo hay divisores. Encuentre el árbol de relojes en el manual de referencia y juegue con la página de relojes en STMCubeMX.

¡Valora eso! Voy a echar un vistazo a eso. Sé que los periféricos del proveedor son en gran medida la "responsabilidad" del proveedor en el mundo ARM. Sé que esto es muy complicado, pero estoy tratando de aprender cómo ser eficiente antes de intentar transferir mi sistema 8051. Tengo una pieza de software 8051 súper optimizada para energía, quiero perfilar contra una pieza de código CM0 bastante optimizada y ver.
si hay un retraso en el acceso al registro periférico, lo entiendo. ¿Obtendrá datos "obsoletos"? ¿O la MCU se congelará y esperará el valor en el registro periférico?
@Leroy105 El segundo. El bus periférico está funcionando a una velocidad más baja, por lo que se necesita más tiempo para que se complete un acceso.
@duskwuff Me imagino que el acceso al registro dependería de la velocidad del bus, no del reloj periférico real. No creo que el archivo de registro esté cronometrado con ese reloj. Pero eso es solo mi suposición. Quiero decir, parece que ustedes están hablando de relojes diferentes. Está hablando del reloj del bus, pero el OP está hablando del reloj periférico.
@EugeneSh. El "archivo de registro" es parte del periférico, no un componente separado; considere registros como GPIO->IDR, por ejemplo, que no se almacenan explícitamente en ningún lugar. El árbol de reloj completo es complicado, pero la mayoría de los periféricos comparten un reloj con su bus de periféricos.
@duskwuff Bueno, sí, por supuesto, si el acceso al registro activa alguna lógica de reloj en el periférico que se bloqueará hasta completarse, el reloj del periférico afectará la latencia.
@EugeneSh. no todos los periféricos tienen relojes separados. Solo están cronometrados desde el dominio APB del que forman parte.