STM8定时器1计数说明

发布者:那是一条路都最新更新时间:2020-03-14 来源: eefocus关键字:STM8  定时器1  计数说明 手机看文章 扫描二维码
随时随地手机看文章

定时器计数说白了就是把内部时钟信号(fmaster)变成外部时钟信号(TIx、ETR),计数需要有时钟/触发控制器和时基单元,定时器1拥有这两个,定时器2和3虽然没有,但可以在捕获模式下进入捕获中断里计数。

在这里插入图片描述

使用外部信号计数有两种方式,见下图:

在这里插入图片描述

一种输入方式是使用定时器1通道输入,第二种使用定时器1触发输入,各输入口见下图,其中PC1到PC4为定时器1输入通道,PB3为定时器1触发输入口:

在这里插入图片描述

如何使用这两种方式来计数外部信号呢,看手册说明:

第一种方式:外部时钟源模式1(使用定时器通道):

在这里插入图片描述
在这里插入图片描述

第二种方式:外部时钟源模式2(使用触发方式):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里使用定时器4作为定时1s电平翻转输出到PE4作为计数器外部计数信号,输入到PC2口的TIM1通道2。


下面分别使用这两个模式来对外部信号计数:

外部时钟源模式1:


void Tim1_Count_mode1_Init(void){//tim1计数模式1初始化

  

  PC_DDR_DDR2 =0;//输入

  //PD_CR1_C14  =0;//浮空输入

  PC_CR1_C12  =1;//上拉输入

  PC_CR2_C22  =0;//禁止外部中断功能

  

  TIM1_CCMR2_CC2S=0x01;//CC2通道被配置为输入, IC2映射在TI2FP2上;

  TIM1_CCMR2_OC2M=0x00;//无滤波器,以fMASTER采样

  TIM1_CCER1_CC2P=0;//捕获发生在TI2F的上升沿

  TIM1_CCMR2_OC2PE=0x00;//无预分频器,捕获输入口上检测到的每一个边沿都触发一次捕获

  TIM1_SMCR_SMS=0x07;//配置计数器使用外部时钟源模式1

  TIM1_SMCR_TS=0x06;//选定TI2作为输入源

  TIM1_IER_TIE=1;//触发中断使能

  TIM1_CR1_CEN=1;//使能计数器

   Send_String("tim1计数初始化完成rn");

}

#pragma vector=TIM1_OVR_TIF_vector//计数上升沿触发中断

  __interrupt void Tim2_Count_mode1_IRQHandler(void){

    

    if(TIM1_SR1_TIF){

        

        TIM1_SR1_TIF=0;

        Send_String("外部时钟源模式1计数上升沿触发中断:");

        Send_O(TIM1_CNTRH);//发计数器高8位

        Send_O(TIM1_CNTRL);//发计数器低8位

        Send_String("rn");

      

    }

    

  }


TIM4部分省略。

串口调试输出:

在这里插入图片描述

外部时钟源模式2:

使用PB3作为外部触发需要修改选项字节,如下图:

在这里插入图片描述
在这里插入图片描述

这里需要注意的是,外部时钟模式2没有触发中断,外部时钟模式1有,见下图:

在这里插入图片描述

所以为了观察定时器1计数器的计数值,在TIM4定时器1s中断中输出定时器1计数器的计数值,代码如下(注意,这里预分频器默认使用官方文档分频系数2):


void Tim1_Count_mode2_Init(void){//tim1计数模式2初始化

  

  PB_DDR_DDR3 =0;//输入

  PD_CR1_C14  =0;//浮空输入

  //PB_CR1_C13  =1;//上拉输入

  PB_CR2_C23  =0;//禁止外部中断功能

  

  TIM1_ETR_ETF=0x00;//无滤波器,以fMASTER采样

  TIM1_ETR_ETPS=0x01;//EPRP的频率/2,触发两次计数一次

  TIM1_ETR_ETP=0;//ETR不反相,即高电平或上升沿有效

  TIM1_ETR_ECE=1;//使能外部时钟模式2,计数器的时钟为ETRF的有效沿

 // TIM1_IER_TIE=1;//触发中断使能

  TIM1_CR1_CEN=1;//使能计数器

  Send_String("tim1模式2计数初始化完成rn");

}


