STM8S0 定时器2中断配置

发布者:cyzcee最新更新时间:2020-02-11 来源: eefocus关键字:STM8S0  定时器2  中断配置 手机看文章 扫描二维码
随时随地手机看文章

目录:

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位后,外部时钟、门控模式和编码器模式才能工作。然而触发模式可以

自动地通过硬件设置CEN位。

(6)、TIMX_PSCR预分频寄存器 

位7:0 PSC[15:7]:预分频器的高8位值

PSC[7:0]:预分频器的低8位值

预分频器用于对CK_PSC进行分频。

计数器的时钟频率(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)。

PSCR包含了当更新事件产生时装入当前预分频器寄存器的值(更新事件包括计数器被

TIM_EGR的UG位清0或被工作在复位模式的从控制器清0)。这意味着为了使新的值起作用,必须产生一个更新事件。

关键字:STM8S0  定时器2  中断配置 引用地址:STM8S0 定时器2中断配置

上一篇:STM8SF903K3T6定时器1输入捕获
下一篇:STM8S:Debug调试正常,烧录程序运行不正常

推荐阅读最新更新时间:2024-11-03 17:18

STM32F2xx的定时器的应用
定时器计数值的确定。 TIMER的时钟不是直接来源于APB1或者APB2,而是来自经过APB1或者APB2一个倍频器后的时钟。当APBx的预分频数为1时,这个倍频器不起作用,此时定时器的时钟频率等于APBx的频率;当APBx倍频数为其他数值时(即预分频数位2,4,8,16时),这个倍频数起作用,定时器时钟为APBx的两倍。例如AHB=60MHz,APB1为AHB的2分频,即为30MHz,则挂载在APB1下的时钟的频率为60MHz(2倍频)。 各个功能定时器的比较表。 Timer分布 TIM号 引脚映射 说明 TIMER TIM1 TIM1_BKIN-PA6 TIM1_CH1N-PA7 TIM1_CH2N
[单片机]
51单片机定时器0工作在模式2
51单片机定时器0工作在模式2,INT0(P3.2)引脚控制定时/计数器定时计数,定时/计数器0溢出中断,使P2.0引脚相连的LED灯闪烁。定时/计数器0溢出中断为250μs,与P2_0引脚相连的LED灯每2s亮灭一次。源程序如下: //51hei单片机网原创作品,版权所有. #include "reg_c51.h" #define reload_value 0x06 //计数值为250,若时钟频率为12MHz,相当于250μs unsigned char hex ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x88,0x83,0xC6,0xA1,0x86,
[单片机]
单片机4位数字时钟仿真程序(定时器方式2, 按键连加)
学习单片机动态数码管显示,数字时钟是最好的案例,本仿真案例有以下特点。 1.使用定时器0,方式2,可以减小定时器的误差; 2.调时、调分按键具有连加功能,与常见的按键松手检测有区别; 3.具有秒点显示功能,若制作实物案例,可购买带秒点的数码管。 参考程序: #include reg52.h #define uint unsigned int #define uchar unsigned char sbit w1=P2^2; sbit w2=P2^3; sbit w3=P2^4; sbit w4=P2^5; sbit s1=P1^3; sbit s2=P1^4; sbit s3=P1^5; uint shi,fen,sec
[单片机]
单片机4位数字时钟仿真程序(<font color='red'>定时器</font>方式<font color='red'>2</font>, 按键连加)
GPIOLED配置、key、中断NVIC配置
1 #include stm32f10x.h 2 #include stm32f10x_gpio.h 3 4 //内核,(NVIC) 5 #include misc.h 6 7 //点亮红色灯 PB5 8 //step1:使能 9 Rcc_APB2PeriPhClockCmd( 10 Rcc_APB2PeriPh_GPIOB,ENABLE); 11 //step2:定义GPIO初始化结构体变量 12 GPIO_InitTypeDef a; 13 a.GPIO_Speed = GPIO_Speed_50MHz; 14 a.GPIO_Pin = GPIO_Pin_5; 15 //推挽输出 16 a.GPIO_Mode
[单片机]
单片机STM32的几种输入模式以及外部中断配置
最近做毕业设计,需要用按键来触发外部中断。实验的时候是正常的,但是换了个核心板以及用上自己做的PCB电路板后,出现了一些问题。问题如下: 要求:将连接按键的IO口配置为上拉输入,按键一端接IO口,一端接地,即当按键按下后,该IO口会产生一个下降沿,触发下降沿中断。 问题:将相应的IO口配置好后,测了引脚的的电压,并不是3.3V左右,而是0.1V左右。于是猜想: 1. 外围电路对IO口产生了影响。 2. STM32 内部上拉能力较弱,一次只能上拉一个IO口。 于是开始从这两个想法着手解决。首先第一个,很容易就排除了。将外围电路撤掉,我用的是杜邦线,直接拔掉测量引脚上的电压,依然是0.1V左右,于是第1个猜想排除。
[单片机]
MSP430 定时器B与看门狗定时器(2
简介:本节主要介绍: ·16位定时器B之结构 ·16位定时器B之寄存器 ·16位定时器B之程序举例 1. 16位定时器B之结构 1.1 Timer_B7系统 16位Timer_B7仅在MSP430F14x及MSP430F44x芯片中存在,从标题的命名规则可知Timer_B具有7个捕获/比较器。与Timer_A3相比,Timer_B7还具有一下特点: 1、Timer_B7可以配置定时器计数长度:8位、10位、12位或16位; 2、Timer_B7捕获/比较寄存器增加了锁存器; 3、Timer_B7不具备SCCI控制位及其相关功能; 4、Timer_B7在进行比较时,并不是TBCCRx中的值直接与TBR比较
[单片机]
MSP430 <font color='red'>定时器</font>B与看门狗<font color='red'>定时器</font>(<font color='red'>2</font>)
STM32的外部中断配置
一.配置中断 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Set the Vector Table base location at 0x08004000 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); // 1.分配中断向量表 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级 /* Enable the EXTI1 Interrupt NVIC_InitStructure.NVIC_IRQCha
[单片机]
51单片机T2定时器应用
定时器T2有三种工作模式,其中MODE 2为波特率发生器。 1、Mode 2:波特率发生器 串口方式1和3的波特率计算如下: 波特率bps=振荡器频率freq/ 则:RCAP2=65536-(freq/32/bps) 如果freq=11.0592MHZ,bps=9600,则:RCAP2 = 65500 RCAP2H = 255;RCAP2L = 220 此时的程序设置如下: uint a, bps = 96; // 9600 bps SCON |= 0x50; // 0101 0000串口方式1,允许接收 a=3456/bps; a=~a; RCAP2H = a/256; R
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved