STM8输入捕获

发布者:未来架构师最新更新时间:2016-05-25 来源: eefocus关键字:STM8  输入捕获 手机看文章 扫描二维码
随时随地手机看文章
最近在用STM8的过程中需要用到一个频率检测的功能,还好STM8S207的定时器中自带有输入捕获功能,之前还想着用定时器计数方式来实现的,但既然人家提供了该功能,那就试试吧,由于硬件里面接的是PC1引脚就只看了Timer1,其他的定时器应该也是类似的,看了资料之后发现STM8的输入捕获其实与STC12C5A60S2中的PCA捕获模式很类似,但是看资料没有后者清晰易懂。。。

STM8输入捕获

在捕获模式中,基本上只用到了读进程,在STM8中有一个影子寄存器,但对于我们来说是看不到的,我们仅操作预装载寄存器即可。而且需要注意的是无论是计数器还是捕获/比较寄存器都是先读/写高8位,后读/写低8位数据。

在文档中给出了一个输入捕获模式的流程

STM8输入捕获
 

按着这个流程来就可以完成我们的输入捕获

文档中首先提到将TIM1_CCMR1寄存器的CC1S位写01,将端口配置为输入,但在TIM1_CCMR1的寄存器中有说明CC1S位的更改需在通道关闭时(TIM1_CCER1寄存器的CC1E=0)才可写入,

因此在配置中先将TIM1_CCER1寄存器的CC1E位写0,然后将TIM1_CCMR1的CC1S位写01,

 

TIM1_CCER1 &= (unsigned char)~0x01;//清零TIM1_CCER1中的CC1E位,之后才可配置TIM1_CCMR1
	TIM1_CCMR1 = 0x01;//配置TIM1_CCMR1中的CC1S位为1,CC1通道配置为输入,IC1映射到TI1FP1上
					//无滤波器、无预分频器(捕获输入口上检测到的每一个边沿都触发一次捕获)

 

TIM1_CCMR1寄存器有两种功能,分别对应捕获模式和比较模式,只需要捕获模式即可

STM8输入捕获
 

滤波器是用来避免频率波动的直接写0即可,无滤波器,分频器我们也写00不用分频器,当然也可以使用分频器,提高准确率。

接着是设置触发方式,我们选择上升沿触发

STM8输入捕获
 

 

TIM1_CCER1 &= (unsigned char)~0x02;//上升沿或者高电平触发

最后使能捕获功能,设置TIM1_CCER1寄存器的CC1E位=1,由于我们采用中断方式因此也将TIM1_IER寄存器的CC1IE位置1,允许中断请求。

 

完整的初始化代码如下

 

void signal_capture_Init(void)
{
	TIM1_CNTRH = 0x00;//清零计数器高8位
	TIM1_CNTRL = 0x00;//清零计数器低8位
	TIM1_PSCRH = 0x00;//计数器时钟分频高8位
	TIM1_PSCRL = 0x10;//计数器时钟分频低8位16分频
	TIM1_CCER1 &= (unsigned char)~0x01;//清零TIM1_CCER1中的CC1E位,之后才可配置TIM1_CCMR1
	TIM1_CCMR1 = 0x01;//配置TIM1_CCMR1中的CC1S位为1,CC1通道配置为输入,IC1映射到TI1FP1上
					//无滤波器、无预分频器(捕获输入口上检测到的每一个边沿都触发一次捕获)
	TIM1_CCER1 &= (unsigned char)~0x02;//上升沿或者高电平触发

	TIM1_IER |= 0x02;//CC1IE=1,使能捕获/比较1中断
	TIM1_CCER1 |= 0x01;//捕获使能
	TIM1_CR1 |= 0x01;//使能定时/计数器
}

当发生一个输入捕获时,计数器的值被传送到TIM1_CCR1寄存器中,计时器的时钟源在程序中我们设置为16分频

 

STM8输入捕获
 

分频过后计数器的频率为1MHz,这里采用分频主要是避免计数器溢出,这样同时也降低了精度,同时设置计数器的初值为0,计数器默认计数方式是向上计数,计到最大值后又从0开始计数,

中断处理代码如下

 

@far @interrupt void signal_capture_irq (void)
{
	
	if(TIM1_SR1&0x02)
	{
		TIM1_SR1 &= (unsigned char)~0x02;//清除CC1IF标志
		if(vsync_cap_data_old == 0x00)
		{//第一次捕获中断来临
			vsync_cap_data_old = TIM1_CCR1H;//先读取高8位数据
			vsync_cap_data_old = (unsigned int)(vsync_cap_data_old<<8) + TIM1_CCR1L;//再读取低8位数据
		}
		else
		{
			//第二次捕获中断来临
			vsync_cap_data_new = TIM1_CCR1H;//先读取高8位数据
			vsync_cap_data_new = (unsigned int)(vsync_cap_data_new<<8) + TIM1_CCR1L;//再读取低8位数据
			TIM1_IER &= (unsigned char)~0x02;//禁止通道1捕获/比较中断
			TIM1_CR1 &= (unsigned char)~0x01;//停止计数器
			if(vsync_cap_data_new > vsync_cap_data_old)
				vsync_period = (vsync_cap_data_new - vsync_cap_data_old);
			else
				vsync_period = 0xFFFF + vsync_cap_data_new - vsync_cap_data_old;
			vsync_cap_data_old = 0x00;
			isCaptureOver = 1;
		}
	}
}

我们捕获两次中断计算时间差,

 

 

