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

STM8S0 定时器2中断配置

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

目录:

1.程序:定时器2中断配置、高精度延时函数和LED灯初始化

2.基础知识:


一、程序:

#include

#include "timer.h"

#include "led.h"

//unsigned int ms_count=0;//毫秒计数

//定时器2初始化

void InitTIM2()

{

  TIM2_PSCR=0x00;//1分频,定时器时钟等于系统时钟=16m

  TIM2_ARRH=0X3e;//一定要先装高八位,再装低八位

  TIM2_ARRL=0X80;//1ms重装值16000,这是个坑,技术手册里说tim2是向上计数,其实是向下计数的

  TIM2_CNTRH=0x00;

  TIM2_CNTRL=0x00;//有必要清除下计数器

  TIM2_IER=0X01;//使能tim2更新中断

  TIM2_SR1=0X01;//清除tim2更新中断标志

  TIM2_CR1=0X81;//允许重装,使能定时器

}


#pragma vector=0xF //设置定时器2重载的中断向量号 = 0xF,这个是中断的格式,直接调用就好

__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)

{

   TIM2_SR1=0x00;

   ms_count++;

  if(ms_count>=1|ms_count<=600)

  {

    PB4_out = 0;    /* PD0引脚输出0 */

    PB5_out = 1;

  }

  if(ms_count>=600)//1ms*1000=1s

  {

    PB4_out = 1;  /* PD0引脚输出0 */

    PB5_out = 0;

  }

  if(ms_count>=1200)

  {ms_count=0;}

}


int main(void)

{

  CLK_CKDIVR=0x00;/*设置时钟为内部16M高速时钟*/

  asm("sim");//关闭总中断

  InitTIM2();//定时器2初始化

  LED_conf();//LED初始化

  asm("rim");//开启总中断

  __enable_interrupt();

  while(1)

  {

//  LED_Display_Bit();

  }

}

/*LED灯初始化*/

void LED_conf(void)

{ //PB5、PB4

  PB_DDR|=0x30;   /* 设置数据方向寄存器 1为输出,0为输入--查看STM8寄存器.pdf P87 */

  PB_CR1|=0x30;   /* 设置推挽输出--查看STM8寄存器.pdf P88 */

  PB_CR2|=0x00;   /* 设置输出频率 1为10M,0为2M--查看STM8寄存器.pdf P89 */  

}

void LED_Display_Bit()

{

  PB4_out = 0;    /* PD0引脚输出0 */

  PB5_out = 1;

  Delayms(500);

  PB4_out = 1;    /* PD0引脚输出1 */

  PB5_out = 0;

  Delayms(500);

}


/*延时函数 */

#include

#include "timer.h"

void ClkInit(void)   

{

    CLK_ECKR |=0x1;         //开启外部时钟    

    while(!(CLK_ECKR&0x2)); //等待外部时钟rdy    

    CLK_CKDIVR &= 0xF8;     //CPU无分频 16M   

    CLK_SWR = 0xB4;         //选择外部时钟    

    while(!(CLK_SWCR&0x8));   

    CLK_SWCR |=0x2;         //使能外部时钟    

}   

//---  微秒级延时--------------------------

void Delayus(void)

{

    asm("nop"); //一个asm("nop")函数经过示波器测试代表100ns   

    asm("nop");   

    asm("nop");   

    asm("nop");    

}

//---- 毫秒级延时程序-----------------------   

void Delayms(unsigned int time)   

{   

    unsigned int i;

    while(time--)     

    for(i=900;i>0;i--)   

    Delayus();    

}


二、基础知识:

1.定时器2介绍:

通用定时器TIM2,TIM3,TIM5 ;通用定时器可以选择16种分频,定时器都是向下计数。


2.基本中断定时用到的寄存器如下;

(1)、自动装载寄存器高位(TIMx_ARRH) 和 自动装载寄存器低位(TIMx_ARRL) 

通用定时器TIM2,TIM3,TIM5都是16位计数的定时器,操作寄存器的时候要先写高8位再写低8位。操作重装载寄存器的时候更新的值不会马上写入重装载寄存器,而是等到有中断产生的时候操作的数值才会写入寄存器,当然也可以用软件的方法产生中断。

(2)、计数器高位(TIMx_CNTRH) 和计数器低位(TIMx_CNTRL) 

通用定时器TIM2,TIM3,TIM5会用到这两个计数器。

(3)、中断使能寄存器(TIMx_IER) 

地址偏移值:0x04

复位值:0x00

7-0:

BIE TIE COMIE CC4IE CC3IE CC2IE CC1IE UIE

位7 BIE:允许刹车中断

0:禁止刹车中断;

1:允许刹车中断。

位6 TIE:触发中断使能

0:禁止触发中断;

1:使能触发中断。

位5 COMIE:允许COM中断

0:禁止COM中断;

1:允许COM中断。

位4 CC4IE:允许捕获/比较4中断

0:禁止捕获/比较4中断;

1:允许捕获/比较4中断。

位3 CC3IE:允许捕获/比较3中断

0:禁止捕获/比较3中断;

1:允许捕获/比较3中断。

位2 CC2IE:允许捕获/比较2中断

0:禁止捕获/比较2中断;

1:允许捕获/比较2中断。

位1 CC1IE:允许捕获/比较1中断

0:禁止捕获/比较1中断;

1:允许捕获/比较1中断。

