STM32 定时器用于外部脉冲计数

发布者:幸福时刻最新更新时间:2015-10-23 来源: eefocus关键字:STM32  定时器  外部脉冲 手机看文章 扫描二维码
随时随地手机看文章
因为用stm32f103c8作主控制器,来控制小车,小车的转速由两路光电编码盘输入(左右各一路).因此想到外部时钟触发模式(TIM——ETRClockMode2Config)。

     可以试好好久,发现TIM1不能计数,到网上查了很久,也没有找到相关的文章,开始怀疑TIM1是不是需要特殊设置。经过很久的纠结,终于找到了问题——其实是我自己在GPIO设置的时候,后面的不小心覆盖了前面的了——没想到自己也会犯这么SB的事情。

     现总结程序如下:

第一步,设置GPIO

GPIO_InitTypeDef GPIO_InitStructure;


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);

注意:(1)stm32f103c8只有TIM1_ETR(PA12,Pin33),和TIM2_CH1_ETR(PA0,Pin10)两个可以用。其它更多管脚的芯片,有更多的可以输入(如100管脚的有4个可以输入的);(2)外部时钟输入与中断无关;(3)stm32f103c8的这个两个应用中,不需要重映射。

对于哪些需要重映射,参考数据手册。

第二步:设置RCC

   RCC_ClocksTypeDef RCC_ClockFreq;

SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置.
RCC_GetClocksFreq(&RCC_ClockFreq);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

第三步,设置定时器模式

void TIM1_Configuration(void) //只用一个外部脉冲端口
{
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;


   //配置TIMER1作为计数器
   TIM_DeInit(TIM1);

   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // Time base configuration

TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);

TIM_SetCounter(TIM1, 0);
TIM_Cmd(TIM1, ENABLE);
}

void TIM2_Configuration(void) //只用一个外部脉冲端口
{
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;


   //配置TIMER2作为计数器
   TIM_DeInit(TIM2);

   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);

TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2, ENABLE);
}

第四步,可以在主函数中读取计数器的值,其它的应用,就看具体的情况了。

u16 COUN1=0;
u16 COUN2=0;

int main(void)
{
ChipHalInit();
ChipOutHalInit();

while(1)
{
   COUN1=TIM1->CNT;
   COUN2=TIM2->CNT;
}

 

}


关键字:STM32  定时器  外部脉冲 引用地址:STM32 定时器用于外部脉冲计数

上一篇:CS5550读写程序
下一篇:STM32的SPI接口

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

