Interrupción por pdb
Objetivo: Generar una interrupción vía PDB, de tal manera que la frecuencia de interrupción sea de 1920 Hz.
PDB (programmable Delay Block, siendo PDB un contador a una frecuencia de operación base a la frecuencia del cristal. Para tener modificar el valor de la frecuencia de en le PDB se tiene que emplear el Preescalador y el Divisor.
Como punto de aclaración se requiere que sea a una frecuencia de 1920 Hz, para que sea 32 veces la frecuencia de 60 Hz.
El siguiente diagrama describe como se habilita PDB como interrupción:
En la siguiente figura se muestra el comportamiento de una corrida del programa tomando muestras enpromedio cada segundo, se puede apreciar que la diferencia de las muestras del contador se muy semejante a 1920 muestras por segundo:
Código de programa principal
/*******************************************************************************
* ESTE ES UN PROGRAMA, EJEMPLIFICA UN RETARDO DE INTERRRUPCION POR PDB
******************************************************************************/
#include "fsl_debug_console.h"
#include "board.h"
#include "fsl_pdb.h"
#include "pin_mux.h"
#include "clock_config.h"
/*******************************************************************************
* Definitiones
******************************************************************************/
#define DEMO_PDB_BASE PDB0
#define DEMO_PDB_IRQ_ID PDB0_IRQn
#define DEMO_PDB_IRQ_HANDLER PDB0_IRQHandler
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
* DECLARACIÓN DE VARIABLES
******************************************************************************/
volatile uint32_t g_PdbDelayInterruptCounter;
volatile bool g_PdbDelayInterruptFlag;
uint32_t Bus_Clk;
uint32_t Modulo_PDB;
/*******************************************************************************
* CODIGO
******************************************************************************/
/*******************************************************************************
* DECLARACIÓN DE INTERRUPCIÓN POR PDB
******************************************************************************/
void DEMO_PDB_IRQ_HANDLER(void)
{
PDB_ClearStatusFlags(DEMO_PDB_BASE, kPDB_DelayEventFlag);
g_PdbDelayInterruptCounter++;
g_PdbDelayInterruptFlag = true;
}
/*******************************************************************************
* CODIGO DE PROGRAMA PRINCIPAL
******************************************************************************/
int main(void)
{
//***********************Inicialización_de_funciones****************************
pdb_config_t pdbConfigStruct;
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
EnableIRQ(DEMO_PDB_IRQ_ID);
//******************Desplega_en_pantalla_una_noticicación***********************
PRINTF("\r\nPDB Delay Interrupt Example.\r\n");
//***********************Configuración_de_contador_PDB**************************
PDB_GetDefaultConfig(&pdbConfigStruct);
pdbConfigStruct.prescalerDivider = kPDB_PrescalerDivider128;
pdbConfigStruct.dividerMultiplicationFactor = kPDB_DividerMultiplicationFactor40;
pdbConfigStruct.enableContinuousMode=true;
PDB_Init(DEMO_PDB_BASE, &pdbConfigStruct); //Configuración por Default.
/* Configure the PDB counter.
* pdbConfigStruct.loadValueMode = kPDB_LoadValueImmediately;
* pdbConfigStruct.prescalerDivider = kPDB_PrescalerDivider1;
* pdbConfigStruct.dividerMultiplicationFactor = kPDB_DividerMultiplicationFactor1;
* pdbConfigStruct.triggerInputSource = kPDB_TriggerSoftware;
* pdbConfigStruct.enableContinuousMode = false;
*/
//*********************Definición_de_reloj_&_Modulo_PDB************************
Bus_Clk = CLOCK_GetFreq(kCLOCK_BusClk);
Modulo_PDB = 1*(1969<<pdbConfigStruct.prescalerDivider)*40;
Modulo_PDB = Bus_Clk/Modulo_PDB; //
//******************Configure_the_delay_interrupt******************************
PDB_SetModulusValue(DEMO_PDB_BASE,Modulo_PDB); // Se ajusta el valor del modulo.
//*******Habilita_valor_retardo_menor_o_mayor_que_el_valor_del_modulo**********
PDB_SetCounterDelayValue(DEMO_PDB_BASE,Modulo_PDB/2); //Se ajusta el valor del contador
PDB_EnableInterrupts(DEMO_PDB_BASE, kPDB_DelayInterruptEnable);// Se habilita la interrupción
PDB_DoLoadValues(DEMO_PDB_BASE); // Se carga el valor
PDB_DoSoftwareTrigger(DEMO_PDB_BASE); // Se establece disparo por
software
PRINTF("\r\nType any key into terminal to trigger the PDB counter ...\r\n");//
//***********Programa_principal_espera_interrupción_De_pdb*********************
while (1)
{
g_PdbDelayInterruptFlag = false; // Limpia bandera
while (!g_PdbDelayInterruptFlag) // Espera hasta que exista un cambio en la bandera
{
}
PRINTF("PDB Delay Interrupt Counter: %d\r\n", g_PdbDelayInterruptCounter); //Muestra el contador de
pdb.
}
}
/*******************************************************************************
* FIN DE CODIGO DE PROGRAMA PRINCIPAL.
******************************************************************************/
GETCHAR();
No hay comentarios:
Publicar un comentario