位0 UIE:允许更新中断

0:禁止更新中断;

1:允许更新中断。

(4)、状态寄存器 1(TIMx_SR1) 

地址偏移值:0x05

复位值:0x00

7-0:

BIF TIF COMIF CC4IF CC3IF CC2IF CC1IF UIF

位7 BIF:刹车中断标记

一旦刹车输入有效,由硬件对该位置1。如果刹车输入无效,则该位可由软件清0。

0:无刹车事件产生;

1:刹车输入上检测到有效电平。

位6 TIF:触发器中断标记

当发生触发事件(当从模式控制器处于除门控模式外的其它模式时,在TRGI输入端检测到有效边沿,或门控模式下的任一边沿)时由硬件对该位置1。它由软件清0。

0:无触发器事件产生;

1:触发中断等待响应。

位5 COMIF:COM中断标记

一旦产生COM事件(当捕获/比较控制位:CCiE、CCiNE、OCiM已被更新)该位由硬件置1。它

由软件清0。

0:无COM事件产生;

1:COM中断等待响应。

位4 CC4IF:捕获/比较4中断标记

参考CC1IF描述。

位3 CC3IF:捕获/比较3中断标记

参考CC1IF描述。

位2 CC2IF:捕获/比较2中断标记

参考CC1IF描述。

位1 CC1IF:捕获/比较1中断标记

如果通道CC1配置为输出模式:

当计数器值与比较值匹配时该位由硬件置1,但在中心对称模式下除外(参考TIM1_CR1寄存器的CMS位)。它由软件清0。

0:无匹配发生;

1:TIMx_CNT的值与TIMx_CCR1的值匹配。

注:在中心对称模式下,当计数器值为0时,向上计数,当计数器值为ARR时,向下计数(它从0向上计数到ARR-1,再由ARR向下计数到1)。因此,对所有的SMS位值,这两个值都不置标记。但是,如果CCR1>ARR,则当CNT达到ARR值时,CC1IF置1

如果通道CC1配置为输入模式:

当捕获事件发生时该位由硬件置1,它由软件清0或通过读TIM1_CCR1L清0。

0:无输入捕获产生;

1:计数器值已被捕获(拷贝)至TIM1_CCR1(在IC1上检测到与所选极性相同的边沿)。

位0 UIF:更新中断标记

当产生更新事件时该位由硬件置1。它由软件清0。

0:无更新事件产生;

1:更新事件等待响应。当寄存器被更新时该位由硬件置1:

− 若TIM1_CR1寄存器的UDIS=0,当计数器上溢或下溢时;

− 若TIM1_CR1寄存器的UDIS=0、URS=0,当设置TIM1_EGR寄存器的UG位软件对计数器

CNT重新初始化时;

− 若TIM1_CR1寄存器的UDIS=0、URS=0,当计数器CNT被触发事件重新初始化时 (参考0

从模式控制寄存器TIM1_SMCR)。

(5)、控制寄存器 1(TIMx_CR1) 

地址偏移值:0x00

复位值:0x00

7-0:

ARPE CMS[1:0] DIR OPM URS UDIS CEN

位7 ARPE:自动预装载允许位

0:TIM1_ARR寄存器没有缓冲,它可以被直接写入;

1:TIM1_ARR寄存器由预装载缓冲器缓冲。

位6:5 CMS:选择中央对齐模式

00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。

01:中央对齐模式1。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CCiS=00)的输出比较中断标志位,只在计数器向下计数时被置1

10:中央对齐模式2。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CCiS=00)的输出比较中断标志位,只在计数器向上计数时被置1。

11:中央对齐模式3。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CCiS=00)的输出比较中断标志位,在计数器向上和向下计数时均被置1。

注1:在计数器开启时(CEN=1),不允许从边沿对齐模式转换到中央对齐模式。

注2:在中央对齐模式下,编码器模式( GPT_SMCR寄存器中的SMS=001,010,011)必须

被禁止。

位4 DIR:方向

0:计数器向上计数;

1:计数器向下计数。

注:当计数器配置为中央对齐模式或编码器模式时,该位为只读。

位3 OPM:单脉冲模式

0:在发生更新事件时,计数器不停止;

1:在发生下一次更新事件(清除CEN位)时,计数器停止。

位2 URS:更新请求源

0:如果UDIS允许产生更新事件,则下述任一事件产生一个更新中断:

− 寄存器被更新(计数器上溢/下溢)

− 软件设置UG位

− 时钟/触发控制器产生的更新

1:如果UDIS允许产生更新事件,则只有当下列事件发生时才产生更新中断,并UIF置1:

− 寄存器被更新(计数器上溢/下溢)

位1 UDIS:禁止更新

0:一旦下列事件发生,产生更新(UEV)事件:

− 计数器溢出/下溢

− 产生软件更新事件

− 时钟/触发模式控制器产生的硬件复位

被缓存的寄存器被装入它们的预装载值。

1:不产生更新事件,影子寄存器(ARR、PSC、CCRx)保持它们的值。如果设置了UG位或时

钟/触发控制器发出了一个硬件复位,则计数器和预分频器被重新初始化。

位0 CEN:允许计数器

0:禁止计数器;

1:使能计数器。

注:在软件设置了CEN位后,外部时钟、门控模式和编



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

热门文章 更多
无人机新突破:或将利用手机发射塔追踪无人机