本帖最后由 Ryanhsiung 于 2011-10-14 19:06 编辑
关于回调函数,先前不一直看不懂,看了好几个例程,明白一点了。
回调函数实质就是函数指针,指向的是中断执行的具体内容。不过不能直接替换中断函数,而是作为子程序的入口供中断函数调用。
新唐CORTEC-M0 库文件中大量使用回调函数,可以方便做到多任务运行,且封装了底层。
下面是T1的中断程序
void TMR1_IRQHandler(void)
{
int32_t i;
TIMER1->TISR.TIF = 1;
uTimer1Tick++;
if (bIsSetTime1Event) /* Timer Event Handle */
{
for (i=0; i<TIMER_EVENT_COUNT; i++) //这里就可以做到多任务
{
if (tTime1Event[i].active) //任务是否激活
{
tTime1Event[i].curTick--; //计数倒减
if (tTime1Event[i].curTick == 0)
{
(*tTime1Event[i].funPtr)(tTime1Event[i].transParam);//我门只需要设定函数指针即可调用相应函数
tTime1Event[i].curTick = tTime1Event[i].initTick; //重装
}
}}
}
}
对板子的一些建议:
1、文档不全,且有瑕疵,我现在看的文档就看到了3处以上的瑕疵,最好完善一下文档
2、有些库函数还需要改进
例:
DrvGPIO_Open( E_D_GPLED1, D_PIN_LED1, E_IO_OUTPUT );
//全部改成宏定义,方便移植
DrvGPIO_Open( E_D_GPLED2, D_PIN_LED2, E_IO_OUTPUT );
DrvGPIO_Open( E_D_GPLED3, D_PIN_LED3, E_IO_OUTPUT );
DrvGPIO_Open( E_D_GPLED4, D_PIN_LED4, E_IO_OUTPUT );
增加兼容性,若E_D_GPLED1,E_D_GPLED2,E_D_GPLED3,E_D_GPLED4 为同一端口
最好可以这么操作 DrvGPIO_Open( E_D_GPLED1, D_PIN_LED1|D_PIN_LED2|D_PIN_LED3 |D_PIN_LED4 , E_IO_OUTPUT );
3、库函数最好增加一些操作操作的宏定义(开总中断、关总中断、软件复位和喂狗等等)
例: #define ClrWDT()
{ UNLOCKREG(); DrvWDT_Ioctl (E_WDT_IOC_RESET_TIMER,0); LOCKREG();}
问题:
今天用TIMER有一个问题,搞不懂
DrvTIMER_Open(E_TMR0,1000,E_PERIODIC_MODE); // _PERIODIC_MODE 周期 模式
第二个参数为1000(x) 代表1S / 1000 周期,为1/1周期. 变换关系为1s/X
函数内部会将第二个参数给TCMPR ,即 TIMER0->TCMPR =x。
而 定时溢出周期= (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)
问1:应该X越大,周期越长啊?
问2:x 变换关系为什么是1S/X,怎么算出来的??
第二个 MDK 中怎么使用内联函数,要怎么表示??
inline void ClrWDT(void),我这么写不对啊!! |