打印
[技术问答]

新手求助M031关于定时器计数中断问题

[复制链接]
1163|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include <stdio.h>
#include "NuMicro.h"


void TMR0_IRQHandler(void)
{
//  printf("Count 1000 falling events! Test complete !\n");
    TIMER_ClearIntFlag(TIMER0);
}

void SYS_Init(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable HIRC */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Waiting for HIRC clock ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Switch HCLK clock source to HIRC */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

    /* Set both PCLK0 and PCLK1 as HCLK/2 */
    CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2);

    /* Switch UART0 clock source to HIRC */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));

    /* Enable UART peripheral clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Enable IP clock */
    CLK_EnableModuleClock(TMR0_MODULE);

    /* Select IP clock source */
    CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HIRC, 0);

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

    /*----------------------------------------------------------------------*/
    /* Init I/O Multi-function                                              */
    /*----------------------------------------------------------------------*/
    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
                    (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

    /* Set timer event counting pin */
//    SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB5MFP_Msk)) |
//                    (SYS_GPB_MFPL_PB5MFP_TM0);

    /* Lock protected registers */
    SYS_LockReg();
}

/*----------------------------------------------------------------------*/
/* Init UART0                                                           */
/*----------------------------------------------------------------------*/
void UART0_Init(void)
{
    /* Reset UART0 */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 baud rate */
    UART_Open(UART0, 115200);
}

int main(void)
{
    int i;

    /* Init System, IP clock and multi-function I/O. */
    SYS_Init();

    /* Init UART0 for printf */
    UART0_Init();

    printf("\nThis sample code use TM0 (PB.5) to count PB.4 input event\n");
    printf("Please connect PB.5 to PB.4, press any key to continue\n");


//    PB4 = 0;    /* Set init state to high */
//    GPIO_SetMode(PB, BIT4, GPIO_MODE_OUTPUT);
          GPIO_SetMode(PB, BIT14, GPIO_MODE_OUTPUT);

    /* Give a dummy target frequency here. Will over write prescale and compare value with macro */
    TIMER_Open(TIMER0, TIMER_ONESHOT_MODE, 1);

    /* Update prescale and compare value to what we need in event counter mode. */
    TIMER_SET_PRESCALE_VALUE(TIMER0, 0);
    TIMER_SET_CMP_VALUE(TIMER0, 56789);
    /* Counter increase on falling edge */
//    TIMER_EnableEventCounter(TIMER0, TIMER_COUNTER_FALLING_EDGE);
    /* Start Timer 0 */
    TIMER_Start(TIMER0);
    /* Enable timer interrupt */
    TIMER_EnableInt(TIMER0);
    NVIC_EnableIRQ(TMR0_IRQn);     
               
                if(TIMER_GetCounter(TIMER0) == 56789)
                {
                        for(i = 0; i < 10; i++)
                        {
                                PB14 ^= 1;
                        }
                }
    while(1);
               
}
根据例程修改而来,if里面的TIMER_GetCounter(TIMER0) == 56789不对么?完全进不去if中的循环

微信截图_20200508153221.png (105.22 KB )

微信截图_20200508153221.png

使用特权

评论回复
沙发
liuyuncs11|  楼主 | 2020-5-8 15:50 | 只看该作者
例程是外部IO口短接到PB5上触发的计数中断,应该不用外部触发就能实现计数中断吧,请大神们指教一下

使用特权

评论回复
板凳
wanduzi| | 2020-5-8 21:53 | 只看该作者
例子能跑的动吗

使用特权

评论回复
地板
wanduzi| | 2020-5-8 21:55 | 只看该作者
原版的例子。

使用特权

评论回复
5
wanduzi| | 2020-5-8 22:24 | 只看该作者
    TIMER_Open(TIMER1, TIMER_CONTINUOUS_MODE, 1);
模式错误,应该连续计数模式。你搞的一次模式肯定不行。

使用特权

评论回复
6
wanduzi| | 2020-5-8 22:34 | 只看该作者
连续模式

使用特权

评论回复
7
liuyuncs11|  楼主 | 2020-5-9 08:47 | 只看该作者
wanduzi 发表于 2020-5-8 22:24
TIMER_Open(TIMER1, TIMER_CONTINUOUS_MODE, 1);
模式错误,应该连续计数模式。你搞的一次模式肯定不行 ...

例程是PB5与PB4短接,PB4输出一定次数的高低电平转换,然后PB5采集下降沿次数进中断,那个例程可以跑,但是我看手册,单周期模式写的好像应该也可以直接内部计数然后进中断,我再试试连续模式的吧

使用特权

评论回复
8
liuyuncs11|  楼主 | 2020-5-9 10:05 | 只看该作者

连续模式下也不计数进中断,我查看TIF (TIMERx_INTSTS[0])的状态,也没有计数达到设定值后置1

使用特权

评论回复
9
杨光光光,| | 2021-9-7 17:03 | 只看该作者
楼主解决了吗,我现在也是遇到这个问题

使用特权

评论回复
10
jasontu| | 2021-9-7 21:08 | 只看该作者
他的描述有写,timer cnt已经被清了,当然你一直读不到, 要用连续计数模式

使用特权

评论回复
11
杨光光光,| | 2021-9-8 08:48 | 只看该作者
昨天晚上,成功摸索完定时器中断。不容易

使用特权

评论回复
12
杨光光光,| | 2021-9-8 10:22 | 只看该作者
想问一下大佬,库函数对应的寄存器操作怎么移来移去的,看不明白。

使用特权

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

本版积分规则

2

主题

8

帖子

1

粉丝