Aumente la frecuencia y la velocidad del microcontrolador

Estoy en proceso de actualizar el microcontrolador de nuestro proyecto de Renesas M16C a RX63N. En nuestro proyecto M16C actual, usamos cristal de 16 MHz. Si en el nuevo microcontrolador Rx63N si uso la frecuencia a 196MHz usando PLL, cuales son los puntos que debo considerar especialmente en el código.

Una cosa que entiendo es que la función de retraso utilizada en el código puede necesitar cambios de acuerdo con nuestro nuevo tiempo de ejecución de instrucciones.

¿Necesito cambiar o necesito enfocarme en alguna otra cosa, es decir, necesito cambiar algo en la comunicación en serie entre mi nuevo microcontrolador y el IC externo?

¿Necesito cambiar mi lógica ADC? ¿Necesito cambiar mi lógica donde me comunico con la PC a través del chip RS232?

Guíeme en qué área de mi código debo prestar atención cuando aumente la frecuencia y la velocidad del microcontrolador.

Gracias a todos. Todos los puntos son útiles de alguna manera.
Lea la hoja de datos y use su cerebro. Algunas cosas pueden permanecer igual, si logras dividir el nuevo reloj al mismo valor que antes. La mayoría de los controladores de bajo nivel probablemente cambiarán.
@user977601: debe aceptar una de las respuestas si está satisfecho con ella.

Respuestas (4)

Un microcontrolador no es consciente de una cosa como el tiempo ; solo conoce los tictac del reloj. Entonces, la lógica del controlador no puede notar la diferencia entre funcionar a 16 MHz y 192 MHz: un tic de reloj es un tic de reloj, y hará exactamente lo mismo en 10 tic de reloj para ambas frecuencias.

Eso significa que cuando el tiempo real es relevante, depende de usted asegurarse de que la cantidad de tics del reloj se traduzca correctamente en tiempo. Suponga que tiene un temporizador de 1 ms para el controlador de 16 MHz. Le dará una interrupción cada 16 000 tics de reloj, eso es una vez cada ms. Ejecute ese mismo código en un controlador de 192 MHz y aún obtendrá la interrupción cada 16 000 tics de reloj, pero ahora serán 83 µs. Así que cambia el valor del temporizador a 192 000. Haz esto para todo lo que sea relevante en tiempo real. Si no lo hace, el UART de 9600 bps se ejecutará 12 veces más rápido, así que configure el preescalador en un valor 12 veces mayor.

El ADC es un poco diferente. Ese sabe sobre el tiempo: el capacitor de medición caerá a la misma velocidad ya sea que funcione a 16 MHz o a 192 MHz. O a 1 Hz. Mientras que el controlador funcionará (o más bien: "paseará") felizmente a 1 Hz, para el ADC eso es demasiado lento. La hoja de datos le dirá la frecuencia mínima que necesita.

¿Qué área? En todas partes. Cualquier cosa que involucre interfaces externas: eliminación de rebotes de entrada de botón, velocidades y retrasos de ADC o SPI, tiempos de acceso a RAM o flash, circuitos de actualización de LCD, etc. es posible que no lo espere, como las condiciones de carrera entre fragmentos de código aislados porque algo finaliza más rápido de lo que solía hacerlo y algún evento basado en el tiempo no esperaba que ya hubiera actualizado una variable.

Por supuesto, esto depende en gran medida de lo que realmente haga su código. Si todo son matemáticas, es posible que deba cambiar muy poco. Pero la mayoría de los microcontroladores se utilizan para interactuar con el mundo real de muchas maneras. ¡Y el mundo real no cambiará de velocidad para igualar!

Si aumenta la frecuencia de reloj de su micro, entonces sí, deberá ajustar cualquier característica de su código que dependa de que tenga una frecuencia determinada. Esto puede ser muchas cosas o no, dependiendo de su diseño.

Cualquier comunicación asíncrona como USART, periféricos como ADC/DAC son una preocupación obvia aquí. SPI e I2C solo tendrán una frecuencia de reloj más alta, lo que puede desearse o no (o puede no funcionar si el bus está en el límite de la frecuencia original) Tiempos de interfaz de memoria, funciones que dependen de una determinada frecuencia de reloj (como el retraso mencionas puede verse afectado), etc, etc.
Te haces una idea.

Para determinar lo que necesita hacer, deberá examinar su código cuidadosamente. Dependiendo de cómo esté escrito puede adaptarse fácilmente o no.
Por ejemplo, a menudo se usa una macro para calcular la relación divisoria de un periférico, por lo que todo lo que debe cambiarse es una #definición de la frecuencia del reloj. Si su código usa este tipo de técnica, el ajuste será menos doloroso; me imagino que cualquier biblioteca de Renasas hará esto, por lo que, con suerte, solo será un caso de leer la documentación de la biblioteca.
Aquí hay un ejemplo de un código de configuración de UART (parte de la función de inicio de USART para una biblioteca de periféricos STM32 ARM que estoy usando actualmente) Observe que el valor final del registro BRR se basa en la tasa de apbclock y el valor de USART_BaudRate (pasado en un struct a la función init) Esto significa que cualquier cambio en la frecuencia del reloj se maneja siempre que se actualice una definición global (que se usa en la función RCC_GetClocksFreq()):

/*---------------------------- USART BRR Configuration -----------------------*/
  /* Configure the USART Baud Rate -------------------------------------------*/
  RCC_GetClocksFreq(&RCC_ClocksStatus);
  if (usartxbase == USART1_BASE)
  {
    apbclock = RCC_ClocksStatus.PCLK2_Frequency;
  }
  else
  {
    apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  }

  /* Determine the integer part */
  if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
  {
    /* Integer part computing in case Oversampling mode is 8 Samples */
    integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));    
  }
  else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  {
    /* Integer part computing in case Oversampling mode is 16 Samples */
    integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));    
  }
  tmpreg = (integerdivider / 100) << 4;

  /* Determine the fractional part */
  fractionaldivider = integerdivider - (100 * (tmpreg >> 4));

  /* Implement the fractional part in the register */
  if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
  {
    tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
  }
  else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  {
    tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  }

  /* Write to USART BRR */
  USARTx->BRR = (uint16_t)tmpreg; 

Otra cosa para llamar específicamente es cualquier código que golpee los pines del puerto para implementar el apretón de manos con lógica externa. Esto podría incluir hablar con registros de desplazamiento de expansión de E/S, pantallas LCD, EEPROM en serie y cualquier otra lógica o IC que pueda tener requisitos de temporización. Estos requisitos de temporización pueden incluir anchos de pulso, frecuencias de pulso, tiempos de configuración, tiempos de espera y relaciones de borde a borde entre varias E/S de bits.