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  定时器来 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic548015.html

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S003F3 选项字
STM8S003F3 GPIO功能复用的设置,有两种办法,一种是程序烧录可参考本类中最近文章,另一种是SWIM方法,在IAR中直接设置。现将这种方法的步骤介绍如下:1. 在IAR中进入download / debug模式2. 点击ST-LINK选项3. 修改对应的选项字选择对应的选项字,右键点击选择STM8S003F3选项字功能如规格书描述如下:
发表于 2020-02-20
<font color='red'>STM8S003F3</font> 选项字
N76E003替换STM8S003F3
;• TSSOP20 / QFN20;• ESD&EFT:HBM/8KV MM/400V,Over 4KV,优异的ESD和EFT,抗干扰和ESD防护能力;•ADC Internal Band-gap :做内部参考电压,ADC更精确(stm8s003f3没有adc内部参考电压)管脚对比总结:虽然实际性能肯定不能和描述的性能一样,但应该是可以用的。此外因为烧录pin多了一个,所以想直接替换已完成的stm8s产品还是不行的,除非烧录好程序再贴片,否则烧录不了。实际效果如何会在后面的文章中写出。
发表于 2020-02-16
N76E<font color='red'>003</font>替换<font color='red'>STM8S003F3</font>
STM8S003F3 使用ADC:固件库版本与寄存器版本
STM8S003F3这款小型MCU,只有1K RAM与8K Flash,应用比较简单,AD采样,GPIO控制,PWM控制,还是不错的嵌入式的应用。最近一个项目用到了几路AD采样,我平时一般喜欢下载最新的官方标准固件库,只是,这次遇到的问题是,在使用PWM与ADC采样后,代码大小竟然大于8K,编译失败!!!后来,看了下Debug下的map文件,发现,使用ADC的固件库,大小竟然有1K的代码空间。后来改为寄存器的,发现代码还不到100字节。(1)固件库AD采样的代码如下,代码易懂,但编译后代码较大:单通道采样,多个的话,只需要一个一个采集。#include "adc.h"#include "stm8s.h
发表于 2020-02-11
STM8S003F3 使用TIM1_CH1与TIM1_CH2配置PWM输出
最近一个项目,用的是STM8S003F3这款小型的MCU,使用TIM1_CH1 TIM_CH2作为PWM输出时,遇到了问题,代码下载后,PWM是没有任何输出的。用示波器看,应该是PWM没有任何输出。首先在网上找了下资料,又看了官方的例程,感觉代码没有问题。后来仔细查看问题,终于找到解决的方案。原来根据STM8S003F3的数据手册,需要配置一个选项字节才能使能TIM1_CH1与TIM1_CH2。配置的方法有两种:(1)使用STVP(STM32与STM8)烧写的软件,在烧写固件时,配置一下,下载到芯片,其实这个保存在DataFlash中,理论上配置一次,再使用ST-LINK下载,就一直生效。(2)方法二,STM8S的固件库
发表于 2020-02-06
<font color='red'>STM8S003F3</font> 使用TIM1_CH1与TIM1_CH2配置PWM输出
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.01.定时器关于定时器没什么好说的,直接看下配置代码void TIM1_Init(u16 psc, u16 arr, u16 duty){    TIM1_TimeBaseInit(psc, TIM1_COUNTERMODE_UP,  arr, 0);  
发表于 2020-01-13
<font color='red'>STM8S003F3</font>使用总结——定时器
STM8S003F3使用总结——串口
STM8作为低成本芯片一直受到广大用户青睐,最近一个项目使用了STM8S003F3P6这款芯片,主要实现的功能就是串口接收指令控制PWM输出。这里对这款芯片使用过程中遇到的问题进行总结。编译环境:IAR for STM8 3.10.2库版本:V2.2.01.STM8S003F3与STM8S103F3差异除了以上差异,两款芯片可pin-to-pin兼容,片内外设资源一致。2.串口通信STM8S003F不支持DMA,因此使用中断方式接收。中断向量表如下:typedef enum { UART1_IT_TXE        = (uint16_t)0x0277, /*!< Transmit
发表于 2019-11-30
<font color='red'>STM8S003F3</font>使用总结——串口
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved