STM8S0 定时器2中断配置

目录:
1.程序:定时器2中断配置、高精度延时函数和LED灯初始化
2.基础知识:
一、程序:
#include <iostm8s003f3.h>
#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 <iostm8s003f3.h>
#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)。这意味着为了使新的值起作用,必
须产生一个更新事件。
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车观察侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值