ADSP-TS201的计时器
今天继续看ADSP-TS201的文档,看到了Timer这一块,见到如下文字:
The TigerSHARC processor has two general-purpose 64-bit timers——timer0 and timer1.The timers are free running counters that are loaded with an initial value,decrement the value to zero(expiring),give an indication when expiring,automatically reload the value,and continue running.The expiration indicator is normally an interrupt,but also can be an external output pin for timer0.
为了初步了解计时器的使用,我决定写一个小程序。写什么题材呢?通过一个管脚输出信号驱动LED,改变输出信号的占空比来改变LED亮度,这是一个不错的题材。
为TS201写程序之前,我先在AT89S52上实验了一下,用的是Willar ME500b开发板。C51程序如下,由于TS201的文档中说它的timer是自动重装的,所以下面的C51程序也选择了timer0的8位自动重装方式:
- #include <reg51.h>
- typedef unsigned char uchar;
- uchar g_bright=0;//亮度控制
- main()
- {
- TMOD=0x02;
- TH1=0x50;
- TL1=0x50;//设置计数
- EX1=1;//允许外部中断1
- IT1=1;//跳沿触发
- ET0=1;//允许T0中断
- EA=1;//总中断允许
- TR0=1;//启动T0
- P2=0xff;
- P0=0xff;
- while(1);
- }
- void button() interrupt 2
- {
- g_bright=(++g_bright)&0x0f;//调整亮度
- }
- void clock() interrupt 1
- {
- static uchar counter=0;
- counter=(++counter)&0x0f;
- if(counter>g_bright)
- P0=0xff;
- else
- P0=0x00;
- }
复制代码
在开发板中,通过设置跳线,让P0口与LED相连,LED另一端接电源,当P0的管脚输出低电平时,LED发光。程序通过外部中断1来控制LED亮度,而外部中断一的管脚接在了一只按钮上。通过点击按钮改变LED亮度。
效果如下:
在AT89S52上实验成功了,接着为TS201编写程序,程序如下:
- <span style="line-height: 1.5;">#include <builtins.h></span>
- #include <sysreg.h>
- #include <defts201.h>
- <span style="line-height: 1.5;">#define RWRITE(reg,value) __builtin_sysreg_write(reg,value)</span>
- #define RREAD(reg) __builtin_sysreg_read(reg)
- <span style="line-height: 1.5;">typedef unsigned int uint;</span>
- <span style="line-height: 1.5;">void timer0h_isr(void); //计时器中断</span>
- void irq0_isr(void); //IRQ0
- <span style="line-height: 1.5;">uint g_bright=0; //亮度控制</span>
- int main( void )
- {
- int v;
- //将FLAG2设为输出模式
- RWRITE(__FLAGREGST,FLAGREG_FLAG2_EN);
- //设置IRQ0服务程序和计时器中断服务程序
- RWRITE(__IVIRQ0,(int)irq0_isr);
- RWRITE(__IVTIMER0HP,(int)timer0h_isr);
- //设置跳沿触发
- //RWRITE(__INTCTL,0);
- //允许外部IRQ0和计时器
- v=RREAD(__IMASKH);
- v|=((1<<INT_IRQ0_P)|(1<<INT_TIMER0H_P));
- RWRITE(__IMASKH,v);
- //设置计数
- RWRITE(__TMRIN0H,0);
- RWRITE(__TMRIN0L,50000);
- //开全局中断使能
- RWRITE(__SQCTLST,SQCTL_GIE);
- //启动计时器
- RWRITE(__INTCTL,INTCTL_TMR0RN);
- while(1);
- return 0;
- }
- #pragma interrupt
- void timer0h_isr(void)
- {
- static uint counter=0;
- counter++;
- counter&=0x0f;
- if(counter>g_bright)
- RWRITE(__FLAGREGCL,~FLAGREG_FLAG2_OUT);
- else
- RWRITE(__FLAGREGST,FLAGREG_FLAG2_OUT);
- }
- #pragma interrupt
- void irq0_isr(void)
- {
- g_bright++;
- g_bright&=0x0f;
- }
复制代码
和那个AT89S52的C51程序没有什么区别。TS201的板也可用按钮产生外部中断,并且FLAG2有LED相连,通过按钮可以控制LED(右起第二个)亮度,效果如下:
|