打印

定时器在查寻的模式下装载不进去初值

[复制链接]
1800|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
6019实验室|  楼主 | 2010-3-12 21:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我最近在用到timer0的时候用查寻的方法做延时,但是,就是装载不进去定时器的初始值,而在用到中断方式的时候就可以把初始值装载到定时器里面,我的定时器的初始化和中断的是一样的,现在不明白什么原因导致的,请高人指点:
#define TIMER0_BASE             0x40030000  // Timer0
#define TIMER_MIS_TATOMIS       0x00000001  // 该位表示屏蔽之后定时器A的超时中断状态
#define TIMER_O_ICR             0x00000024  // Interrupt clear register
#define TIMER_ICR_TATOCINT      0x00000001  // TimerA time out interrupt clear
#define TIMER_O_CTL             0x0000000C  // Control register
#define TIMER_O_CFG             0x00000000  // GPTM配置寄存器
#define TIMER_CTL_TAEN          0x00000001  // TimerA enable     

#define TIMER_O_IMR             0x00000018  // Interrupt mask register
#define TIMER_INT_DATA          6000000     // TimerA定时初始值
#define TIMER_O_TAILR           0x00000028  // TimerA 间隔装载复位值
#define TIMER_RIS_TATORIS       0x00000001  // TimerA time out raw int status

#define TIMER_O_TAMR            0x00000004  // TimerA mode register
#define PINS2  GPIO_PIN_4
//  定义全局的系统时钟变量

void delay(unsigned long d)
{
  for(;d;d--);
}


//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
void main(void)
{
   SysCtlClockSet( SYSCTL_SYSDIV_1 | // 设定晶振为时钟源。
                    SYSCTL_USE_OSC  |
                    SYSCTL_OSC_MAIN |
                    SYSCTL_XTAL_6MHZ );   
   
   
    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );           // 使能GPIO B口外设。
    GPIODirModeSet(GPIO_PORTB_BASE,PINS2,GPIO_DIR_MODE_OUT); // 设置 B5为输出口。
    GPIOPinWrite( GPIO_PORTB_BASE, PINS2, 0 );               // 初始化IO口。

   SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 );          // 使能定时器0外设
   HWREG(TIMER0_BASE + TIMER_O_CTL) &= (~TIMER_CTL_TAEN);   //关闭定时器
   TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_OS);        // 设置定时器0为周期触发模式。
   TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet()); // 设置定时器装载值。定时0.5秒。
   HWREG(TIMER0_BASE + TIMER_O_IMR)   &=0x00;

   HWREG(TIMER0_BASE + TIMER_O_CTL) |= TIMER_CTL_TAEN;     //打开定时器
   
   while(1)
   {  
      

       while(  HWREG(TIMER0_BASE + TIMER_RIS_TATORIS)==0);
       HWREG(TIMER0_BASE + TIMER_O_ICR) |=TIMER_ICR_TATOCINT;   //溢出中断清零
            GPIOPinWrite(GPIO_PORTB_BASE, PINS2,GPIOPinRead GPIO_PORTB_BASE, PINS2) ^ PINS2);

   }
   
}





这个TimerLoadSet函数就是装载不了值,切盼指教!!!!!!!!

相关帖子

沙发
yoyowodeai| | 2010-3-12 21:40 | 只看该作者
不是吧,还在用寄存器模式来编程?

详见这里的基于驱动库的例程:http://www.zlgmcu.com/luminary/exploitation_guide.asp

使用特权

评论回复
板凳
linux1| | 2010-3-12 21:41 | 只看该作者
我现在是想在屏蔽中断的情况下,利用查寻中断标志寄存器TATORIS来进行定时,即:
while(HWREG(TIMER0_BASE+TIMER_RIS_TATORIS)==0); // 如果是超时中断

HWREG(TIMER0_BASE + TIMER_O_ICR) |=TIMER_ICR_TATOCINT;   //溢出中断清零

   

    然后我要处理别的任务,而不是用中断的方式处理,所以就必须对寄存器直接操作,但是,现在就是初始化定时器值的时候初始值加载不进行去,上面你给的网址上的例程我已经看过,全是用中断的方式做的,我也明白,现在我是想用查寻中断标志的方法做,还请版主给点建议!!!!

使用特权

评论回复
地板
北京户口| | 2010-3-12 21:59 | 只看该作者
即便是非中断的轮询编程模式,也要利用相关的中断库函数来做。因为寄存器方式容易出错,也不便同别人交流。

{

    unsigned long ulStatus;

    for (;;)

    {

        ulStatus = TimerIntStatus(TIMER0_BASE, true);           //  获取当前中断状态

        if (ulStatus) break;

    }
    TimerIntClear(TIMER0_BASE, ulStatus);                   //  清除全部中断状态

}

使用特权

评论回复
5
6019赵文| | 2010-3-12 22:00 | 只看该作者
现在问题已经解决,咋们这个论坛就是比别的论坛好,有问题就有人帮助,再次感谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

121

主题

470

帖子

0

粉丝