if(isCaptureOver)
	{
		//如果捕获完成则对数据进行处理
		cmd_puts("period:");
		cmd_hex((unsigned char)(vsync_period>>8));
		cmd_hex((unsigned char)vsync_period);
		TIM1_CNTRH = 0x00;//清零计数器高8位
		TIM1_CNTRL = 0x00;//清零计数器低8位
		TIM1_IER |= 0x02;//CC1IE=1,使能捕获/比较1中断
		TIM1_CR1 |= 0x01;//使能定时/计数器
		isCaptureOver = 0;
	}
这里只从串口输出了周期,结果如下

 


可以看到周期在一个范围内波动我们取一个值0x79ED来计算,它所对应的频率f=1000000/0x79ED=32.0379Hz还是比较接近我们的实际输入频率30Hz,误差是大了些,可以通过代码继续改进

关键字:STM8  输入捕获 引用地址:STM8输入捕获

上一篇:STC单片机timer2捕获模式测频率
下一篇:p87c591的数据采集与处理系统的设计

推荐阅读最新更新时间:2024-03-16 14:54

IAR新建STM8工程
1、准备标准库函数文件,官方的标准库函数为stsw-stm8069,解压后如下图: 2、新建一个文件夹,本例子命名为stm8-project,新建四个子文件夹,分别命名为APP、Readme、USER、STM8S_StdPerph_Driver: 3、从库函数例程以下目录拷贝文件 inc和src两个文件夹以及内容至STM8S_StdPerph_Driver目录。 4、从库函数例程以下目录拷贝文件 main.c、stm8s_conf.h、stm8s_it.c 、stm8s_it.h到USER目录。 5、在Readme目录下新建一个文本文件,命名为readme.txt,这个主要用来记录开发进度: 6、打开IAR,新
[单片机]
IAR新建<font color='red'>STM8</font>工程
基于STM8的电容触摸式按键软件库介绍
STM8S系列触摸按键软件库基本结构如下图所示,分成下面几个部分: 基于上述软件库架构 1) 用户软件通过API接口调用相应的函数启动按键信号采集,通过访问相应的变量来获得按键 的状态,以及通过对一些控制变量的配置来修改触摸式按键的工作参数。 2) 后处理部分是STM8S系列软件库的核心部分,包含了一些列的校准,滤波算法。通过ECS (环境处理系统)的处理,达到环境自适应的功能。 3) 采集部分主要通过对IO口以及定时器的控制来获得按键的充放电时间。
[单片机]
基于<font color='red'>STM8</font>的电容触摸式按键软件库介绍
stm8 在IAR 下烧写出现The Flash Memory Read-out protection 的解决方法
刚买回来的stm8 最小板居然不能烧写程序,在以前的板子上烧写可是好好的。 烧写就出现The Flash Memory Read-out protection (内存写保护) 错误。 废话少说: 要解除写保护,先仔仔stvp工具 点击打开链接 打开stvp工具后: 选择option byte 选择关闭写保护,如果默认是关闭就不用管 然后点击右键选择program current 重新烧写一次,然后重新打开IAR,发现就可以重新开始下载程序了
[单片机]
<font color='red'>stm8</font> 在IAR 下烧写出现The Flash Memory Read-out protection 的解决方法
stm8——串口printf的实现
串口通信是单片机学习的一个最基本、最重要的功能之一。串口可以间接的当做调试接口使用,实现单片机与电脑之间的通信。还可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。作为开发者,熟悉串口是必须的。 =========================================== STM8L的USART特性: 我们在使用串口的时候,主要关心:波特率、停止位、奇偶校验位。 再次就是怎样接收、发送数据。常用:阻塞式发送数据、中断方式接收数据。 ========================================== 在单片机的调试过程中经常会要适时地输出变量的值,这时pri
[单片机]
IAR for STM8下载、安装、注册
一、下载 官方下载,网址 https://www.iar.com/iar-embedded-workbench/#!?currentTab=free-trials 到这个页面,下载即可,国外的网址下载较慢。 二、安装 1.下载软件,双击安装包,进入准备安装(解压)过程 2、点击Install IARM Embeded Workbench for STMicroelctronics STM8 3.进入安装向导界面,点击“Next” 4.选择“I accept the ...”,点击“Next” 5.点击“Change”选择安装路径(默认C盘,可以不用修改,我这里改为D盘),点击“Next” 6.勾选需要安装调试的
[单片机]
IAR for <font color='red'>STM8</font>下载、安装、注册
vfd电子时钟制作
硬件: 1.罗耶振荡电路输出一路4v交流,一路25v交流   其中4v直接驱动灯丝,另一路经电桥整流提供负压给pt6311 2.主控用stm8s003f3   成本低廉,而且我这几块stm8是x宝掌柜送的,本身性价比也很高,8kflash先在用串口调试附带其他驱动大致用了  也就是大概用完了。其实去掉uart估计要少4k,我寻思加个gps解码的程序应该够用吧。。。23333 3.vfd驱动用前面提到的pt6311   我买的好像很便宜,1.85一片。但是现在用了三片,其中一片死活有个seg不输出。索性它便宜就不计较了2333 原理图 pcb: 按键那部分单独做了块小板子,一来空间不够了,而来后期设计外壳更方便,总之
[单片机]
vfd电子时钟制作
stm32---输入捕获
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)中。 1. 相关寄存器介绍 1) 捕获/比较模式寄存器 (TIMx_CCMRx) 当在输入捕获模式下使用的时候,对应上图的第二行描述,从图中可以看出,TIMx_CCMR1 明显是针对 2 个通道的配置,低八位 用于捕获/比较通道 1 的控制,而高八位 则用于捕获/比较通道 2 的控制。同
[单片机]
stm32---<font color='red'>输入</font><font color='red'>捕获</font>
STM8 IAR相关笔记
如果.h文件不在程序根目录下,需要说明位置,如下图: 这样编译器就能找到.h文件的位置,不会出错。至于.c文件直接位置添加即可,如下图
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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