请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28P650DK 主题:SysConfig 中讨论的其他器件
工具/软件:
您好、工程师:
我测试了使用库函数进行操作的方法、这会占用大量 CPU 时间。 与直接寄存器操作相比、差异为10倍。 在以下程序中、 endat22_reset_CLB() 函数是例程提供的库函数、而 RstCLB_endat22() 函数是 ME 修改的寄存器配置函数。 我进行了一些修改、逐一进行了比较。
使用 endat22_reset_clb()时、可以按预期发送和接收数据;但是、用 RstCLB_endat22()替换数据无法正常发送数据。
替换后、CLB 寄存器中的更改相同、但 CLB 无法按预期运行。
void endat22_reset_CLB(void)
{
CLB_setGPREG(CLB4_BASE, 0);
//
// Turn OFF the CLB functionality
//
EALLOW;
HWREG(CLB4_BASE + CLB_LOGICCTL + CLB_O_LOAD_EN) = 0;
EDIS;
//
// Clear Counters - this will clear counter REGs. Add_shift_on_even_en should be Zero for this to take effect.
//
CLB_writeInterface(CLB4_BASE, CLB_ADDR_COUNTER_0_LOAD, 0x0);
CLB_writeInterface(CLB4_BASE, CLB_ADDR_COUNTER_1_LOAD, 0x0);
CLB_writeInterface(CLB4_BASE, CLB_ADDR_COUNTER_2_LOAD, 0x0);
//
// Clear and reload the HLC registers
//
CLB_writeInterface(CLB4_BASE, CLB_ADDR_HLC_R0, 0x9);
CLB_writeInterface(CLB4_BASE, CLB_ADDR_HLC_R1, 0x0);
CLB_writeInterface(CLB4_BASE, CLB_ADDR_COUNTER_1_MATCH1, 0x2);
CLB_setOutputMask(CLB4_BASE, 0, false);
//CLB3
CLB_setGPREG(CLB3_BASE, 0);
//
// Turn OFF the CLB functionality
//
EALLOW;
HWREG(CLB3_BASE + CLB_LOGICCTL + CLB_O_LOAD_EN) = 0;
EDIS;
//
// Clear Counters - this will clear counter REGs. Add_shift_on_even_en should be Zero for this to take effect.
//
CLB_writeInterface(CLB3_BASE, CLB_ADDR_COUNTER_0_LOAD, 0x0);
CLB_writeInterface(CLB3_BASE, CLB_ADDR_COUNTER_1_LOAD, 0x0);
CLB_writeInterface(CLB3_BASE, CLB_ADDR_COUNTER_2_LOAD, 0x0);
//CLB2
CLB_setGPREG(CLB2_BASE, 0);
//
// Turn OFF the CLB functionality
//
EALLOW;
HWREG(CLB2_BASE + CLB_LOGICCTL + CLB_O_LOAD_EN) = 0;
EDIS;
//
// Clear Counters - this will clear counter REGs. Add_shift_on_even_en should be Zero for this to take effect.
//
CLB_writeInterface(CLB2_BASE, CLB_ADDR_COUNTER_0_LOAD, 0x0);
CLB_writeInterface(CLB2_BASE, CLB_ADDR_COUNTER_1_LOAD, 0x0);
CLB_writeInterface(CLB2_BASE, CLB_ADDR_COUNTER_2_LOAD, 0x0);
//CLB1
CLB_setGPREG(CLB1_BASE, 0);
//
// Turn OFF the CLB functionality
//
EALLOW;
HWREG(CLB1_BASE + CLB_LOGICCTL + CLB_O_LOAD_EN) = 0;
EDIS;
//
// Clear Counters - this will clear counter REGs. Add_shift_on_even_en should be Zero for this to take effect.
//
CLB_writeInterface(CLB1_BASE, CLB_ADDR_COUNTER_0_LOAD, 0x0);
}
void RstCLB_endat22(void)
{
// CLB_setGPREG(CLB4_BASE, 0);
Clb4LogicCtrlRegs.CLB_GP_REG.all = 0;
//
// Turn OFF the CLB functionality
//
EALLOW;
// HWREG(CLB4_BASE + CLB_LOGICCTL + CLB_O_LOAD_EN) = 0;
Clb4LogicCtrlRegs.CLB_LOAD_EN.all = 0;
EDIS;
//
// Clear Counters - this will clear counter REGs. Add_shift_on_even_en should be Zero for this to take effect.
//
// CLB_writeInterface(CLB4_BASE, CLB_ADDR_COUNTER_0_LOAD, 0x0);
// CLB_writeInterface(CLB4_BASE, CLB_ADDR_COUNTER_1_LOAD, 0x0);
// CLB_writeInterface(CLB4_BASE, CLB_ADDR_COUNTER_2_LOAD, 0x0);
Clb4LogicCtrlRegs.CLB_LOAD_ADDR.all = 0;
Clb4LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb4LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
Clb4LogicCtrlRegs.CLB_LOAD_ADDR.all = 1;
Clb4LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb4LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
Clb4LogicCtrlRegs.CLB_LOAD_ADDR.all = 2;
Clb4LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb4LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
//
// Clear and reload the HLC registers
//
// CLB_writeInterface(CLB4_BASE, CLB_ADDR_HLC_R0, 0x9);
// CLB_writeInterface(CLB4_BASE, CLB_ADDR_HLC_R1, 0x0);
// CLB_writeInterface(CLB4_BASE, CLB_ADDR_COUNTER_1_MATCH1, 0x2);
Clb4LogicCtrlRegs.CLB_LOAD_ADDR.all = 0xC;
Clb4LogicCtrlRegs.CLB_LOAD_DATA = 0x9;
Clb4LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
Clb4LogicCtrlRegs.CLB_LOAD_ADDR.all = 0xD;
Clb4LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb4LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
Clb4LogicCtrlRegs.CLB_LOAD_ADDR.all = 0x5;
Clb4LogicCtrlRegs.CLB_LOAD_DATA = 0x2;
Clb4LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
// CLB_setOutputMask(CLB4_BASE, 0, false);
Clb4LogicCtrlRegs.CLB_OUT_EN &= ~((Uint32)0);
//CLB3
// CLB_setGPREG(CLB3_BASE, 0);
Clb3LogicCtrlRegs.CLB_GP_REG.all = 0;
//
// Turn OFF the CLB functionality
//
EALLOW;
// HWREG(CLB3_BASE + CLB_LOGICCTL + CLB_O_LOAD_EN) = 0;
Clb3LogicCtrlRegs.CLB_LOAD_EN.all = 0;
EDIS;
//
// Clear Counters - this will clear counter REGs. Add_shift_on_even_en should be Zero for this to take effect.
//
// CLB_writeInterface(CLB3_BASE, CLB_ADDR_COUNTER_0_LOAD, 0x0);
// CLB_writeInterface(CLB3_BASE, CLB_ADDR_COUNTER_1_LOAD, 0x0);
// CLB_writeInterface(CLB3_BASE, CLB_ADDR_COUNTER_2_LOAD, 0x0);
Clb3LogicCtrlRegs.CLB_LOAD_ADDR.all = 0x0;
Clb3LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb3LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
Clb3LogicCtrlRegs.CLB_LOAD_ADDR.all = 0x1;
Clb3LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb3LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
Clb3LogicCtrlRegs.CLB_LOAD_ADDR.all = 0x2;
Clb3LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb3LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
//CLB2
// CLB_setGPREG(CLB2_BASE, 0);
Clb2LogicCtrlRegs.CLB_GP_REG.all = 0;
//
// Turn OFF the CLB functionality
//
EALLOW;
// HWREG(CLB2_BASE + CLB_LOGICCTL + CLB_O_LOAD_EN) = 0;
Clb2LogicCtrlRegs.CLB_LOAD_EN.all = 0;
EDIS;
//
// Clear Counters - this will clear counter REGs. Add_shift_on_even_en should be Zero for this to take effect.
//
// CLB_writeInterface(CLB2_BASE, CLB_ADDR_COUNTER_0_LOAD, 0x0);
// CLB_writeInterface(CLB2_BASE, CLB_ADDR_COUNTER_1_LOAD, 0x0);
// CLB_writeInterface(CLB2_BASE, CLB_ADDR_COUNTER_2_LOAD, 0x0);
Clb2LogicCtrlRegs.CLB_LOAD_ADDR.all = 0x0;
Clb2LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb2LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
Clb2LogicCtrlRegs.CLB_LOAD_ADDR.all = 0x1;
Clb2LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb2LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
Clb2LogicCtrlRegs.CLB_LOAD_ADDR.all = 0x2;
Clb2LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb2LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
//CLB1
// CLB_setGPREG(CLB1_BASE, 0);
Clb1LogicCtrlRegs.CLB_GP_REG.all = 0;
//
// Turn OFF the CLB functionality
//
EALLOW;
// HWREG(CLB1_BASE + CLB_LOGICCTL + CLB_O_LOAD_EN) = 0;
Clb1LogicCtrlRegs.CLB_LOAD_EN.all = 0;
EDIS;
//
// Clear Counters - this will clear counter REGs. Add_shift_on_even_en should be Zero for this to take effect.
//
// CLB_writeInterface(CLB1_BASE, CLB_ADDR_COUNTER_0_LOAD, 0x0);
Clb1LogicCtrlRegs.CLB_LOAD_ADDR.all = 0x0;
Clb1LogicCtrlRegs.CLB_LOAD_DATA = 0;
Clb1LogicCtrlRegs.CLB_LOAD_EN.all |= 1;
}

此致、
林浩南