×
嵌入式 > 技术百科 > 详情

STM8 TIM2 定时器的问题

发布时间:2020-12-15 发布时间:
|

所用的芯片为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  定义,去掉注释。 




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
馈通滤波器的运用指南