Timer 如何使用周期性中断定时器切换LED?

Timer 如何使用周期性中断定时器切换LED?,timer,arm,toggle,led,mcu,Timer,Arm,Toggle,Led,Mcu,我是ARM编程新手。我使用K20 MK20DX256 MCU和72MHz时钟每1秒切换一个LED,并使用周期性中断计时器0。代码编译得很好,但LED不切换。我发现将计时器与LED一起配置不起作用,而单独使用LED则起作用 我在keil Uvision中编写了以下代码 #include "MK20D7.h" #include <stdio.h> int main(void) { SystemInit(); NVIC_EnableIRQ(PIT0_

我是ARM编程新手。我使用K20 MK20DX256 MCU和72MHz时钟每1秒切换一个LED,并使用周期性中断计时器0。代码编译得很好,但LED不切换。我发现将计时器与LED一起配置不起作用,而单独使用LED则起作用 我在keil Uvision中编写了以下代码


#include "MK20D7.h"
#include <stdio.h>

int main(void)
{
    SystemInit();
    NVIC_EnableIRQ(PIT0_IRQn);                      //Enable Timer Interrupts
    //Configuring Timer 1
    PIT->MCR=0x00;                              
     
    PIT->CHANNEL[0].LDVAL=13888;
    
    PIT->CHANNEL[0].TCTRL=0x3;
    
    //Configure LED
    SIM->SCGC5   = (1UL << 11);        /* Enable Clock to Port C */     
    PORTC->PCR[5] = (1UL <<  8);        /* Pin is GPIO */
    PTC->PDDR = (1u<<5);
    PTC->PSOR = (1u<<5); //Set PTC5 = 1, turns LED on           
    while(1){
        
        if(PIT->CHANNEL[0].TFLG ==1)
        {
        
        PIT->CHANNEL[0].TFLG =0;
        PIT->CHANNEL[0].LDVAL=13888;    
            if(PTC->PSOR!=(1u<<5))
            {
                
                PTC->PSOR = (1u<<5); //Set PTC5 = 1, turns LED on           
            }
            else
            {
                PTC->PCOR = (1u<<5); //Set PTC5 = 1, turns LED off  
                
            }
        }
    
    }


}

#包括“MK20D7.h”
#包括
内部主(空)
{
SystemInit();
NVIC_EnableIRQ(PIT0_IRQn);//启用计时器中断
//配置计时器1
PIT->MCR=0x00;
坑->通道[0]。LDVAL=13888;
PIT->通道[0]。TCTRL=0x3;
//配置LED
SIM->SCGC5=(1UL PCR[5]=(1UL PDDR=(1U通道[0]。LDVAL=13888;
如果(PTC->PSOR!=(1u几个选项

首先,您正在从PIT请求中断,但尚未安装中断处理程序。您确定Keil安装的默认中断处理程序没有副作用,例如停止或重新启动吗

PIT->CHANNEL[0].TCTRL=0x3;
其次,也是更重要的一点,您正试图通过向计时器中断标志写入0来清除计时器中断标志。数据表上说您需要写入1:

PIT->CHANNEL[0].TFLG =0;

结果将是,在第一次中断触发后,该标志将永远保持为高,并且您将通过向其中写入13888来永远重新启动PIT。它再也没有机会倒计时了。

没有像MK20D6256这样的部件。也许您是指MK20DX256?对不起,是的,您是对的,我是新中断的。您能详细说明一下吗要安装处理程序?对不起,不知道Keil是怎么做的。更重要的是,你实际上没有使用中断,所以最好完全禁用它们。我使用的是定时器中断,它在超时时设置标志,并根据这个设置切换led。你怎么说?@huzi你当然可以轮询中断状态,而实际上没有一个handl呃,但您不需要启用内核中断。修复此答案中所述的项目,去掉nvic内容,然后从那里开始。中断处理程序是一个高级主题,您需要首先处理基础知识。
nvic_EnableIRQ(PIT0_IRQn);//Enable Timer Interrupts
是一行,您请求从PIT0启用中断。在
PIT->CHANNEL[0]中,TCTRL=0x3;
您告诉PIT发出中断(这两位中的一位,我忘了是哪一位)。有关详细信息,请参阅此micro的参考手册。