STM8 TIM2 定时器的问题

                                                             定时50 ms  中断

     所用的芯片为STM8S103F3P6,编译器为IAR  ,程序代码如下:


// #include "iostm8s105c6.h"
#include "iostm8s103F3.h"      // Very importtant 


void DelayMS(unsigned int ms)
{
  unsigned char i;
  while(ms != 0)
  {
    for(i=0;i<250;i++)
    {
    }
    for(i=0;i<75;i++)
    {
    }
    ms--; 
  }    
}
GPIO口初始化
void GPIO_init(void)
{
  PA_DDR = 0x08;  // 配置PD端口的方向寄存器PD0输出
  PA_CR1 = 0x08;  // 设置PD0为推挽输出
  PA_CR2 = 0x00;
  PC_DDR = 0x18;  // 配置PD端口的方向寄存器PD0输出
  PC_CR1 = 0x18;  // 设置PD0为推挽输出
  PC_CR2 = 0x00;
}


void ADC_init(void)
{
  CLK_PCKENR2 =0x08;           // Enable the f(MASTER) Clock to ADC;
  ADC_CR1 = 0x40;             // ADC Clock: SPSEL[2:0]=100; fADC = f(MASTER)/8=1M; Single conversion mode ; ADON=0;
  ADC_CR2 = 0x20;             // Data Left alignment ;Scan mode disabled
  
  ADC_CSR = 0x03;             // Select Channel AIN3; EOC interrupt disabled  ; (ECO:End of conversion)
  ADC_TDRL = 0x03;            // Channel AIN3 Schmitt trigger disabled
}


void TIM2_init(void)
{
    CLK_PCKENR1=0x20;           //  Enable the f(MASTER) Clock to Time2;  
    TIM2_PSCR  =0x03;          //  Time2 Clock Frequency:1M ;  prescaler :8; Fck_psc/ 2^(PSC[3:0]); 0011; //Fck_psc=f(MASTER)=8M;
    TIM2_EGR = 0x01;           // Re-initializes the counter and generates an update of the registers
    TIM2_CNTRH = 0x0;          // Counter Starting Value;
    TIM2_CNTRL = 0x0;            
  
   TIM2_ARRH = 0xC3;          // TIM2_ARRH  Must be Loaded Value First ,then to TIM2_ARRL; Auto-reload// register high (TIMx_ARRH);
   TIM2_ARRL = 0x50;         //  0xC350 = 50000 ;Time = 1us x 50000 = 50 ms;
   
   TIM2_IER   =0x01;          //  Time2 Update interrupt Enabled;
  
   TIM2_CR1  =0x01;         // Counter enable;
}


void CLK_init(void)

{
  
  CLK_SWR = 0xE1;               //  0xE1: HSI selected as master clock source ; f(HSI)RC =16M ;
  CLK_CKDIVR = 0x09;           //  f(HSI)RC =16M ; f(HSI)=[f(HSI)RC]/2 = 8M = f(MASTER) ; f(CPU)=f(MASTER)/2= 4M ;
  
}


int i=0;
unsigned int ADdata;
unsigned int ADlow;


main()
{
  
  GPIO_init();
  CLK_init();
  TIM2_init();
  ADC_init();
  
  asm("rim");           //Enable Global interrupt;
  
  while(1)                                       
  {
 
       PC_ODR = 0x00;
       
       
    // PA_ODR = 0x00;
       PA_ODR = 0x08;
      // DelayMS(100);   
    
    if(i%20==0)
    {
      //PC_ODR = 0x00;
      //PA_ODR = 0x08;
      //DelayMS(200);
      PA_ODR = 0x00;
      DelayMS(50);
        // i=0;
        //PC_ODR = 0x08;
       // DelayMS(100);
       // PC_ODR = 0x10;
       // DelayMS(100);
    }
    
    
    if(i==40)
    {
      
     //  ADC_CR1 |=0x01;   //启动转换
       //while((ADC_CSR&0x80) == 0); // 等待ADC结束
       
      //PC_ODR = 0x00;
        PA_ODR = 0x00;
        DelayMS(300);
     // PA_ODR = 0x08;
      //DelayMS(100);
        i=0;
        PC_ODR = 0x08;
         DelayMS(30);
     // PC_ODR = 0x10;
     // DelayMS(30);
    }
    
    
    //for(i=0;i<10;i++)
    //{
      //PC_ODR = 0x08;
     // DelayMS(30);
     /// PC_ODR = 0x10;
    //  DelayMS(30);
    //}
  }
}


#pragma vector=TIM2_OVR_UIF_vector

 __interrupt void TIM2_OVR_UIF(void)
   
{
    TIM2_SR1 = 0x00;          //     Clear  UIF: Update interrupt flag
    i++;
   if(i>200)  i=0;
}


上述代码为仍在调试的代码,定时器可以正常工作了,AD还在调试。现对定时器调试关键点说明如下:


1。头文件.// #include "iostm8s105c6.h" 要改为      #include "iostm8s103F3.h"      // Very importtant 

2。STM8S .h 文件中的#define STM8S105     注释掉,将#define STM8S103  定义,去掉注释。 






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值