基于STM32定时器输入捕获解析

发布者:Yuexin888最新更新时间:2024-08-21 来源: elecfans关键字:STM32  定时器  输入捕获 手机看文章 扫描二维码
随时随地手机看文章

输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边         沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等


例如:我们用到TIM5_CH1来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候TIM5_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的TIM5_CNT值。这样,前后两次TIM5_CNT之差,就是高电平的脉宽,同时TIM5的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。

首先TIMx_ARR和TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频。


再来看看捕获/比较模式寄存器1:TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有用;TIMx_CCMR1明显是针对2个通道的配置,低八位[7:0]用于捕获/比较通道1的控制,而高八位[15:8]则用于捕获/比较通道2的控制,因为TIMx还有CCMR2这个寄存器,所以可以知道CCMR2是用来控制通道3和通道4。


这里用到TIM5的捕获/比较通道1,我们重点介绍TIMx_CMMR1的[7:0]位(其实高8位配置类似)。


再来看看捕获/比较使能寄存器:TIMx_CCER;

接下来我们再看看DMA/中断使能寄存器:TIMx_DIER,我们需要用到中断来处理捕获数据,所以必须开启通道1的捕获比较中断,即CC1IE设置为1。

控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的;

最后再来看看捕获/比较寄存器1:TIMx_CCR1,该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从TIMx_CCR1就可以读出通道1捕获发生时刻的TIMx_CNT值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。

使能捕获和更新中断(设置TIM5的DIER寄存器)

因为我们要捕获的是高电平信号的脉宽,所以,第一次捕获是上升沿,第二次捕获时下降沿,必须在捕获上升沿之后,设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出,对溢出必须做处理,否则结果就不准了。这两件事,我们都在中断里面做,所以必须开启捕获中断和更新中断。

1 void init_tim2_cam(u16 psc, u16 arr, u8 way, u8 dir)

2 {

3 RCC-》APB1ENR |= 1 《《 0; //使能定时器2时钟

4 RCC-》APB2ENR |= 1 《《 2; //使能PortA

5

6 switch (way)

7 {

8 case 1:

9 GPIOA-》CRL &= 0xfffffff0;

10 GPIOA-》CRL |= 0x00000008;

11 break;

12 case 2:

13 GPIOA-》CRL &= 0xffffff00;

14 GPIOA-》CRL |= 0x00000088;

15 break;

16 case 3:

17 GPIOA-》CRL &= 0xfffff000;

18 GPIOA-》CRL |= 0x00000888;

19 break;

20 case 4:

21 GPIOA-》CRL &= 0xffff0000;

22 GPIOA-》CRL |= 0x00008888;

23 break;

24 }

25

26 TIMER-》PSC = psc;

27 TIMER-》ARR = arr;

28

29 switch (way)

30 {

31 case 4:

32 TIMER-》CCMR2 |= 1 《《 8;

33 if (dir == 0)

34 TIMER-》CCER |= 1 《《 13; //下降沿捕获

35 else

36 TIMER-》CCER &= ~(1 《《 13); //上升沿捕获

37 TIMER-》CCER |= 1 《《 12;

38 TIMER-》DIER |= 1 《《 4;

39 case 3: //CCR3 PA2

40 TIMER-》CCMR2 |= 1 《《 0;

41 if (dir == 0)

42 TIMER-》CCER |= 1 《《 9; //下降沿捕获

43 else

44 TIMER-》CCER &= ~(1 《《 9); //上升沿捕获

45 TIMER-》CCER |= 1 《《 8;

46 TIMER-》DIER |= 1 《《 3;

47 case 2: //CCR2 PA1

48 TIMER-》CCMR1 |= 1 《《 8; //CCR2配置通道方向:输入

49 if (dir == 0)

50 TIMER-》CCER |= 1 《《 5; //下降沿捕获

51 else

52 TIMER-》CCER &= ~(1 《《 5); //上升沿捕获

53 TIMER-》CCER |= 1 《《 4; //CCR2通道捕获使能

54 TIMER-》DIER |= 1 《《 2; //CCR2通道允许捕获中断

55 case 1: //》CCR1 PA0

56 TIMER-》CCMR1 |= 1 《《 0; //CCR1配置通道方向:输入

57 if (dir == 0)

58 TIMER-》CCER |= 1 《《 1; //下降沿捕获

59 else

60 TIMER-》CCER &= ~(1 《《 1); //上升沿捕获

61 TIMER-》CCER |= 1 《《 0; //CCR1捕获使能

62 TIMER-》DIER |= 1 《《 1; //CCR1通道允许捕获中断

63 break;

64 }

65 TIMER-》DIER |= 1 《《 0; //允许更新中断

66 MY_NVIC_Init(1, 2, TIM2_IRQChannel, 2); //中断

67 TIMER-》CR1 = 0x01; //使能定时器

68 TIMER-》SR &= ~(1 《《 0);

69 }

