OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16808|回复: 5

M051学习笔记--定时器

[复制链接]

98

主题

408

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2010-12-14
在线时间
0 小时
发表于 2010-12-16 00:37:00 | 显示全部楼层 |阅读模式
新唐M051的库函数呢,说实在的,看了看,还凑合着用吧!
如果开发过程中遇到库函数不够用的情况,建议适当的寄存器操作和库函数操作并行,可以提高运行效率!!
今天看了看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->WRCON.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定时器的使用,大家还有什么好的知识,欢迎回帖跟大家分享,谢谢!
希望openedv能给大家提供一个友好的技术交流平台!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2010-12-16 01:05:47 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2010-12-16
在线时间
0 小时
发表于 2010-12-16 08:45:10 | 显示全部楼层
回复【楼主位】 张洋 : ------------------------------- 学习了
回复 支持 反对

使用道具 举报

98

主题

408

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2010-12-14
在线时间
0 小时
 楼主| 发表于 2010-12-16 10:11:42 | 显示全部楼层
我这里只是简单的测试,一般中断后尽快采取方法离开!
希望openedv能给大家提供一个友好的技术交流平台!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2013-2-23
在线时间
0 小时
发表于 2013-2-23 16:37:40 | 显示全部楼层
新唐Mini51系列以ARM Cortex-M0为核心,主频高达24MHz (21.6 DMIPS)的性能,内建32位乘法器、巢状中断控制结构NVIC;闪存内建4K~16K Bytes、2K Bytes SRAM,可规划式DataFlash,整合高速通讯外设: SPI (24MHz), I2C (1M), UART (16-FIFO, 1M) ;模拟周边部份,提供8信道10位模拟数字转换器ADC、2通道比较器、内置POR/BOD复位电路: 快速/慢速上电,电源跌落/插拔复位侦测功能。此外,Mini51系列尚有6信道脉宽调变PWM带死区控制、中心对齐功能、2组32位时钟Timer、内部10K RC驱动高可靠度看门狗、高精度RC震荡器、内建频率自动更正电路,可由外部32.768 KHz 全温全压范围自动更正精准度±1%以内。
联系人:唐孙林  13410362373 0755-61392396-809 QQ851822381 tangsunlin@163.com
回复 支持 反对

使用道具 举报

15

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-11-30
在线时间
42 小时
发表于 2017-3-27 21:18:08 | 显示全部楼层
求楼主分享一下“M051库函数参考手册”,不胜感激。1064148929@qq.COM
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-22 22:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表