打印

M051学习简记--定时器(发动大家写笔记)

[复制链接]
8331|63
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyang86|  楼主 | 2010-11-15 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhangyang86 于 2010-11-17 10:55 编辑

新唐M051的库函数呢,说实在的,看了看,还凑合着用吧!
如果开发过程中遇到库函数不够用的情况,建议适当的寄存器操作和库函数操作并行,可以提高运行效率!!
学习讨论群:84926407, 欢迎大家一起交流学习!
今天看了看DrvTimer库函数,觉得奇怪,定时器怎么没有初始值设置的函数呢,再仔细看了看,原来是这样的!记录下
   
#include <stdio.h>
#include "Driver/DrvTIMER.h"
#include "Driver/DrvGPIO.h"
#include "Driver/DrvSYS.h"
void TMR0_CallbackFunction(uint32_t u32Param)
{
   DrvGPIO_ClrBit(E_PORT3,E_PIN6);
   DrvSYS_Delay(300000);
   DrvGPIO_SetBit(E_PORT3,E_PIN6);

}

int main (void)      //main
{
     UNLOCKREG();         /
    SYSCLK->;PWRCON.XTL12M_EN = 1;
    DrvSYS_SelectHCLKSource (7);
    DrvSYS_Delay(5000);
     DrvGPIO_Open(E_PORT3,E_PIN6,E_IO_OUTPUT);
     DrvGPIO_ClrBit(E_PORT3,E_PIN6);
     DrvSYS_Delay(600000);
     DrvGPIO_SetBit(E_PORT3,E_PIN6);
     DrvSYS_Delay(600000);
    DrvTIMER_Init();
    DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0);//时钟源选择!
  
            /*定时中断* E_TMR0*/
                DrvTIMER_Open(E_TMR0, 100, E_PERIODIC_MODE);   
                DrvTIMER_SetTimerEvent(E_TMR0, 300, (TIMER_CALLBACK)TMR0_CallbackFunction, 1);
                DrvTIMER_EnableInt(E_TMR0);   
               DrvTIMER_Start(E_TMR0);//
               while(1);
}


说明:
此程序代表定时器0工作在Periodic模式下,并且是每 300/100=3s执行一次中断函数,
DrvTIMER_Open(E_TMR0, 100, E_PERIODIC_MODE);    是指设置Timer0为1s一百次中断Ticks,
  DrvTIMER_SetTimerEvent(E_TMR0, 300, (TIMER_CALLBACK)TMR0_CallbackFunction, 1); 是指设置每300个中断ticks执行一次中断响应函数

所以中断函数执行周期为 300/100=3s
设置中断应该按如下步骤:
1.DrvTIMER_Init(); 这个函数是必须调用的;只要用到timer
2.
    DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0);
// TMR0的时钟源选择:CLKSEL1来设置:000 =外部12MHz 晶振,010 = HCLK,011 = 外部触发时钟,1xx =内部22.1184MHz 振荡器
3.

DrvTIMER_Open(E_TMR0, 100, E_PERIODIC_MODE);   
DrvTIMER_SetTimerEvent(E_TMR0, 300, (TIMER_CALLBACK)TMR0_CallbackFunction, 1);
这两个方法配合使用,设置定时器的工作模式,初值,以及中断响应函数
4.
DrvTIMER_EnableInt(E_TMR0);     使能中断
5.DrvTIMER_Start(E_TMR0); 开启定时器

6.必要的时候关闭中断:
  DrvTIMER_Close(E_TMR0);关闭定时器;




这里还有必要提到几个比较重要的库函数:
1) DrvTIMER_Delay(E_TMR1, 1000);利用定时器来实现中断,
注意这里的1000既不是us,也不是ms,二是1000ticks,
也就是说,如果你设置了DrvTIMER_Open(E_TMR0, 100, E_PERIODIC_MODE);    是指设置Timer0为1s一百次中断Ticks, ,
那么1000就代表10s,
2) DrvTIMER_GetIntTicks(E_TMRX);获取此时TIMERX已经运行了多少个Ticks,这个不难理解,当你开启定时器之后,比如如上面设置1秒 100个ticks,那么如果跑了100ms,那么这个值应该就是约为10了


至于这些函数的使用,可以参考库函数手册!!

如有描述或理解错误,请指点!!谢谢!!



关于M051定时器的使用,大家还有什么好的知识,欢迎回帖跟大家分享,谢谢!


做个记号!

相关帖子

沙发
hotpower| | 2010-11-15 11:50 | 只看该作者
学习了,不过回调函数内最好快离开…

使用特权

评论回复
板凳
zhangyang86|  楼主 | 2010-11-15 12:03 | 只看该作者
是的!这个说得对!
我这里只是简单的测试,
3秒中断,回调函数300ms演示!

使用特权

评论回复
地板
hsbjb| | 2010-11-15 16:57 | 只看该作者
不错的学习心得,学习了

使用特权

评论回复
5
sinadz| | 2010-11-15 22:12 | 只看该作者
有好多库函数都没太看明白

使用特权

评论回复
6
zhangyang86|  楼主 | 2010-11-15 23:04 | 只看该作者
呵呵!一起学习! 我看过的稍微困难一点的我都会发学习笔记,大家一起进步!

使用特权

评论回复
7
gxgclg| | 2010-11-16 14:28 | 只看该作者
期待着楼主的学习笔记,的确有好多地方都不明白:lol

使用特权

评论回复
8
hotpower| | 2010-11-16 15:17 | 只看该作者

使用特权

评论回复
9
zhangyang86|  楼主 | 2010-11-16 21:17 | 只看该作者
学习过了的朋友帮忙指正啊

使用特权

评论回复
10
baidudz| | 2010-11-16 21:55 | 只看该作者
和楼主一同学习进步:lol

使用特权

评论回复
11
思行合一| | 2010-11-16 23:33 | 只看该作者
跟着楼主一起进步

使用特权

评论回复
12
zhangyang86|  楼主 | 2010-11-17 10:29 | 只看该作者
:)

使用特权

评论回复
13
火箭球迷| | 2010-11-17 22:29 | 只看该作者
被楼主这么一发动,我都有写笔记的冲动:lol

使用特权

评论回复
14
zhangyang86|  楼主 | 2010-11-17 23:45 | 只看该作者
写点啊,记可以跟大家分享,一起进步,也可以以后自己忘记了看看,备忘!呵呵!

使用特权

评论回复
15
123jj| | 2010-11-18 04:49 | 只看该作者
跟着楼主一起进步

使用特权

评论回复
16
pkat| | 2010-11-18 15:24 | 只看该作者
好贴,心得写的不错

使用特权

评论回复
17
yybj| | 2010-11-18 22:10 | 只看该作者
心得写的不错,寄存器操作和库函数操作并行,如何操作,给点建议

使用特权

评论回复
18
zhangyang86|  楼主 | 2010-11-18 23:43 | 只看该作者
只需要把宏定义的文件copy进去你用库函数操作的工程中就没问题了!
我测试过IO的,没有问题!

使用特权

评论回复
19
秋天落叶| | 2010-11-19 15:02 | 只看该作者
楼主的笔记写的很好,学习一下

使用特权

评论回复
20
zhangyang86|  楼主 | 2010-11-22 13:06 | 只看该作者
19# 秋天落叶

大家一起写啊!互相学习,共同进步!

使用特权

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

本版积分规则

80

主题

916

帖子

51

粉丝