关键字:STM32  定时器  输入捕获 引用地址:基于STM32定时器输入捕获解析

上一篇:STM32标准外设库的文件结构解析
下一篇:simulink开发STM32串口函数的步骤

推荐阅读最新更新时间:2024-11-02 14:44

STM32的CAN波特率计算
STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用. bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟: APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的, 然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图: 有了上边的这个图,基本就清楚了. 总线时钟MHz (3+TS1+TS2)*(BRP+1) ===============================
[单片机]
<font color='red'>STM32</font>的CAN波特率计算
stm32 FSMC-外扩SRAM IS62WV51216
引脚定义 FSMC配置步骤 1.使能对应引脚GPIO时钟 2.配置GPIO引脚模式 3.使能FSMC时钟 4.FSMC初始化 5.存储器块使能 举例 #define Bank1_SRAM3_ADDR ((u32)(0x68000000)) //首地址0x60000000,每块0x40000000 void SRAM_gpio_init() { GPIO_InitTypeDef gpiof = { GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12
[单片机]
<font color='red'>stm32</font> FSMC-外扩SRAM IS62WV51216
STM32设置为I2C从机
硬件平台:STM32F401 编辑器 : keil 5.18 操作系统:win7 一、I2C协议 在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变 。 起始和停止条件   SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件;   SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。 寻址方式(7/10位地址方式)   第一个字节的头7 位组成了从机地址,最低位(LSB)是第8 位,它决定了传输的 普通的和带重复开始条件的7位地址格式方向。第一个字节的最低位是“0”,表示主机会写信息到
[单片机]
STM32学习笔记——测试闪灯程序
//所使用的是STM32F103C8共有48个管脚,共有两组GPIO,为GPIOA和GPIOB,每组有从0到15共16个引脚 //注意对STM32F103C8的操作和对库函数的使用,在使用时,要时刻参考《STM32F10xxx使用手册》和《STM32的函数说明》这两个文档 #include stm32f10x_lib.h GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO配置的结构体变量 包括GPIO引脚,引脚速度,引脚模式 ErrorStatus HSEStartUpStatus; //枚举类型,错误状态变量定义 存储外部高速时钟HSE状态
[单片机]
基于STM32,低速CAN通信的收发器芯片选择问题
本电路系统第一版测试电路使用的CAN收发器芯片为philips公司生产的TJA1050,电路参考了战舰STM32开发版的电路,如下图。 电路测试没有问题,但是性能不能满足工程要求。经测试在STM32F103C8T6芯片上,工作于24MHZ,在代码中设置SJW,BS2,BS1,BRP分别为1,8,7,125时可以实现12kbps的速率,可正常发送与接收数据。在外部条件最优的前提下,12kbps约对应于5KM的理论通信距离,这显然距离CAN的5kbps对应的10KM距离还有一定差距。现如今,最低通信速率为1,8,7,128配置下的波特率,如果再低则无法正常通信。为达到更远通信距离的目的,我们必须想办法将通信速率降下来。 开
[单片机]
基于<font color='red'>STM32</font>,低速CAN通信的收发器芯片选择问题
单片机通过定时器来实现多任务
在单片机系统中,有许多情况下需要等待某个事件的发生,来继续下一步操作,如果有一个任务还好说,单片机可以无限等待事件的发生,但是如果单片机要处理多个事件时,这种系统一般不能实现,除非用中断,对!用中断,但是中断源的数量是有限的,并且有很多中断源是针对特殊用处,这样能给我自由分配的中断源就只有定时器中断和外部中断,如果仅使用这几个中断源来实现异步,这样可实现的异步事件时非常有限的,每个中断源完成一个异步事件,效率是相当低,大大降低了系统的性能,降低了定时器的利用率. 因此在这里我考虑使用定时器中断来实现多个事件的异步,一个定时器如何实现多个任务的并发? 在这里使用一个任务一个计数器,根据任务实时性的强弱,来设计任务计数器的计数溢出值,
[单片机]
怎么解决STM32(MDK)中不能使用printf()函数的问题
简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_
[单片机]
怎么解决<font color='red'>STM32</font>(MDK)中不能使用printf()函数的问题
STM32独立看门狗IWDG时限的确定
看门狗定时时限= IWDG_SetReload()的值 / 看门狗时钟频率 看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数 1.STM32 看门狗的 例子 IWDG的时限定为280微秒。这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微小的变化。 /* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency dispersion) ------------------------------------------------------------- */ /* Enable write acces
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved