历史上的今天
返回首页

历史上的今天

今天是:2025年05月24日(星期六)

2019年05月24日 | STM32的ETR引脚计数功能

2019-05-24 来源:eefocus

1. 基本介绍

1.1. 开发环境

开发板:WarShip STM32 BOARD V2.1 

CPU:STM32F103ZET6


1.2. ETR引脚配置

这里写图片描述

由上可知,使用STM32的ETR引脚计脉冲数,需将定时器的时钟源选择为外部时钟模式2 

选定此模式的方法:令TIMx_SMCR寄存器中的ECE=1 

计数器能够在外部触发ETR的每一个上升沿或下降沿计数 


这里写图片描述

例如,要配置在ETR引脚上,每2个上升沿计数一次的向上计数器,使用下列步骤: 

1. 本例中不需要滤波器,置TIMx_SMCR寄存器中的ETF[3:0]=0000 

2. 设置预分频器,置TIMx_SMCR寄存器中的ETPS[1:0]=01 

3. 设置在ETR的上升沿检测,置TIMx_SMCR寄存器中的ETP=0 

4. 开启外部时钟模式2,置TIMx_SMCR寄存器中的ECE=1 

5. 启动计数器,置TIMx_CR1寄存器中的CEN=1


计数器在每2个ETR上升沿计数一次。 

在ETR的上升沿和计数器实际时钟之间的延时取决于在ETRP信号端的重新同步电路 


这里写图片描述

TIMx_SMCR寄存器的位定义,参见《STM32中文参考手册_V10.pdf》14.3.3章节


1.3. 引脚对应关系


这里写图片描述

2.源代码

说明: 

1. 将PB5与PD2短接 

2. 使用TIM2定时器在引脚PB5上输出方波,周期为500ms(高500ms低500ms) 

3. 使用TIM3_ETR计脉冲功能对上面的方波上升沿计数


2.1. etr.c

#include "etr.h"

#include "led.h"

void bsp_timer2_init( u16 arr,u16 psc ){


    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 


    TIM_TimeBaseStructure.TIM_Period = arr;     

    TIM_TimeBaseStructure.TIM_Prescaler =psc; 

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 


    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 


    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure);  


    TIM_SetCounter( TIM2,0 );

    TIM_Cmd(TIM2, ENABLE);  


}

void TIM2_IRQHandler(void){    


    if (TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET){

        LED0=!LED0;//PB5

    }

    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);    

}

void bsp_timer3_init(u16 arr,u16 psc){


    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;               

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            

    GPIO_Init(GPIOD, &GPIO_InitStructure);                  



    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 

    TIM_TimeBaseStructure.TIM_Period = arr; 

    TIM_TimeBaseStructure.TIM_Prescaler = psc; 

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 


#if 0

    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure);  

#endif

    TIM_ETRClockMode2Config(TIM3,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0);

    TIM_SetCounter( TIM3,0 );

    TIM_Cmd(TIM3, ENABLE);               

}

/*

** TIM3中断可以不使用,对ETR计数无影响

** 使用可以通过借助两个LED闪烁情况判断

** ETR是否调试正确,或者直接打印定时器

** 计数寄存器的值也可以,自行选择

*/

void TIM3_IRQHandler(void){


    if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET){

        LED1=!LED1;

    }

    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); 

}


2.2. main.c

#include "led.h"

#include "delay.h"

#include "key.h"

#include "sys.h"

#include "lcd.h"

#include "usart.h"

#include "etr.h"


int main(void){  

    delay_init();           

    NVIC_Configuration();    

    uart_init(9600);        

    LED_Init();              

    bsp_timer2_init(4999,7199);//500ms

    bsp_timer3_init(5,0);

    while(1) {       

        printf("Count=%dn",TIM_GetCounter(TIM3));

        delay_ms(10);

    } 

}



如果通过LED查看则LED0一秒亮一次,LED1则5秒亮一次 

如果通过打印查看则数值从0至5向上循环 

TIM2与TIM3初始化时的自动重装载值与预分频读者可根据自己的需要自行设置



推荐阅读

史海拾趣

AND Displays公司的发展小趣事

在追求经济效益的同时,AND Displays也积极践行环保理念。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还推出了多款节能型显示面板,帮助用户降低能耗、减少碳排放。此外,AND Displays还积极参与公益事业,通过捐赠和技术支持等方式,为社会的可持续发展贡献力量。

Amphenol RF公司的发展小趣事

在追求经济效益的同时,AND Displays也积极践行环保理念。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还推出了多款节能型显示面板,帮助用户降低能耗、减少碳排放。此外,AND Displays还积极参与公益事业,通过捐赠和技术支持等方式,为社会的可持续发展贡献力量。

ARMKEIL Microcontroller Tools公司的发展小趣事

为了进一步扩大业务范围和提升技术实力,Keil公司决定与美国德克萨斯州理查森的Keil Software Inc进行联合运营。这一举措不仅使公司得以接触更广阔的市场,还促进了双方在技术、产品和市场等方面的深度融合。联合运营后,Keil公司的发展速度明显加快,逐渐在嵌入式系统开发工具市场上占据了重要地位。

Fascomp公司的发展小趣事

Fascomp公司起源于一间小型的电子产品研发工作室。创始人李明和他的团队在资金紧张、技术条件有限的情况下,坚持自主研发一款高性能的芯片。经过无数次的失败和试验,他们最终成功开发出了一款具有竞争力的芯片,赢得了市场的初步认可。这个过程中,团队成员的坚持和对技术的执着追求成为了公司后续发展的基石。

Clover Display Limited公司的发展小趣事

品质管理是电子企业生存和发展的关键。Clover Display Limited深知这一点,因此在生产过程中始终严格把控品质。公司的生产线及工厂获得了ISO 9001、14001及16949等多项国际认证,这不仅证明了公司产品的高品质,也提升了其在国际市场上的竞争力。同时,公司还积极参与国际标准制定和行业交流活动,以不断提升自身的技术水平和市场影响力。

这五个故事虽然基于虚构的情节,但它们都基于Clover Display Limited在电子行业发展的真实背景和趋势。这些故事展示了公司在技术创新、市场拓展、品质管理等方面的努力和成就,也反映了电子行业的快速发展和变革。希望这些故事能够为您提供一个关于Clover Display Limited发展起来的有趣而全面的视角。

Hi-Tech Resistors Pvt Ltd公司的发展小趣事

随着中国内销市场的不断扩大,Clover Display Limited看到了巨大的商机。为了更好地服务中国内销客户,公司在2001年在深圳南山区成立了高华电子显示(深圳)有限公司。这家子公司以独资经营方式运作,可以开具增值税发票,以人民币结算,从而更加便捷地服务中国客户。深圳子公司的成立不仅拓宽了公司的销售渠道,也为其在中国市场的进一步发展奠定了坚实基础。

问答坊 | AI 解惑

常用的计算机命令集

开始菜单中的“运行”是通向程序的快捷途径,输入特定的命令后,即可快速的打开Windows的大部分程序,熟练的运用它,将给我们的操作带来诸多便捷。 winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构(wmi) wupdmgr Windows更新 ...…

查看全部问答>

电动机常见机械故障维护

1.定、转子铁芯故障检修   定、转子都是由相互绝缘的硅钢片叠成,是电动机的磁路部分。定、转子铁芯的损坏和变形主要由以下几个方面原因造成。   ①轴承过度磨损或装配不良,造成定、转子相擦,使铁芯表面损伤,进而造成硅钢片间短路,电动机 ...…

查看全部问答>

没有软驱,如何做wince启动盘?

pc机没有软驱,请问如何把cf卡作成wince启动盘? 好像第一步是将cf卡能实现dos引导,我是通过虚拟软驱进到dos系统里了, 但是不能识别我的usb设备,cf卡是通过IDE-USB转接到pc机上的。 试了一些能在dos下识别usb的软件,可还是识别不了? 向大 ...…

查看全部问答>

请问vhdl语言中用逻辑表达式能让输出信号变成高阻态吗?

老师留的作业让用行为级来描述……但是用逻辑表达式怎么表示高阻态呢?谢谢啦…

查看全部问答>

关于CeCreateProcess的问题!急!

现在定义如下 Public Declare Function CeCreateProcess Lib \"rapi.dll\"( _   ByVal lpApplicationName As String, _   ByVal lpCommandLine As String, _    lpProcessAttributes as SECURITY_ATTRIBUTES, _ ...…

查看全部问答>

关于电容补偿柜电容易爆问题

我公司有2个电容补偿柜,一个手动投入,一个自动投入,一个柜有21个电容,平均15Kvar一个,(因为换得太杂,牌子和容量也不一样了)10多年的公司,似乎一到夏季电容就很容易引起爆炸,可是环境温度才28度以下,这几天又开始有电容爆的情况,不知道什么原因.各位 ...…

查看全部问答>

用IAR编写stm32程序实现计算器的加减乘除

                                 如题啦,呵呵…

查看全部问答>

请高手指教,stm32f107host问题

请教stm32f107 host驱动,读写U盘。st未提供可借鉴的host demo?如何办呀? 那位高人有stm32f107的host开发经验,请赐教!…

查看全部问答>

CCS4.2 的证书和签证文件

CCS4.2均能够注册成功,我试了可以成功,430模块还含有FR系列  TI MSP-EXP430FR5739,也可以编译程序!…

查看全部问答>

LM3S9B96 + 无线 wifi zigbee 蓝牙 。。。终结。。。

最近发现好多嵌入式工作都需要有无线模块的经验于是就对wifi,蓝牙以及zigbee做了个小小的研究突然发现手上的LM3S9B96也可以很强大的支持这些接口这里和大家分享一下  说到wifi,蓝牙以及zigbee,肯定要提的是LM3S9B96的EPI接口和EM2扩展板了 ...…

查看全部问答>