这里列出定时器4中断部分代码:


unsigned int i=0;

#pragma vector=TIM4_OVR_UIF_vector//TIM4更新中断

  __interrupt void TIM4_OVR_UIF_IRQHandler(void){

    

    if(TIM4_SR_UIF) {

      i++;

      TIM4_SR_UIF=0;//清除更新中断标志

      

      if(i>=4000){

        i=0;

        Send_String("1S中断一次:");

        Send_O(TIM1_CNTRH);//发计数器高8位

        Send_O(TIM1_CNTRL);//发计数器低8位

          Send_String("rn");

        PE_ODR_ODR5=!PE_ODR_ODR5;


      }

    }


}


串口调试输出:

在这里插入图片描述

这里可以看到串口输出的“000000”只有三次,其他的都是四次,这是为什么呢?

我猜可能的原因在于stm8s复位时引脚默认是输出高电平的,这样提前了一个高电平,在定时器中断三次加提前的那一次,使计数器计数了,后面的数据都是保持4次不变,第一次的数据不影响我们分析:

在这里插入图片描述

可以看到,在2分频下,定时器每1s输出一次计数器数据,刚好在4s改变一次数据,验证了每两个ETR上升沿才计数一次。

使用按键触发计数。如下图所示,按键使用硬件防抖,每按一下按键,向串口输出计数值。

在这里插入图片描述
在这里插入图片描述

void Tim1_Count_mode2_Init(void){//tim1计数模式2初始化

  

  PB_DDR_DDR3 =0;//输入

  //PB_CR1_C14  =0;//浮空输入

  PB_CR1_C13  =1;//上拉输入

  EXTI_CR1_PBIS=0x02;//仅下降沿触发

  PB_CR2_C23  =1;//使能外部中断功能

  

  TIM1_ETR_ETF=0x00;//无滤波器,以fMASTER采样

  TIM1_ETR_ETPS=0x00;//无分频

  TIM1_ETR_ETP=1;//ETR反相,即低电平或下降沿有效

  TIM1_ETR_ECE=1;//使能外部时钟模式2,计数器的时钟为ETRF的有效沿

 // TIM1_IER_TIE=1;//触发中断使能

  TIM1_CR1_CEN=1;//使能计数器


  Send_String("tim1模式2计数初始化完成rn");

}


#pragma vector=EXTI1_vector//端口B外部中断

  __interrupt void EXTI1_IRQHandler(void){

    if(PB_IDR_IDR3==0){

    

        Send_String("PB3下降沿触发:");

        Send_O(TIM1_CNTRH);//发计数器高8位

        Send_O(TIM1_CNTRL);//发计数器低8位

        Send_String("rn");

        EXTI_CR1_PBIS=0x01;//仅上升沿触发

        

    }

        if(PB_IDR_IDR3){

    

        Send_String("上升沿沿触发rn");

        EXTI_CR1_PBIS=0x02;//仅下降沿触发

        

    }

    

  }


使用PB3外部中断,在中断里面输出计数值。这里需要注意的是,一旦满足外部中断的中断条件后,就会进入中断,但这个中断是一直锁存着,如果按键还是一直按下的,就会一直触发中断,具体看官方手册。所以我这里为了防止中断程序在执行完后在按键还未释放时又进入中断,先是使用了下降沿触发中断,输出计数值,修改中断触发方式为上升沿中断,在按键释放时候发生上升沿,将触发方式又改为下降沿中断,这些就可以解决了按键为放开是又进入中断服务程序。

在这里插入图片描述

串口输出:

在这里插入图片描述

END!

关键字:STM8  定时器1  计数说明 引用地址:STM8定时器1计数说明

上一篇:STM8外部中断
下一篇:STVD TIM4 8位中断定时器

推荐阅读最新更新时间:2024-11-12 23:31

