请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28379D 我在 CLB1模块上实现了一些逻辑。 但是、只有当我将 EPWM1分配给 CPU2时、它才会工作。 我不在 CLB 中使用来自 EPWM1 (或任何 EPWM 模块)的任何信号。 我在勘误文档中和 TRM 中都没有看到任何相关内容。
我已经编写了一个小演示来重现此问题。 我似乎无法将.syscfg 文件附加到此帖子、因此下面的 main.c 文件就足够了。 该演示对 GPIO35上的正边沿事件进行计数。 计数器初始化为1000、当计数器超过20000时、计数器将重置为该值。 禁用 sysctl_selectCPUForPeripheral()调用后,CLB 模块将按所述工作。 启用调用后、CLB 模块不会有任何状态变化(无论什么、计数器值读取为0)。
#include "driverlib.h"
#include "device.h"
#include "clb_config.h"
#include "clb.h"
#include "pin_map.h"
void initCLB1(void);
void main(void)
{
Device_init();
Device_initGPIO();
Interrupt_initModule();
Interrupt_initVectorTable();
GPIO_setPadConfig(35, GPIO_PIN_TYPE_STD);
GPIO_setPinConfig(GPIO_35_GPIO35);
GPIO_setDirectionMode(35, GPIO_DIR_MODE_IN);
SysCtl_enablePeripheral((SysCtl_PeripheralPCLOCKCR)0x0011);
CLB_enableCLB(CLB1_BASE);
initTILE1(CLB1_BASE);
CLB_configLocalInputMux(CLB1_BASE, CLB_IN0, CLB_LOCAL_IN_MUX_GLOBAL_IN);
CLB_configLocalInputMux(CLB1_BASE, CLB_IN1, CLB_LOCAL_IN_MUX_GLOBAL_IN);
CLB_configLocalInputMux(CLB1_BASE, CLB_IN2, CLB_LOCAL_IN_MUX_GLOBAL_IN);
CLB_configLocalInputMux(CLB1_BASE, CLB_IN3, CLB_LOCAL_IN_MUX_GLOBAL_IN);
CLB_configLocalInputMux(CLB1_BASE, CLB_IN4, CLB_LOCAL_IN_MUX_GLOBAL_IN);
CLB_configLocalInputMux(CLB1_BASE, CLB_IN5, CLB_LOCAL_IN_MUX_GLOBAL_IN);
CLB_configLocalInputMux(CLB1_BASE, CLB_IN6, CLB_LOCAL_IN_MUX_GLOBAL_IN);
CLB_configLocalInputMux(CLB1_BASE, CLB_IN7, CLB_LOCAL_IN_MUX_GLOBAL_IN);
CLB_configGlobalInputMux(CLB1_BASE, CLB_IN0, CLB_GLOBAL_IN_MUX_CLB_AUXSIG0);
CLB_configGlobalInputMux(CLB1_BASE, CLB_IN1, CLB_GLOBAL_IN_MUX_CLB_AUXSIG1);
CLB_configGlobalInputMux(CLB1_BASE, CLB_IN2, CLB_GLOBAL_IN_MUX_CLB_AUXSIG2);
CLB_configGlobalInputMux(CLB1_BASE, CLB_IN3, CLB_GLOBAL_IN_MUX_CLB_AUXSIG3);
CLB_configGlobalInputMux(CLB1_BASE, CLB_IN4, CLB_GLOBAL_IN_MUX_CLB_AUXSIG4);
CLB_configGlobalInputMux(CLB1_BASE, CLB_IN5, CLB_GLOBAL_IN_MUX_CLB_AUXSIG5);
CLB_configGlobalInputMux(CLB1_BASE, CLB_IN6, CLB_GLOBAL_IN_MUX_CLB_AUXSIG6);
CLB_configGlobalInputMux(CLB1_BASE, CLB_IN7, CLB_GLOBAL_IN_MUX_CLB_AUXSIG7);
CLB_configGPInputMux(CLB1_BASE, CLB_IN0, CLB_GP_IN_MUX_EXTERNAL);
CLB_configGPInputMux(CLB1_BASE, CLB_IN1, CLB_GP_IN_MUX_GP_REG);
CLB_configGPInputMux(CLB1_BASE, CLB_IN2, CLB_GP_IN_MUX_GP_REG);
CLB_configGPInputMux(CLB1_BASE, CLB_IN3, CLB_GP_IN_MUX_GP_REG);
CLB_configGPInputMux(CLB1_BASE, CLB_IN4, CLB_GP_IN_MUX_GP_REG);
CLB_configGPInputMux(CLB1_BASE, CLB_IN5, CLB_GP_IN_MUX_GP_REG);
CLB_configGPInputMux(CLB1_BASE, CLB_IN6, CLB_GP_IN_MUX_GP_REG);
CLB_configGPInputMux(CLB1_BASE, CLB_IN7, CLB_GP_IN_MUX_GP_REG);
XBAR_setInputPin(XBAR_INPUT1, 35);
XBAR_setCLBMuxConfig(XBAR_AUXSIG0, XBAR_CLB_MUX01_INPUTXBAR1);
XBAR_enableCLBMux(XBAR_AUXSIG0, XBAR_MUX01);
/* !!!!!!!!!!!!!! UNCOMMENT THE BELOW LINE TO REPRODUCE CLB1 DISFUNCTION !!!!!!!!!!!!!!!!! */
// SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL0_EPWM, 1, SYSCTL_CPUSEL_CPU2);
uint32_t ctr;
while(1)
{
ctr = CLB_getRegister(CLB1_BASE, CLB_REG_CTR_C0);
if(ctr > 20000)
{
CLB_setGPREG(CLB1_BASE, 0b0000); // clear GP_REG to ensure next write triggers a pos edge
asm(" NOP");
CLB_setGPREG(CLB1_BASE, 0b0010); // set GP_REG to value that brings bit 1 high (configured to CLB_IN1 above).
}
asm(" NOP");
}
}