|
新唐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();
// TMR0的时钟源选择:CLKSEL1来设置:000 =外部12MHz 晶振,010 = HCLK,011 = 外部触发时钟,1xx =内部22.1184MHz 振荡器
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);//时钟源选择;
//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); 开启Timer0
6.必要的时候关闭中断:
DrvTIMER_Close(E_TMR0);关闭Timer0;
这里在中断里面延时300ms,只是做为演示之用,至于项目中,一般在中断回调函数中不要这样做!
如有描述或理解错误,请指点!!谢谢!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|