LM3S TIMER问题

2019-03-24 13:18发布

小弟调试的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;
    }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
电子猫
2019-03-25 12:23
大哥你实在太NX了,我也是一直不行,按照你的建议改了一下果然可以。太感谢了!!!

一周热门 更多>

相关问题

    相关文章