STM8S003F3 使用定时器来计算方波周期的方法

发布者:知识的海洋最新更新时间:2021-09-15 来源: eefocus关键字:STM8S003F3  定时器来 手机看文章 扫描二维码
随时随地手机看文章

我们的需求是stm8做从机,然后使用一根线接收方波,来实现不同的功能,比如亮红灯,亮黄灯,打开蜂鸣器等等等等。


那么问题来了,之前我尝试着通过一次发送多少个方波来实现不同的功能,但是到最后我发现这个方法行不通。后来我想了一下可以通过主机发过来的方波频率来实现不同的功能,即知道每次发过来的方波的周期。


那么如何计算方波周期呢?这里感谢我的同事给了我思路,可以实现这个功能。


首先是要做gpio的外部中断,这里以gpio PD4在主函数里进行设置,当有下降沿的时候就会进入中断处理函数:


GPIO_Init(GPIOD,GPIO_PIN_4, GPIO_MODE_IN_FL_IT );//接收方波初始化

EXTI_DeInit();

EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD , EXTI_SENSITIVITY_FALL_ONLY);

定时器timer2在主函数的配置如下:


//内部时钟为16M,因此这个设置时以10ms进入一次中断

TIM2_DeInit();  

TIM2_TimeBaseInit(TIM2_PRESCALER_16, 9999);       

TIM2_PrescalerConfig(TIM2_PRESCALER_16, TIM2_PSCRELOADMODE_UPDATE);  

TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);  

TIM2_SetCounter(0x0000);  

TIM2_Cmd(ENABLE);  

TIM2_ClearFlag(TIM2_FLAG_UPDATE);

 

TIM2_ITConfig( TIM2_IT_UPDATE, ENABLE);

TIM2_Cmd(ENABLE); 

在gpio的外部中断函数里,这样设置:


INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)

{

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

  //GPIO_WriteReverse(GPIOD,GPIO_PIN_3);  

  flag ^= 0x01;

  if(flag == 0)

  test_time = 0;

  else{

tmp_count = test_time;

  }

}

在timer2的外部中断处理函数里,这样设置:


 INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)

 {

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

     

     TIM2_ClearFlag( TIM2_FLAG_UPDATE);//记得要清除标志位,否则会出问题

test_time++;

   

 }

这样一来当flag为0的时候就会清零,为1的时候就会将数据传出去,也就是等于知道一个周期的时间。


存在问题:这样的写法虽然可以解决问题,但是在程序刚开始的时候还是会出现问题,因为可能定时器先走了,主函数比定时器慢,一开始可能会丢,不过后面就很稳定了。

关键字:STM8S003F3  定时器来 引用地址:STM8S003F3 使用定时器来计算方波周期的方法

上一篇:STM8S003F3 内部时钟初始化以及定时器做延时的使用
下一篇:STM8学习笔记---Modbus通信协议简单移植

推荐阅读最新更新时间:2024-10-26 11:17

STM8S003F3 使用定时器计算方波周期的方法
我们的需求是stm8做从机,然后使用一根线接收方波,来实现不同的功能,比如亮红灯,亮黄灯,打开蜂鸣器等等等等。 那么问题来了,之前我尝试着通过一次发送多少个方波来实现不同的功能,但是到最后我发现这个方法行不通。后来我想了一下可以通过主机发过来的方波频率来实现不同的功能,即知道每次发过来的方波的周期。 那么如何计算方波周期呢?这里感谢我的同事给了我思路,可以实现这个功能。 首先是要做gpio的外部中断,这里以gpio PD4在主函数里进行设置,当有下降沿的时候就会进入中断处理函数: GPIO_Init(GPIOD,GPIO_PIN_4, GPIO_MODE_IN_FL_IT );//接收方波初始化 EXTI_DeIn
[单片机]
CubeMX Stm32F407 生成一定周期的占空比不同的方波 DMA + 定时器
先上图 如图 是我生成的一个波形 这个波形的占空比在连续的四个周期内分别是10%,20%,30%,40%, 并且按照这个顺序循环这里大致介绍一下实现的方式。 使用的软件是Cubemx(库函肯定也可以实现) 第一步是器件选型 这一部分不做介绍 用的是Stm32F407 第二是时钟配置 接下来是定时器配置 第三步就是生成代码了 这里 需要在生成的代码里面加上一行开始的代码。
[单片机]
CubeMX Stm32F407 生成一定<font color='red'>周期</font>的占空比不同的<font color='red'>方波</font> DMA + <font color='red'>定时器</font>
CubeMX Stm32F407生成一定周期的占空比不同的方波DMA+定时器
先上图 如图 是我生成的一个波形 这个波形的占空比在连续的四个周期内分别是10%,20%,30%,40%, 并且按照这个顺序循环这里大致介绍一下实现的方式。 使用的软件是Cubemx(库函肯定也可以实现) 第一步是器件选型 这一部分不做介绍 用的是Stm32F407 第二是时钟配置 接下来是定时器配置 第三步就是生成代码了 这里 需要在生成的代码里面加上一行开始的代码。
[单片机]
CubeMX Stm32F407生成一定<font color='red'>周期</font>的占空比不同的<font color='red'>方波</font>DMA+<font color='red'>定时器</font>
使用定时器1以方式0产生周期为500us的方波连续脉冲
设单片机晶振频率为6MHz,要求使用定时器1以方式0产生周期为500us的等宽正方波连续脉冲,并由P1.0输出,以查询方式完成。 求单片机高手帮忙! ;---------------------------------------------------------------- 分析: 方式0,求初始值时,稍麻烦点。 按照题目要求,需要定时250us。 因为晶振频率为6MHz,指令周期就是2us,那么计数值就是125。 因为方式0的最大计数值是 2^13,于是有:     初始值 = 8192-125 = 8067 = 1111 1100 00011 使用方式0,要求把1111110000011,分成高8位和低5位,故有:   
[单片机]
MSP430(G2553)用看门狗定时器产生周期信号
#include msp430g2553.h #include intrinsics.h volatile unsigned int i = 0; // 中断服务子程序中所用到的全局变量, 最好定义成 volatile 型, 具体原因和用法可以参考我的其他博文介绍 void main (void) { WDTCTL = WDT_MDLY_0_5; // 周期 0.5ms, 设置可参考下面头文件中的截段 IE1 |= WDTIE; // 使能WDT中断 P2DIR |= BIT2; // P2.2输出 _EINT(); // 使能全局中断 for (;;) {
[单片机]
MSP430(G2553)用看门狗定时器产生周期信号
#include msp430g2553.h #include intrinsics.h volatile unsigned int i = 0; // 中断服务子程序中所用到的全局变量, 最好定义成 volatile 型, 具体原因和用法可以参考我的其他博文介绍 void main (void) { WDTCTL = WDT_MDLY_0_5; // 周期 0.5ms, 设置可参考下面头文件中的截段 IE1 |= WDTIE; // 使能WDT中断 P2DIR |= BIT2; // P2.2输出 _EINT(); // 使能全局中断 for (
[单片机]
STM8S003F3 内部时钟初始化以及定时器做延时的使用
STM8S003F3 内部晶振初始化代码如下: CLK_DeInit(); CLK_LSICmd(ENABLE); CLK_HSICmd(ENABLE); while(SET != CLK_GetFlagStatus(CLK_FLAG_HSIRDY)); CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //HSI = 16M (1分频) 这里我使用timer4来做例子,代码如下: //延时10us (2分频=8M 计数80个脉冲) TIM4_TimeBaseInit(TIM4
[单片机]
STM8S003F3使用总结——定时器
STM8S003F3有三个定时器,分别为16位高级定时器TIM1、16位通用定时器TIM2和8位基础定时器TIM4。其中,TIM1和TIM2支持PWM输出,本项目中用到了TIM1-CH1和TIM2-CH1两个通道作为PWM输出,以及TIM4作为时基,下面进入正文。 编译环境:IAR for STM8 3.10.2 库版本:V2.2.0 1.定时器 关于定时器没什么好说的,直接看下配置代码 void TIM1_Init(u16 psc, u16 arr, u16 duty) { TIM1_TimeBaseInit(psc, TIM1_COUNTERMODE_UP, arr, 0); TIM1_OC1Init(T
[单片机]
<font color='red'>STM8S003F3</font>使用总结——<font color='red'>定时器</font>
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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