打印
[技术问答]

MINI54 ACMP触发定时器 捕获问题

[复制链接]
907|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niemi|  楼主 | 2017-3-28 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 niemi 于 2017-3-28 17:59 编辑


请各位高手指点一下,
谢谢!!!!


工程文件
XT_MINI51_ACMP_T.zip (165.05 KB)




ACMP触发定时器 无法捕获.设置成捕获管脚可以
设置成 ACMP
                TIMER0->TCSR = T_CEN | T_IE | T_CAP_ACMP | T_MODE_CONTINUOUS | T_TDR_EN | 21;  
                TIMER1->TCSR = T_CEN | T_IE | T_CAP_ACMP | T_MODE_CONTINUOUS | T_TDR_EN | 21;   
设置成 管脚
                TIMER0->TCSR = T_CEN | T_IE |     0                | T_MODE_CONTINUOUS | T_TDR_EN | 21;  
                TIMER1->TCSR = T_CEN | T_IE |     0                | T_MODE_CONTINUOUS | T_TDR_EN | 21;   

简单测试程序///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void GPIO_Init(void)
{     
        {
                CLK_EnableModuleClock(TMR1_MODULE); //开启时钟
                CLK_SetModuleClock(TMR1_MODULE,CLK_CLKSEL1_TMR1_S_HCLK, 0 ); //时钟选择
                NVIC_SetPriority(TMR1_IRQn, 0); //中断优先级  
                //设置ACMP触发捕获,发现 无法触发.引脚触发正常
                TIMER1->TCSR = T_CEN | T_IE | T_CAP_ACMP | T_MODE_CONTINUOUS | T_TDR_EN | 21;   
                TIMER1->TCMPR = 10;        //尽快进中断
//                TIMER0->TISR = ~0;        //clr all flag
//          TIMER0->TDR =        0;
//          TIMER0->TCAP = 0;
                TIMER1->TEXCON = TEX_CAP_FALL_RISE | TEX_EN | TEX_IE | T_CNT_DEBO_EN;
                TIMER1->TEXISR = ~0;        //clr all flag               
                NVIC_EnableIRQ( TMR1_IRQn);        //开启中断
        }
        
        
        {
                CLK_EnableModuleClock(TMR0_MODULE); //开启时钟
                CLK_SetModuleClock(TMR0_MODULE , CLK_CLKSEL1_TMR0_S_HCLK , 0 ); //时钟选择        
                NVIC_SetPriority(TMR0_IRQn, 1); //中断优先级  

                //设置ACMP触发捕获,发现 无法触发.引脚触发正常
                TIMER0->TCSR = T_CEN | T_IE | T_CAP_ACMP | T_MODE_CONTINUOUS | T_TDR_EN | 21;  
                TIMER0->TCMPR = 10;        //尽快进中断
//                TIMER1->TISR = ~0; //clr all flag
//          TIMER1->TDR =        0;
//          TIMER1->TCAP = 0;
                TIMER0->TEXCON = TEX_CAP_FALL_RISE | TEX_EN | TEX_IE | T_CNT_DEBO_EN;
                TIMER0->TEXISR = ~0;        //clr all flag        
                NVIC_EnableIRQ( TMR0_IRQn);        //开启中断
        }

        {//t0/t1 捕获脚
                SYS->P3_MFP |= SYS_MFP_P32_T0EX;
                SYS->P3_MFP |= SYS_MFP_P36_T1EX;
        }
        
        
        {//比较器 正极脚位悬空,测试 捕获
                SYS->P1_MFP |= SYS_MFP_P10_CPP0;               
                SYS->P3_MFP |= SYS_MFP_P35_CPP1;
        }
        
        {
                CLK_EnableModuleClock(ACMP_MODULE);
                ACMP->CMPRVCR        = 0 ;
                ACMP->CMPSR        = ~0 ;        //clr all flag
                ACMP->CMPCR[0] = ACMP_EN //开启
                                                                                | ACMP_HYST_EN //迟带
                                                                                | ACMP_CN_VREF //负接内部  
                                                                                | ACMP_FALL_TRG_TIM_EN //下触发
                                                                                | ACMP_FALL_TRG_TIM_EN //上触发   
                                                                                | ACMP_CPP0_P10; //正极悬空
                ACMP->CMPCR[1] = ACMP_EN //开启
                                                                                | ACMP_HYST_EN //迟带
                                                                                | ACMP_CN_VREF //负接内部  
                                                                                | ACMP_FALL_TRG_TIM_EN //下触发
                                                                                | ACMP_FALL_TRG_TIM_EN //上触发   
                                                                                | ACMP_CPP1_P35; //正极悬空
        }
}        
        

u8 t0_dadt;
u8 t1_dadt;
void TMR1_IRQHandler(void)                                    
{  
        if(TIMER1->TISR & 0x01)
        {
                TIMER1->TISR = ~0;
                TIMER1->TCMPR = TIMER1->TDR + 1000;
                t1_dadt++;
        }        
        
        //acmp不能触发中断 . 管脚可以
        if(TIMER1->TEXISR & 0x01)
        {
                TIMER1->TEXISR = ~0;
                t1_dadt++;

        }
}

void TMR0_IRQHandler(void)                                    
{  
        if(TIMER0->TISR & 0x01)
        {
                TIMER0->TISR = ~0;
                TIMER0->TCMPR = TIMER0->TDR + 1000;
                t0_dadt++;
        }        
        
        //acmp不能触发中断 . 管脚可以
        if(TIMER0->TEXISR & 0x01)
        {
                TIMER0->TEXISR = ~0;
                t0_dadt++;
        }
}

int main(void)
{
//        UnlockReg();

        GPIO_Init();
        
        while (1)
        {
               
        }
}
沙发
huangcunxiake| | 2017-3-28 22:42 | 只看该作者
/******************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
* $Revision: 5 $
* $Date: 15/10/06 1:19p $
* [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate Analog comparator (ACMP) comparison by comparing
*           CPP0 (P1.5) with Band-gap voltage and shows the result on UART console.
*
* @note
* Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "Mini51Series.h"

/* Function prototype declaration */
void SYS_Init(void);

int32_t main(void)
{
    /* Init System, IP clock and multi-function I/O
       In the end of SYS_Init() will issue SYS_LockReg()
       to lock protected register. If user want to write
       protected register, please issue SYS_UnlockReg()
       to unlock protected register if necessary. */
    SYS_Init();

    /* Configure UART0: 115200, 8-bit word, no parity bit, 1 stop bit. */
    UART_Open(UART, 115200);


    printf("\n\n");
    printf("+---------------------------------------+\n");
    printf("|         Mini51 ACMP Sample Code       |\n");
    printf("+---------------------------------------+\n");

    printf("\nThis sample code demonstrates ACMP0 function. Using ACMP0_P (P1.5) as ACMP0\n");
    printf("positive input and using internal band-gap voltage as the negative input\n");
    printf("The compare result reflects on ACMP0_O (P3.6)\n");

    /* Configure ACMP0. Enable ACMP0 and select internal reference voltage as negative input. */
    ACMP_Open(ACMP, 0, ACMP_VNEG_BANDGAP, ACMP_HYSTERESIS_DISABLE);
    /* Enable ACMP0 interrupt function */
    ACMP_ENABLE_INT(ACMP, 0);

    /* Enable ACMP01 interrupt */
    NVIC_EnableIRQ(ACMP_IRQn);

    while(1);

}

void ACMP_IRQHandler(void)
{
    static uint32_t u32Cnt = 0;

    /* Clear ACMP 0 interrupt flag */
    ACMP_CLR_INT_FLAG(ACMP, 0);
    /* Check Comparator 0 Output Status */
    if(ACMP_GET_OUTPUT(ACMP, 0))
        printf("ACMP0_P voltage > Band-gap voltage (%d)\n", u32Cnt);
    else
        printf("ACMP0_P voltage <= Band-gap voltage (%d)\n", u32Cnt);

    u32Cnt++;
}


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Register write-protection disabled */
    SYS_UnlockReg();

    /* Set P5 multi-function pins for XTAL1 and XTAL2 */
    SYS->P5_MFP &= ~(SYS_MFP_P50_Msk | SYS_MFP_P51_Msk);
    SYS->P5_MFP |= (SYS_MFP_P50_XTAL1 | SYS_MFP_P51_XTAL2);

    /* Enable external 12MHz XTAL (UART), internal 22.1184MHz */
    CLK->PWRCON = CLK_PWRCON_XTL12M | CLK_PWRCON_IRC22M_EN_Msk;

    /* Waiting for clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_XTL_STB_Msk | CLK_CLKSTATUS_IRC22M_STB_Msk);

    /* Enable UART and ACMP clock */
    CLK->APBCLK = CLK_APBCLK_UART_EN_Msk | CLK_APBCLK_CMP_EN_Msk;

    /* Select UART clock source from external crystal*/
    CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_XTAL;

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock and CycylesPerUs automatically. */
    SystemCoreClockUpdate();


    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set P1.5 multi-function pin for ACMP0 positive input pin */
    SYS->P1_MFP = SYS_MFP_P15_CPP0;

    /* Disable digital input path of analog pin ACMP0_P to prevent leakage */
    GPIO_DISABLE_DIGITAL_PATH(P1, (1 << 5));

    /* Set P1 multi-function pins for UART RXD, TXD */
    SYS->P0_MFP = SYS_MFP_P00_TXD | SYS_MFP_P01_RXD;

    /* Register write-protection enabled */
    SYS_LockReg();
}

/*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/

使用特权

评论回复
板凳
稳稳の幸福| | 2017-3-29 10:27 | 只看该作者
可以直接用官方的改啊

使用特权

评论回复
地板
niemi|  楼主 | 2017-3-29 14:42 | 只看该作者
稳稳の幸福 发表于 2017-3-29 10:27
可以直接用官方的改啊

找不 相关例子. 有可以给我一份吗

使用特权

评论回复
5
dongnanxibei| | 2017-3-29 18:20 | 只看该作者
太乱了,看不了,不如官方提供的例程序写的清楚。

使用特权

评论回复
6
643757107| | 2017-3-29 19:36 | 只看该作者
感觉这个应用好复杂。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

31

帖子

3

粉丝