ZYNQ CLK-WIZ重配置
代码参考以及资料
xclk_wiz_intr_example.c(官方参考代码)
xclk_wiz_setrate_example.c(官方参考代码)
pg065-clk-wiz
正点原子-《领航者ZYNQ之嵌入式Vitis开发指南v1.2》
部分寄存器说明
Software Reset Register
SRR的基地址偏移量为 0x00,用于实现对时钟 IP 核软复位的功能。

Status Register
SR的基地址偏移量为 0x04,用于判断时钟 IP 核输出的时钟是否稳定,即 Locked 信号是否为 1。
当 Locked 信号等于 1 时,表示时钟输出稳定;而当 Locked 等于 0 时,表示时钟 IP 核正在进行重配置。

Clock Configuration Register 0
CCR0的基地址偏移量为 0x200,用于设置输出时钟的分频/倍频系数。其中Bit[7:0]表示分频系数( DIVCLK_DIVIDE);
Bit[15:8]表示倍频系数的整数部分( CLKFBOUT_MULT);Bit[25:16]表示倍频系数的小数部分(CLKFBOUT_FRAC)。
需要注意的是,该寄存器设置的分频/倍频系数,对时钟 IP 核输出的所有时钟都有效

Clock Configuration Register 1
CCR1的基地址偏移量为 0x204,用于设置CLKFBOUT_PHASE相位值。输入该寄存器的相位值将被认为是带符号数值。

Clock Configuration Register 2
CCR2的基地址偏移量为 0x208,用于设置 CLKOUT0 时钟的分频系数。 Bit[7:0]表示分频系数的整数部分( CLKOUT0_DIVIDE);
Bit[17:8]表示倍频系数的小数部分( CLKOUT0_FRAC);
该寄存器仅用于配置 clkout0 的分频系数,即 clkout0 最终输出的时钟频率是先在 Clock Configuration Register 0 的基础上进行分频/倍频, 再通过 Clock Configuration Register 2 进行分频得到的。
Clock Configuration Register 23
CCR23的基地址偏移量为 0x25C,用于加载动态重配置的参数.在配置完分频和倍频系数后,必须通过此寄存器加载重配置的参数才行,否则配置的参数无法生效。
当 Bit[0]等于 1 时,表示加载重配置的参数。而 Bit[1]用于选择重配置的参数,当 Bit[1]等于 1 时,重配置的参数来源于前面的配置寄存器;
当 Bit[1]等于 0 时,重配置的参数来源于 Clocking Wizard GUI 界面。

部分配置代码
点击查看代码
/***************************** Include Files *********************************/
#include "xclk_wiz.h"
#include "xparameters.h"
#include "xstatus.h"
#include "xil_types.h"
#include "clk_wiz.h"
/************************** Constant Definitions *****************************/
#define CLK_WIZ_IN_FREQ 100 //时钟 IP 核输入 100Mhz
/************************** Variable Definitions *****************************/
XClk_Wiz ClkWiz_Dynamic; /* The instance of the ClkWiz_Dynamic */
/************************** Function Definitions *****************************/
/*****************************************************************************
* Description : 时钟IP核动态重配置
* Parm1 : 时钟IP核的器件ID
* Parm2 : 时钟IP核输出的时钟 单位:MHz
*
*****************************************************************************/
int ClkWiz_Config(u32 DeviceId) {
int Status;
XClk_Wiz_Config *CfgPtr_Dynamic;
/*
* Get the CLK_WIZ Dynamic reconfiguration driver instance
*/
CfgPtr_Dynamic = XClk_Wiz_LookupConfig(DeviceId);
if (!CfgPtr_Dynamic) {
return XST_FAILURE;
}
/*
* Initialize the CLK_WIZ Dynamic reconfiguration driver
*/
Status = XClk_Wiz_CfgInitialize(&ClkWiz_Dynamic, CfgPtr_Dynamic,
CfgPtr_Dynamic->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
if (ClkFreq <= 0) {
xil_printf("Incorrect ClkFreq! \r\n"
"Please check design\r\n");
return XST_FAILURE;
}
/* Calling Clock wizard dynamic reconfig */
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
CLK_CFG0_OFFSET, 0x00194a05); //配置时钟倍频/分频系数, 74.25倍频,5分频
/* Set Clkout0 divide value */
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
CLK_CFG2_OFFSET, 0x00000014); //配置时钟分频系数, 20分频
/* Set Clkout1 divide value */
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
CLK_CFG5_OFFSET, 0x0000000a); //配置时钟分频系数, 10分频
/* Set Clkout2 divide value */
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
CLK_CFG8_OFFSET, 0x00000004); //配置时钟分频系数, 4分频
/* Set Clkout3 divide value */
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
CLK_CFG11_OFFSET, 0x0000001e); //配置时钟分频系数, 30分频
/* Load reconfigiruation parameters */
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
CLK_CFG23_OFFSET, 0x00000003);
/* Wait for XClk_Wiz lock */
while(1){
Status = XClk_Wiz_ReadReg(CfgPtr_Dynamic->BaseAddr,CLK_SR_OFFSET);
if(status & 0x00000001) //Bit0 Locked信号
return XST_SUCCESS;
}
}


浙公网安备 33010602011771号