0

我是 ARM 编程新手。我正在使用具有 72MHz 时钟的 K20 MK20DX256 MCU 使用周期性中断定时器 0 每 1 秒切换一次 LED。代码编译正常,但 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  
                
            }
        }
    
    }


}

谁能帮我找出这段代码有什么问题?我发现在调试过程中没有一个寄存器改变它们的值 在 此处输入图像描述

4

1 回答 1

1

几个选项。

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

PIT->CHANNEL[0].TCTRL=0x3;

其次,更重要的是,您正试图通过向其写入 0 来清除定时器中断标志。数据表说你需要写一个 1 代替:

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

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

于 2021-01-13T13:59:25.637 回答