历史上的今天
返回首页

历史上的今天

今天是:2025年03月14日(星期五)

正在发生

2020年03月14日 | STM8定时器1计数说明

2020-03-14 来源:eefocus

定时器计数说白了就是把内部时钟信号(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!

推荐阅读

史海拾趣

Eaton公司的发展小趣事

伊顿公司起源于1911年,由Viggo Torbensen和年轻商人Joseph Eaton共同创建的Torbensen齿轮轴承公司,这是伊顿的前身。Joseph Eaton坚信战略收购是拓展业务的最佳方法,因此在公司的发展过程中,他积极推动了一系列重要的收购活动。随着时间的推移,公司的产品逐渐多元化,从最初的齿轮轴承扩展到更广泛的能源管理领域。到1932年,公司更名为伊顿制造公司,进一步彰显了其向多元化发展的决心。

Hayashi Denko Co Ltd公司的发展小趣事

自1993年进入中国市场以来,伊顿公司凭借其先进的技术和丰富的经验,迅速在电网、石油化工、轨道交通、数据中心、商业楼宇等多个行业建立了市场地位。伊顿在中国的发展过程中,不仅带来了全球领先的产品和解决方案,还积极参与了本地市场的建设和创新。通过一系列的战略合作和收购活动,伊顿在中国市场的业务不断扩展,为中国经济和电气工业的发展做出了重要贡献。

Comair Rotron公司的发展小趣事

1947年,James Van Ryan在美国纽约伍德斯托克创立了Comair公司,初期主要专注于风扇和风机产品的制造。当时,电子行业正处于起步阶段,对散热和空气流动的需求日益增长。Comair凭借其出色的技术和产品质量,很快在电子行业中崭露头角,为早期的电子设备提供了可靠的散热解决方案。

Hirschmann公司的发展小趣事
由于TC4066是模拟开关,其开关状态可以由外部数字信号控制。因此,可以通过编程改变输入到TC4066的数字信号(A、B、C、D等),从而改变电路中的电阻/电容值或信号路径,进而间接调整延时时间。这种方法更加灵活和精确,但需要一定的编程知识和电路调试经验。
宇阳科技(EYANG)公司的发展小趣事

随着公司业务的不断发展,宇阳科技在产能扩张和全球布局方面也取得了显著进展。公司在深圳、东莞、安徽等地建立了多个生产基地,引进了先进的生产线和检测设备,确保了产品的高品质和稳定供应。同时,宇阳科技还积极拓展海外市场,与全球多家知名企业建立了长期稳定的合作关系。

Goodwork Semiconductor ( GW )公司的发展小趣事
确保稳压器的输入电压范围符合实际应用需求。

问答坊 | AI 解惑

全球宽带市场渡过难关

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 全球宽带市场渡过难关 呈现好转迹象 2006-7-6     根据TeleGeography最新发布的《全球宽带市场研究报告》,在忍受了多年以来海底电缆容量供过于求的煎熬之后,全球宽带市场已 ...…

查看全部问答>

适应新形式下的无线数字城市视频监控方案

摘要:本文主要对无线数字城市视频监控提出综合的监控方案,方案中融合了卫星、4G、CDMA、智能手机终端、指挥中心等各项技术,是适应新形式下城市新发展的无线移动视频监控方案。   关键词:无线移动视频监控、卫星、4G、CDMA、智能手机终端、 ...…

查看全部问答>

语音电压表

我在设计一个简易的语音提示的电压表,每隔一定时间(比如5秒)提示一次所测量的电压值,用C语言编写程序 语音模块采用的是ISD4000系列的语音芯片 ,哪位朋友有设计方案或者是这方面的资料请提供一下,非常感谢!!请下面给我回帖 我的邮箱是:ca ...…

查看全部问答>

谁能帮我画画电路图?

我是作软件的,突然被要求画出下面板子的电路图,实在是杀了我也不会啊 就是这两张,一张正面一张背面 神啊,硬件我都不会 …

查看全部问答>

各位老师 我定制Wince6.0 Attache Device之后 出现黑屏 怎么办啊

并且出现了 下面这些Warning  是什么原因啊  我正在做一项国家大学生创新性实验项目  用Wince做  wince对我来说都是新的   急啊     老师们帮帮我吧 Pass 1... Warnin ...…

查看全部问答>

EVC中用msxml dom如何写xml文件?

我用的是ppc2003模拟器,是不是要在模拟器中加载msxml.dll文件? 包含的头文件应该如何设置? 全部分数奉上! …

查看全部问答>

要买ARM9(2410)开发板,帮忙介绍一下哈!

    TE2410型ARM9开发板是由慧通科技自主研发的一款嵌入式开发平台,基于三星公司的ARM处理器S3C2410A,开发板走线经过精心优化,性能稳定可靠,具有高性能、低功耗、接口丰富、体积小、集成度高和可配置性强等优良特性,可以满足客户 ...…

查看全部问答>

意法半导体(ST)为STR91x的用户提供免费的TCP/IP协议栈

问个问题:是不是和uCosII配合用比较合适?复杂一点的OS都自带TCP/IP了。可以裸奔吗? …

查看全部问答>

STM8的UART与GPIO切换

STM8的D5、D6口上电时初始化为UART,运行当中想切换成通用GPIO,怎么切换,用GPIO_Init重新初始化无效,找了一下资料没有头绪,请高手指点。…

查看全部问答>