中级会员
- 积分
- 302
- 威望
- 223
- 贡献
- 31
- 兑换币
- 10
- 注册时间
- 2009-2-13
- 在线时间
- 24 小时
|
1贡献
本帖最后由 hellozj 于 2009-4-3 19:27 编辑
- ///////////////////////////////////////////////////////////////////
- //TCNT标准计时器 周期1s
- //2009-4-02 chowjun
- ///////////////////////////////////////////////////////////////////
- #include <hidef.h> /* common defines and macros */
- #include <mc9s12dg128.h> /* derivative information */
- #pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
- int count=0;
- void Start_PLL(void) //busCLK=16M
- {
- REFDV=0x01; // PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
- SYNR=0x01; // =2*16M*2/2=32M
- asm{
- BRCLR CRGFLG,#$08,*
- BSET CLKSEL,#$80
- }
- }
- /*************************************************
- 定时器初始化程序
- *************************************************/
- void Timer_init(void)
- {
- TSCR2_PR=0x04; // 预分频系数为4 16M/16 = 1M
- //TSCR1_TFFCA=1; // 快速清除标志位
- TSCR2_TOI=1; // TOF置1时申请硬件中断
- //(1/1M)=1um 机器周期
- TCNT=0xffff-0x2710; // 设置定时计数器初值 2710H = 10000
- TSCR1_TEN=1; // 禁止定时器
- //0.01s
- }
- /************************************************
- 主程序main
- ************************************************/
- void main(void)
- {
- DisableInterrupts;
- Start_PLL();
- Timer_init();
- DDRB=0xff; //OUT
- PORTB=0xaa;
- for(;;)
- {
- EnableInterrupts;
- }
- }
- /*************************************************
- 定时器溢出中断程序
- *************************************************/
- #pragma CODE_SEG __NEAR_SEG NON_BANKED
- interrupt 16 void TimerOverflow_ISR(void)
- {
- DisableInterrupts;
- TCNT=0xffff-0x2710; // 重新载入定时计数器初值
- count++;
- if(count == 50) {
- PORTB = ~PORTB;
- count=0;
- }
- TFLG2_TOF=1; // 写1清标志位
- }
- #pragma CODE_SEG DEFAULT
复制代码 这个程序bdm烧录后运行正常,但是我重启一次定时就明显延长了,用TBDML软件复位再运行又恢复正常,非常奇怪?希望有人解答下 |
|