0x200 番地 ― Clock Configuration Register 0
Bit[25:16] = CLKFBOUT_FRAC Multiply = 0
Bit[15:8] = CLKFBOUT_MULT = 8
Bit[7:0] = DIVCLK_DIVIDE = 1
0x208 番地 - Clock Configuration Register 2
Bit[7:0] = CLKOUT0_DIVIDE = 0x49 (10進で 73)
Integer part of clkout0 divide value
For example, for 2.250, this value is 2 = 0x2
Bit[17:8] = CLKOUT0_FRAC Divide = 0
Fractional part of clkout0 divide value
For example, for 2.250, this value is 250 = 0xFA
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x50);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x20);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x28);
// Dynamic_Clocking.c
// 2023/05/18 by marsee
// Referred to "MicroZed Chronicles: Dynamic Clocking"
// https://www.adiuvoengineering.com/post/microzed-chronicles-dynamic-clocking
// 2023/05/27 : Modified by marsee
#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, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x50);
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, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x20);
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, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x28);
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 | - | - | - | - |