This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我在 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"); } }
EPWM1时钟为 CLB 时钟。
这就是为什么在所有 CLB 示例中、我们启用 ePWM PCLK 的原因。 对于该器件、如果要使用 HRPWM、还需要将 EPWM1分配给 CPU1。 通常、将 EPWM1分配给该器件系列中的 CPU1。
NIMA