小弟调试的LM3S9系列 定时器时 32位的RTC模式,16位的边沿计数捕获 边沿定时捕获都不能进中断 但是32位的单次触发 周期定时 和16位的单次触发 周期定时都没问题! 而且我发现出现问题的程序都用到了pulseInit(void)函数产生PWM方波!不知是不是这里的问题? 我用的是周立功的程序 它上面写的是6MHZ晶振 但我用的是16MHZ的,
下面附上其中一个问题程序 请高手们帮忙找找问题在哪里?
16位边沿计数捕获:
#include<lm3sxxx.h> #include<stdio.h> #include<ctype.h>
#include "systemInit.c"
unsigned long flag; unsigned char ucVal;
// 在CCP1管脚产生10KHz方波,为Timer2的16位输入边沿计数捕获功能提供时钟源 void pulseInit(void) { SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // 使能TIMER0模块 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); // 使能CCP1所在的GPIO端口 GPIOPinTypeTimer(GPIO_PORTE_BASE, GPIO_PIN_3); // 配置相关管脚为Timer功能
TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM TIMER_CFG_B_PWM);
TimerLoadSet(TIMER0_BASE, TIMER_B, 600); // 设置TimerB初值 TimerMatchSet(TIMER0_BASE, TIMER_B, 300); // 设置TimerB匹配值 TimerEnable(TIMER0_BASE, TIMER_B);
}
// 定时器16位输入边沿计数捕获功能初始化 void timerInitCapCount(void) { SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2); // 使能Timer模块 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); // 使能CCP4所在的GPIO端口 GPIOPinTypeTimer(GPIO_PORTE_BASE, GPIO_PIN_2); // 配置CCP4管脚为脉冲输入
TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR | // 配置Timer为16位事件计数器 TIMER_CFG_A_CAP_COUNT);
TimerControlEvent(TIMER2_BASE, // 控制TimerA捕获CCP负边沿 TIMER_A, TIMER_EVENT_NEG_EDGE);
TimerLoadSet(TIMER2_BASE, TIMER_A, 40000); // 设置计数器初值 TimerMatchSet(TIMER2_BASE, TIMER_A, 35000); // 设置事件计数匹配值
TimerIntEnable(TIMER2_BASE, TIMER_CAPA_MATCH); // 使能TimerA捕获匹配中断 IntEnable(INT_TIMER2A); // 使能Timer中断 IntMasterEnable(); // 使能处理器中断
TimerEnable(TIMER2_BASE, TIMER_A); // 使能Timer计数
}
// 主函数(程序入口) int main(void) { jtagWait(); clockInit(); // 时钟初始化:晶振,16MHz
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // 使能LED所在的GPIO端口 GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0); // 设置LED所在管脚为输出 GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0XFF); pulseInit(); timerInitCapCount(); // Timer初始化:16位计数捕获
for (;;) { if(flag==1) { flag=0; } } }
// Timer2的中断服务函数 void Timer2A_ISR(void) { unsigned long ulStatus; ulStatus = TimerIntStatus(TIMER2_BASE, true); // 读取当前中断状态 TimerIntClear(TIMER2_BASE, ulStatus); // 清除中断状态,重要!
if (ulStatus & TIMER_CAPA_MATCH) // 若是TimerA捕获匹配中断 { //TimerA已停止,重新使能 TimerLoadSet(TIMER2_BASE, TIMER_A, 40000); // 重新设置计数器初值 TimerEnable(TIMER2_BASE, TIMER_A); ucVal = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_0); // 反转LED GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, ~ucVal); flag=1; } }
|