小弟调试的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;
}
}
此帖出自
小平头技术问答
一周热门 更多>