¿Cómo puedo escribir una función C de retardo de software para Microchip PIC32 MCU? Estoy usando el microcontrolador PIC32MX795F512L con el compilador MPLAB C32 C para MCU PIC32, y me gustaría que una función se retrase en milisegundos.

Te sugiero que uses el temporizador central para la generación de retrasos …

Core Timer es el detalle de los registros del coprocesador (contar y comparar): aquí

El temporizador central (registro de conteo) incrementa cada segundo reloj del sistema. Entonces, su frecuencia de conteo es Fosc / 2. La bandera y la interrupción (si la interrupción está habilitada) cuando Count es igual a Comparar.

Deje tomar Fosc = 120 MHz, el recuento se incrementará a 60MHz.

La función de retraso simple puede ser:

#define Sys_Clock 120 * 1000 * 1000

#define Core_Timer_Clock Sys_Clock / 2 // = 60,000,000

#define CT_Us_2_Cnts (x) x * Core_Timer_Clock / 1,000,000 // = x * 60

#define CT_Ms_2_Cnts (x) x * Core_Timer_Clock / 1,000 // = x * 60,000

void delay_ms_using_core_timer (uint32 delay_ms)

{

registrarse currnt_cnts = _CP0_GET_COUNT ();

registrar delay_cnts = CT_Ms_2_Cnts (x); //// por retraso en Milli Second

// registrar delay_cnts = CT_Us_2_Cnts (x) // para retraso en Micro Second

while (_CP0_GET_COUNT <delay_cnts + currnt_cnts); // El puntero se queda aquí delay

}

La función anterior es un método que usa el temporizador central, se puede usar otro método.

Se puede encontrar más ayuda en Microchip Forum.

Gracias.

Mientras escribe una función de retraso en C, siempre debe tener en cuenta que el compilador podría pensar que su ciclo de retraso no está haciendo nada y optimizarlo.

En una arquitectura relativamente compleja como la de PIC32, nunca es aconsejable escribir una función de retraso de software puro. Incluso si se asegura de que las optimizaciones no se entrometan con su código de retraso, varios factores como la configuración de la caché L1 y la búsqueda previa y cuántos estados de espera se usan podrían afectar el tiempo. Su mejor opción es usar un temporizador como alguien más sugirió.

Alternativamente, puede elegir sondear el temporizador central que aumenta cada dos ciclos de instrucción. Puede encontrar el código de ejemplo en Microchip Forum: http://www.microchip.com/forums/

Un enfoque simple es configurar un temporizador para la cantidad de tiempo correcta dentro de su función de retraso. Luego, use la llamada Nop () para esperar en un bucle while hasta que el temporizador haya expirado. Luego puede calcular el número exacto de milisegundos que necesita para ese temporizador, o simplemente hacer un temporizador de 1 ms y llamarlo n veces desde otra función (sin embargo, el retraso no será exacto con este enfoque debido al tiempo requerido para configurar el minutero).

Aquí hay un ejemplo tomado del código para un dsPIC33F que usa el compilador C30 (debería ser similar a las llamadas C32, pero los registros obviamente serán diferentes en el PIC32):


donde PERIOD_1MILLIS es un valor #definido para el número de ticks de reloj dependientes de la frecuencia del reloj para contar durante 1 ms, y TIMER1_DLY_SETUP es un valor #definido que configura el temporizador. Estos son valores específicos de C30 y llamadas a funciones, pero sospecho que son similares en C32.