STM8 I2C与PCF8574通讯程序
系统功能 使用STM8的I2C与PCF8574通讯,并使用LED作出简单指示!(PCF8574是I2C与并口互转芯片) 硬件设计 本设计基于内部RC振荡器2M时钟作STM8定时器TIM4的时钟源进行I2C通讯 LED控制电路原理图 PCF8974原理图 软件设计 /********************************************************************* 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 ****************************************************************
[单片机]
<font color='red'>STM8</font> I2C与PCF8574通讯程序
MSP430F5529 (六)定时器Timer_A-1
MSP430F5529共有两类共4个定时器,分别是Timer_A定时器3个和Timer_B定时器1个,按照每个寄存器配备的捕获/比较器的个数分别命名为Timer0_A(内有5个捕获比较器)、Timer1_A(3个)、Timer2_A(3个)、Timer0_B(7个)。 这一章,我们讲定时器Timer0_A.(A类的都一样) 注意:下面所提到的所有寄存器,在TA后面插入0或1或2就分别表示Timer0_A、Timer1_A、Timer2_A(我这里省略了数字) 定时器很重要啊! 6.1 简介一下 定时器A是一个复合了捕获/比较寄存器的十六位的定时(加减)计数器。定时器A支持多重捕获/比较,PWM输
[单片机]
MSP430F5529 (六)<font color='red'>定时器</font>Timer_A-<font color='red'>1</font>
基于STM8的DHT11温湿度传感器的驱动代码设计
最近希望恢复性学习一下STM8的相关知识,于是我选择了从头开始写温湿度传感器DHT11驱动代码的方式。其中遇到一些问题,也有一些收获,希望会帮助到遇到类似问题的朋友,也希望不足之处得到大家的指导 首先介绍一下DHT11的必要知识 一 复位时序 以及 数据时序 下面是数据时序 此外,根据数据手册得知,一次通信需要的时间是3毫秒左右,这很重要,在后面的BUG分析环节会说到 二 贴上关键代码以及分析 //复位DHT11 void DHT11_RST() { TIM4_CR1 = 0x00; //关闭定时器 TIM4_CNTR = 0;
[单片机]
基于<font color='red'>STM8</font>的DHT11温湿度传感器的驱动代码设计
STM8 时钟切换
HSE、HSI、LSI 都可以作为系统主时钟源,STM8 单片机复位以后默认 HSI 的 8 分频作为系统主时钟,其原因是 HSI 稳定时间短,而其 8 分频又可以保证系统在较差的 VDD 条件下安全启动。在系统运行的过程中可以切换系统的主时钟源。系统时钟源的切换有 2 种方式:自动切换、手动切换。 自动切换可以使用最少的指令来完成主时钟源的切换,用户程序可以处理其他事物而不用关心确切的切换时间;手动切换在硬件准备好之后不立即切换,允许用户精确的控制切换发生的时间。 自动切换的步骤为: 1.设置切换控制寄存器 CLK_SWCR 中的 SWEN 位,使能时钟切换。 2.设置主时钟切换寄存器 CLK_SWR,选择目标时钟源
[单片机]
<font color='red'>STM8</font> 时钟切换
STM8单片机STVD环境查看指令运行时间
在调试的情况下,View- Core Registers可查看
[单片机]
STM8 ADC转换模式-------连续扫描模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。 连续扫描模式 该模式和单次扫描模式相近,只是每一次在最后通道转换完成时,一次新的从通道0到通道n扫描转换会自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。 连续扫描模式是在当SCAN位和CONT位已被置时,通过置位ADON位来启动的。 在转换序列正在进行过程中不要清零SCAN位。 连续扫描模式可以通过清零ADON位来立即停止。另外一种选择就是当转换过程中清除CONT位那么转换会在下一次的最后一个通道转换完成时停止。 注意:在扫描模式中,不要使用
[单片机]
STM8——cannot open source file "xx.h"错误
在使用MDK5编译STM32时,新增的.c文件需要添加到 include Paths 处,否则编译时会报错。 使用STM8时,用的是IAR,新增的.c文件需要添加头文件路径到 options- c/c++ Compiler- Preprocessor下的Additional include directories; 否则在mian函数添加头文件,会报错:cannot open source file xx.h 错误
[单片机]
STM8学习笔记---uart1串口中断
uart1串口发送、接收中断。 目标:串口接收1,点亮led1,接收2点亮led2,接收到其他字符关闭led1和led2。 步骤如下: 1、编写led.h和led.c文件。略 2、编写uart.h和uart.c文件,其中串口配置函数如下: void USART_Configuration(void)//串口初始化函数 { UART1_DeInit(); UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO , UART1_SYNCMODE_CLOCK_DISABLE , UART1_MODE
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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