// Dynamic_Clocking.c
// 2023/05/18 by marsee
// Referred to "MicroZed Chronicles: Dynamic Clocking"
// https://www.adiuvoengineering.com/post/microzed-chronicles-dynamic-clocking
#include <stdio.h>
#include "xclk_wiz.h"
#include "xgpio.h"
#include "xparameters.h"
XClk_Wiz ClkWiz_Dynamic;
XClk_Wiz_Config *CfgPtr_Dynamic;
XGpio gpio_0, gpio_1;
#define XCLK_WIZARD_DEVICE_ID XPAR_CLK_WIZ_0_DEVICE_ID
#define XCLK_US_WIZ_RECONFIG_OFFSET 0x0000025C
#define CLK_LOCK 1
int main(){
u32 count, locked;
int Status;
CfgPtr_Dynamic = XClk_Wiz_LookupConfig(XCLK_WIZARD_DEVICE_ID);
XClk_Wiz_CfgInitialize(&ClkWiz_Dynamic, CfgPtr_Dynamic, CfgPtr_Dynamic->BaseAddr);
XGpio_Initialize(&gpio_0, XPAR_AXI_GPIO_0_DEVICE_ID);
XGpio_Initialize(&gpio_1, XPAR_AXI_GPIO_1_DEVICE_ID);
printf("freq = 40 MHz\n");
XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
usleep(1000);
XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
sleep(1);
XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
count = XGpio_DiscreteRead(&gpio_0, 1);
locked = XGpio_DiscreteRead(&gpio_0, 2);
printf("count = %d, locked = %d\n\n", count, locked);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
XClk_Wiz_SetRate(&ClkWiz_Dynamic, 10);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
XCLK_US_WIZ_RECONFIG_OFFSET,
(XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
printf("freq = 10 MHz, XClk_Wiz_SetRate\n");
XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
usleep(1000);
XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
sleep(1);
XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
count = XGpio_DiscreteRead(&gpio_0, 1);
locked = XGpio_DiscreteRead(&gpio_0, 2);
printf("count = %d, locked = %d\n\n", count, locked);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
XClk_Wiz_SetRate(&ClkWiz_Dynamic, 25);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
XCLK_US_WIZ_RECONFIG_OFFSET,
(XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
printf("freq = 25 MHz\n");
XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
usleep(1000);
XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
sleep(1);
XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
count = XGpio_DiscreteRead(&gpio_0, 1);
locked = XGpio_DiscreteRead(&gpio_0, 2);
printf("count = %d, locked = %d\n\n", count, locked);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
XClk_Wiz_SetRateHz(&ClkWiz_Dynamic, 20000000);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
XCLK_US_WIZ_RECONFIG_OFFSET,
(XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
printf("freq = 20 MHz, XClk_Wiz_SetRateHz(&ClkWiz_Dynamic, 20000000);\n");
XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
usleep(1000);
XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
sleep(1);
XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
count = XGpio_DiscreteRead(&gpio_0, 1);
locked = XGpio_DiscreteRead(&gpio_0, 2);
printf("count = %d, locked = %d\n\n", count, locked);
return(0);
}
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 | - | - | - | - |