Stm32、STC的命名原则
去STC的官网看了看感觉真心很山寨,连数据手册都这么山寨风 真心不容易。 不过好用就行,感觉功能还挺强大的。支持国产。 STM32系列命名规则 STM32 F 103 C 6 T 7 xxx 1 2 3 4 5 6 7 8 第1部分:产品系列名, 固定为STM32 第2部分:产品类型; F表示这是Flash产品,目前没有其它选项 第3部分:产品子系列; 103表示增强型产品, 101表示基本型产品 105表示集成一个全速USB 2.0 Host/Device/OTG接口和两个具有先进过滤功能的CAN2.0B控制器, 107表示在STM32F105系列基础增加一个10/100以
[单片机]
<font color='red'>Stm32</font>、STC的命名原则
单片机的定时器与计数器
计数器 从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。那么单片机中的计数器有多大的容量呢?8031单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16位的计数器,最大的计数量是65536。 定时器 计数器除了能作为计数之用外,还能用作时钟,计数器是如何作为定时器来用? 计数和时间之间的确十分相关,一个闹钟将它定时在1个小时后闹响,也能说是秒针走了(3600)次,时间就转化为秒针走的次数。 iframe id="iframe_0.5592965197
[单片机]
单片机的<font color='red'>定时器</font>与计数器
stm32专题十一:串口通信(一) USART理论
/************************************************************************************************************/ RS232(负逻辑):由三条线(RX、TX、GND)组成。-15v ~ -3v代表逻辑1,+3 ~ +15v代表逻辑0,这里的±是相对于GND而言。 RS485:与232不同,485采用差分双绞线。RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义:正电平在+2V~+6V之问,表示一个逻辑状态;负电平在-2V~-6V之间,则表示另一个逻辑状态;数字信号采用差分传输方式,能够有效减少噪
[单片机]
<font color='red'>stm32</font>专题十一:串口通信(一) USART理论
单片机中Avr和Stm32区别及选取技巧详解
单片机的发展相当的迅速,现在各个厂商们也在速度、内存、功能上此起彼伏,竞争激烈,同时涌现出一大批拥有代表性单片机的厂商:Atmel、TI、ST、MicroChip、ARM…国内的宏晶STC单片机也是可圈可点。最为初学者首先要搞清楚他们之间的区别,掌握avr单片机选型技巧,才能够更好的设计产品。 一:avr单片机和STM32区别-STM32单片机介绍 由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成 本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的
[单片机]
使用STM32的TIMER进行外部计数
使用ETR引脚的输入信号作为计数时钟,本例程使用Timer 2,其ETR输入引脚为PA1,该引脚工作模式为输 入模式,Timer的工作模式为从模式;另外使用PC6输出一模拟方波时钟信号。 测试时将PC6与PA1短接。(用户也可另外连接一个时钟信号到PA1引脚上。) 代码见下: int main(void) { unsigned char i_Loop; unsigned char n_Counter; #ifdef DEBUG debug(); #endif RCC_Configuration(); // System Clocks Configuration NVIC_Configuration();
[单片机]
STM32串口多机通信
从设备采用漏极开路方式级联,从设备的串口TX必须配置为漏极开路,不能是推挽方式,如果配置成推挽方式,会导致灌电流过大,低电平低不下去问题 STM32 的UART数据寄存器是9位,数据传输先传低位(LSB) --实际应用发现9位数据大时候有丢包错包问题?? 利用USART可以进行多机处理器通信,其原理就是使从机处于静默模式,由主机在需要的时候发送指令唤醒从机,并传输数据。STM32静默模式特点:1、所有接收状态位都不会被设置;2、所有的接收中断都被禁止;3、USART_CR1寄存器中的RWU位被置1,RUW可以硬件自动控制或者在某些条件下由软件写。 连接方法很简单,主机的TX输出与从机的RX端口直接相连,从机TX端口要经过与
[单片机]
STM32 定时器正交编码器模式 寄存器配置程序
void Encoder_Init(void) { RCC- APB1ENR|=1 1; //TIM3时钟使能 RCC- APB2ENR|=1 2; //使能PORTA时钟 GPIOA- CRL&=0XF0FFFFFF;//PA6 GPIOA- CRL|=0X04000000;//浮空输入 GPIOA- CRL&=0X0FFFFFFF;//PA7 GPIOA- CRL|=0X40000000;//浮空输入 TIM3- DIER|=1 0; //允许更新中断 TIM3- DIER|=1 6; //允许触发中断 MY_NVIC_Init(1,3,TIM3_IRQChannel,2); TIM3- PSC = 0x0;/
[单片机]
STM32移植U8g2图形库的方法 实现OLED图形显示
之前的文章,介绍过ESP8266在Arduino IDE环境中使用U8g2库,实现OLED上的各种图形显示。 本篇,介绍一下U8g2库如何移植到STM32上,进行OLED的图形显示。 本次的实验硬件为: STM32:型号为最常见的STM32F103C8T6 OLED:0.96寸OLED,IIC接口(如果是SPI接口,文中也有对应的修改介绍) 1 U8g2简介 U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。 U8g2源码的开源库地址:https://github.com/olikraus/u8g2 2 移植步骤 首先下载U8g
[单片机]
<font color='red'>STM32</font>移植U8g2图形库的方法 实现OLED图形显示
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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