Aumentar la frecuencia y la velocidad del microcontrolador

6

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

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

¿Debo cambiar o debo centrarme en otra cosa, es decir, debo cambiar algo en la comunicación en serie entre mi nuevo microcontrolador y el IC externo?

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

Por favor guíeme en qué área de mi código, necesito prestar atención cuando aumente la frecuencia y la velocidad del microcontrolador.

    
pregunta user977601

4 respuestas

8

Un microcontrolador no es consciente de algo como tiempo ; solo se sabe el tic tac del reloj. Por lo tanto, la lógica del controlador no puede distinguir la diferencia entre correr a 16 MHz y 192 MHz: una marca de reloj es una marca de reloj, y hará exactamente lo mismo en 10 marcas 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 a la hora. Supongamos 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 el mismo código en un controlador de 192 MHz y seguirá recibiendo la interrupción cada 16 000 tics de reloj, pero ahora será de 83 µs. Entonces, cambie el valor del temporizador a 192 000. Haga 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 prescaler a un valor 12 veces mayor.

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

    
respondido por el stevenvh
11

¿Qué área? En todas partes. Cualquier cosa que involucre interfaces externas: eliminación de entrada de botones, tasas y retrasos de ADC o SPI, RAM o tiempos de acceso al flash, circuitos de actualización de LCD, etc. retrasos, etc. E incluso muchas cosas que podría no esperar, como condiciones de carrera entre piezas aisladas de código porque algo termina más rápido de lo que solía hacerlo y algunos eventos basados en el tiempo no esperaban que ya se hubiera actualizado una variable.

Por supuesto, esto depende en gran medida de lo que realmente haga su código. Si todo es matemática, es posible que tengas que 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á la velocidad para igualar!

    
respondido por el Jim Paris
6

Si aumenta la frecuencia de reloj de su micro, entonces sí, tendrá que ajustar cualquier característica de su código que se base en que sea 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 es una preocupación obvia aquí. SPI e I2C solo tendrán una frecuencia de reloj más alta, lo que puede o no ser deseado (o puede que no funcione si el bus está en el límite a la frecuencia original). Los tiempos de la interfaz de memoria dependen de una determinada velocidad de reloj (como el retardo). Usted menciona puede verse afectado), etc., etc. Tienes la idea.

Para determinar lo que debe 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 proporción de divisor para un periférico, de modo que todo lo que se necesita cambiar es una # definición de la frecuencia de reloj. Si su código utiliza este tipo de técnica, entonces el ajuste será menos doloroso. Me imagino que las bibliotecas de Renasas lo harán, así que es de esperar que solo sea un caso de lectura de la documentación de la biblioteca. Este es un ejemplo de algún código de configuración de UART (parte de la función de inicio USART para una biblioteca de periféricos ARM STM32 que estoy usando actualmente). Observe que el valor del registro BRR final se basa en la tasa de apbclock y el valor de USART_BaudRate (pasado en un estructura a la función de inicio) 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; 
    
respondido por el Oli Glaser
2

Otra cosa a la que hay que llamar específicamente es cualquier código que los pines de los puertos de bit-bangs implementen con la lógica externa. Esto podría incluir hablar con los registros de desplazamiento de expansión de E / S, pantallas LCD, EEPROM serie y cualquier otra lógica o IC que pueda tener requisitos de tiempo. Estos requisitos de tiempo 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 bit banged.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas