我是一个新的ARM编程.I使用72 MCU时钟的K20 MK20DX256单片机,每1秒切换一次发光二极管与定期中断定时器0。代码编译良好,但发光二极管不切换.I发现配置计时器和发光二极管一起不能工作,而发光二极管单独工作,我在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
}
}
}
}有人能帮我找出这段代码的问题所在吗?我发现在调试enter image description here的过程中,没有一个寄存器改变它们的值
发布于 2021-01-13 21:59:26
有几个选择。
首先,您正在从PIT请求中断,但尚未安装中断处理程序。您确定Keil安装的默认中断处理程序没有副作用,例如停止或重新启动吗?
PIT->CHANNEL[0].TCTRL=0x3;其次,也是更重要的是,您正在尝试通过向其写入0来清除计时器中断标志。数据手册上说你需要写一个1:
PIT->CHANNEL[0].TFLG =0;其结果是,在第一次中断触发后,标志将永远保持不变,您将通过向其中写入13888来永远重新启动PIT。它再也没有机会倒计时了。
https://stackoverflow.com/questions/65702846
复制相似问题