码迷,mamicode.com
首页 > 其他好文 > 详细

单片机TM4C123学习(四):频率计

时间:2015-10-27 00:18:34      阅读:448      评论:0      收藏:0      [点我收藏+]

标签:

1.#define的使用

#define SQUARE_DUTY 0.5

2.FPU的开启:浮点运算

FPUEnable();
FPULazyStackingEnable();

3.定时器初始化

    //
    // Timer init
    //        
      SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);   //使能外设
      TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);//周期计时模式

两个步骤:外部设备使能,设置定时器的类型

4.定时周期设置

    //
    // Timer delay period 
    //    
      ui32Period = (SysCtlClockGet()/4/83000);                //设置计数上限,这里的设置可以产生83kHz的信号
      TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period -1);      //设置计数范围

这里因为占空比是25%,所以/4,如果占空比是50%,那么/2。

SysCtlClockGet()获得的是系统的频率,也就是40*1000*1000,一个定时周期中灯只能选择暗或者亮,持续时间为1s,所以一暗一亮构成一个周期2s,f=0.5。
SysCtlClockGet()*f=20M,用20M/想要获得的频率,就是ui32Period的值。

5.定时器中断设置
//
// interrupt enable--timer0A
//
   IntEnable(INT_TIMER0A);                            //在系统层使能定时器中断
   TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);   //允许处理某个定时器的中断请求
IntMasterEnable();   //使能系统总中断开关
TimerIntRegister(TIMER0_BASE, TIMER_BOTH, Timer0IntHandler); //注册中断处理函数
void Timer0IntHandler(void)
{
    // 清除定时器中断标志位
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
if(k==0)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 1<<4);
}
else
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 0<<4);
}
k++;
if(k==4)
{
    k=0;
}
}

6.开启定时器

    //
    // timer0 enable--This will start the timer and interrupts
    //        
        TimerEnable(TIMER0_BASE, TIMER_A);

 7.不知道为什么需要这个,是为了提高精度?

// 建立并使能系统滴答定时器,作为延时循环的时钟参考(1s)(秒级延时不准确)
ROM_SysTickPeriodSet(ROM_SysCtlClockGet()); //设置SysTick计数器的周期值
ROM_SysTickEnable(); //使能SysTick计数器,开始倒计数

8.




单片机TM4C123学习(四):频率计

标签:

原文地址:http://www.cnblogs.com/pursuit1996/p/4912869.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!