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.

关于M4比较器



SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP1);   //比较器
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
GPIOPinTypeComparator(GPIO_PORTC_BASE, GPIO_PIN_4);
GPIOPinTypeComparator(GPIO_PORTC_BASE, GPIO_PIN_5);
ComparatorIntClear(COMP_BASE,1); 
ComparatorConfigure(COMP_BASE,1,(COMP_TRIG_NONE|COMP_INT_BOTH|COMP_ASRCP_PIN|COMP_OUTPUT_NORMAL));
ComparatorIntEnable(COMP_BASE,1);
IntEnable(INT_COMP1);
 
程序运行这段代码的时候会跳到错误中断处
  • 跟踪下运行到具体哪句话跳到异常中断的。

  • 跳到这条语句的运行的时候就那样了ComparatorIntClear(COMP_BASE,1);

    补充说明,我用同样的方法用比较器0可以

  • 你好,

          请使用如下的代码试试:

    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHZ);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP0); //±È½ÏÆ÷
    SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP1); //±È½ÏÆ÷
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeComparator(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5);
    //PF1 works as comparator 1 output pin
    // HWREG(0x4002552C) = 0x00000090;
    // GPIOPinTypeComparator(GPIO_PORTF_BASE, GPIO_PIN_1);
    GPIOPinConfigure(GPIO_PF1_C1O);

    ComparatorConfigure(COMP_BASE,0,(COMP_TRIG_NONE|COMP_INT_BOTH|COMP_ASRCP_PIN|COMP_OUTPUT_NORMAL));
    //ComparatorConfigure(COMP_BASE,1,(COMP_TRIG_NONE|COMP_INT_BOTH|COMP_ASRCP_PIN|COMP_OUTPUT_NORMAL));
    HWREG(0x4003C044) |= 0xC;

    ComparatorIntClear(COMP_BASE,1);
    ComparatorIntEnable(COMP_BASE,1);
    IntEnable(INT_COMP1);

  • 因为最近有点其他事情,所以对于一直没有试过这段代码,今天试了一下,感觉可以,但是同时出现了一下疑问:

    如果不使能SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP0); 比较器0的情况下,单独运行如下代码

    SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP1);

        GPIOPinTypeComparator(GPIO_PORTC_BASE, GPIO_PIN_5);
        GPIOPinTypeComparator(GPIO_PORTC_BASE, GPIO_PIN_4); 
        
        ComparatorRefSet(COMP_BASE, COMP_REF_1_65V);
     ComparatorConfigure(COMP_BASE,1,
    (COMP_TRIG_NONE|COMP_INT_BOTH|
    COMP_ASRCP_PIN| COMP_OUTPUT_NORMAL));
    ComparatorIntClear(COMP_BASE, 1);
    ComparatorIntEnable(COMP_BASE,1);

    运行跑到错误中断,

    但是在上面代码加回SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP0);程序可以正常运行,

    更奇怪的是,把上面代码中的SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP1)去掉,程序运行不会跑到错误中断当然实际比较器有木有输出想要的结果没有测试

    SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP0);

        GPIOPinTypeComparator(GPIO_PORTC_BASE, GPIO_PIN_5);
        GPIOPinTypeComparator(GPIO_PORTC_BASE, GPIO_PIN_4); 
        
        ComparatorRefSet(COMP_BASE, COMP_REF_1_65V);
     ComparatorConfigure(COMP_BASE,1,
    (COMP_TRIG_NONE|COMP_INT_BOTH|
    COMP_ASRCP_PIN| COMP_OUTPUT_NORMAL));
    ComparatorIntClear(COMP_BASE, 1);
    ComparatorIntEnable(COMP_BASE,1);

  • 你好,

       使用比较器,除了RCGC1寄存器中相应位要置位之外,RCGCACMP寄存器的R0 bit也需要置位。函数在调用SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP0);的时候将RCGCACMP寄存器的R0 bit置位了,而调用SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP1);的时候没有,所以楼主可以手动置1,代码如下:

    SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP1)

     HWREG(0x400fe63c)|= 0x01;