历史上的今天
返回首页

历史上的今天

今天是:2024年11月20日(星期三)

正在发生

2018年11月20日 | 带你学习STM8自带输入捕获功能

2018-11-20 来源:eefocus

最近在用STM8的过程中需要用到一个频率检测的功能,还好STM8S207的定时器中自带有输入捕获功能,之前还想着用定时器计数方式来实现的,但既然人家提供了该功能,那就试试吧,由于硬件里面接的是PC1引脚就只看了Timer1,其他的定时器应该也是类似的,看了资料之后发现STM8的输入捕获其实与STC12C5A60S2中的PCA捕获模式很类似,但是看资料没有后者清晰易懂。。。


1.png?imageView2/2/w/550


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


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


2.png?imageView2/2/w/550


[cpp] view plain copyTIM1_CCER1 &= (unsigned char)~0x02;//上升沿或者高电平触发


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


完整的初始化代码如下


[cpp] view plain copyvoid 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分频


4.png?imageView2/2/w/550


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


中断处理代码如下


[cpp] view plain copy@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;


}


}


}


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


[cpp] view plain copyif(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;


}


这里只从串口输出了周期,结果如下


5.jpg?imageView2/2/w/550


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


推荐阅读

史海拾趣

Fedco_Batteries公司的发展小趣事

Fedco_Batteries的创始人李先生,在电子产业蓬勃发展的年代,看到了电池领域的巨大潜力。他凭借对技术的热爱和对市场的敏锐洞察,决定投身电池制造行业。创业初期,公司面临着资金短缺、技术瓶颈等重重困难。然而,李先生带领团队日夜兼程,不断研发新型电池技术,最终成功推出了一款性价比高、性能稳定的电池产品,打开了市场的大门。

HAHN - Elektrobau GmbH & Co KG公司的发展小趣事

进入21世纪后,高通在推动5G技术发展方面发挥了关键作用。作为真正的5G领军企业,高通在基础研发方面持续投入,拥有引领和参与标准制定的长期历史。高通的5G技术涵盖了从系统构建到多样化应用的各个方面,包括毫米波频谱的利用、大规模MIMO技术的演进等。这些突破性发明为现代蜂窝通信提供了强有力的支撑,使得高通在5G标准制定和技术实施方面占据了核心地位。高通已签订超过150份5G许可协议,为全球超过180亿台终端提供了技术支持。

Gaomi Xinghe Electronics公司的发展小趣事

背景:在21世纪初,Galaxy公司凭借其在电子产品领域的深厚积累,决定进一步拓展国际市场。通过详细的市场调研,公司发现欧洲市场潜力巨大,特别是对高质量电子产品的需求日益增长。

行动:于是,Galaxy在波兰Cracow成立了欧洲分公司,地处欧洲中部,这一地理位置使其能够很好地覆盖整个欧洲大陆,包括东部和西部的国家。该分公司不仅作为销售中心,还承担起返修件回收处理的重任,确保客户能够享受到无时区差别的销售和维修服务。

成果:这一战略部署显著提升了Galaxy在欧洲市场的知名度和竞争力,市场份额逐年攀升,为公司的全球化进程奠定了坚实基础。

展恒电子(Broadic)公司的发展小趣事

2011年,展恒电子自主研发的首款485功能芯片——HD588成功问世,并成功应用到电网产品中。这一突破不仅证明了展恒电子在芯片设计领域的实力,也为公司在电力行业的拓展奠定了坚实的基础。随后,公司继续加大研发力度,不断推出更多具有竞争力的产品,逐步在电子行业中树立了良好的口碑。

Fortiming Corporation公司的发展小趣事

背景:2001年9月5日,Fortiming Corporation在内华达州正式成立(来源:企查查)。在成立之初,公司就明确了自己的市场定位——专注于提供高质量的石英晶振、晶体振荡器等频率控制产品。

发展:面对当时竞争激烈的电子行业,Fortiming凭借其对技术的深刻理解和对市场需求的敏锐洞察,迅速在石英晶振领域站稳脚跟。公司不仅注重产品研发,还积极引进先进生产设备,提升产品质量和生产效率。

富芯森美(FUXINSEMI)公司的发展小趣事

富芯森美成立于行业快速发展的初期,公司自创立之初便聚焦于功率半导体器件的研发与生产。公司创始人凭借对半导体技术的深刻理解和前瞻性的市场洞察,迅速组建了一支由行业专家组成的研发团队。通过不断的技术积累与创新,富芯森美逐步掌握了可控硅、MOSFETS、碳化硅肖特基等核心产品的关键技术,为公司的后续发展奠定了坚实的基础。

问答坊 | AI 解惑

一点PCB方面的小知识

1、我们常用的PCB介质是FR4材料的,相对空气的介电常数是4.2-4.7。这个介电常数是会随温度变化的,在0-70度的温度范围内,其最大变化范围可以达到20%。介电常数的变化会导致线路延时10%的变化,温度越高,延时越大。介电常数还会随信号频率变化,频 ...…

查看全部问答>

让家电智能人声化设计不再为难——WTV语音芯片帮你提升产品性能

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 关键词:语音芯片,语音IC,WTV芯片,家电控制 语音芯片,采用数码电子技术将纯的无任何机械的半导体集成电路(IC)去完成语音信号的存储和还原,这样一类经过存储而还原播放的语言、声 ...…

查看全部问答>

讨论“项目经理的工作职责”

项目经理---负责新产品的开发的项目经理的工作职责是啥?怎样考评?怎样激励?…

查看全部问答>

关于xilinx FPGA 中嵌入的PowerPC 405 cores 的使用问题请教

我手里的开发板是xilinx公司的v2pro芯片的xupv2p开发板。 芯片是嵌入了PowerPC405 cores ; 开发板上有一个DEBUG 16针接口。 我想问一下,如何使用这个接口呢?如何调试,仿真嵌入的PowerPC 呢? 如果需要下载程序到这个里面需要什么样的下载线 ...…

查看全部问答>

合肥地区招聘嵌入式软件工程师

任职条件: 大学嵌入式、计算机、电子专业本科学历。研究生、有工作经验者、有嵌入式相关证书者优先。 英语四级以上,六级以上者优先。 精通嵌入式C语言,熟练掌握嵌入式系统架构、原理。 热爱本职工作,具有较强的团队合作精神。 诚实、 ...…

查看全部问答>

CODEC音频的问题

请问:怎样将CODEC的音频源从SDRAM或者CPU或者MIC,切换到从蓝牙输入,谢谢! 如题:…

查看全部问答>

2410 ECC 问题

2410 文档 2410自带eCC功能: ECC generator block executes the followings: 1. When MCU writes data to NAND, the ECC generator block generates ECC code. 2. When MCU reads data from NAND, the ECC generator block generates ECC code ...…

查看全部问答>

我想在Wince的系统托盘中实现气球提示功能,请高手指点指点

如题,为什么当鼠标移动到托盘图标上时,不显示提示信息呢?…

查看全部问答>

linux内核完全剖析 基于0.12内核 txt下载

linux内核完全剖析 基于0.12内核 赵炯 的  200901的  txt doc pdf 的下载版本地址 谁有就给个链接吧 谢谢了哈  嘿嘿…

查看全部问答>

GNU(GNU_ARM_Toolchain为主)编程 记录

本帖最后由 辛昕 于 2014-12-4 00:04 编辑       这算是前面 那个 Contiki系列的续编。不过,相对来说,我觉得它比较独立。       一直以来,用GCC编程是我的习惯,只不过,那也仅限于PC上的程序。而一 ...…

查看全部问答>