lpc1114通用定时器-捕获功能

发布者:Bby1978最新更新时间:2016-12-10 来源: eefocus关键字:lpc1114  通用定时器  捕获功能 手机看文章 扫描二维码
随时随地手机看文章

上一节,我们讲了在CAP脚上计数,这一节,我们用捕获功能测量CAP引脚上的频率。原理是获取两次下降沿的时间间隔,这个时间间隔即是脉冲信号的周期。

新建一个工程,结构如下图所示:

计数程序

在timer.h文件中,加入捕获测频的初始化函数T16B0_CAP_Init()的声明,如下所示:

  1. #ifndef __NXPLPC11xx_TIME_H__

  2. #define __NXPLPC11xx_TIME_H__

  1. extern void T16B0_init(void);

  2. extern void T16B0_delay_ms(uint16_t ms);

  3. extern void T16B0_delay_us(uint16_t us);

  4. extern void T16B0_cnt_init(void);

  5. extern void T16B0_CAP_Init(void);

  1. #endif

在timer.c文件中,加入T16B0_CAP_Init()函数的定义

  1. void T16B0_CAP_Init(void)

  2. {

  3.    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);  // 使能IOCON时钟

  4.    LPC_IOCON->PIO0_2 &= ~0x07;

  5.    LPC_IOCON->PIO0_2 |= 0x02;  /* CT16B0 CAP0 */

  6.    LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);  // 禁能IOCON时钟

  7.    LPC_SYSCON->SYSAHBCLKCTRL |= (0X1<<7);       // 使能TIM16B0时钟

  8.    LPC_TMR16B0->TCR = 0x02;          //复位定时器(bit1:写1复位)

  9.    LPC_TMR16B0->PR  = SystemCoreClock/100000-1;            //使10微妙TC+1

  10.    LPC_TMR16B0->IR  = 0x1F;           //CAP0中断复位

  11.    LPC_TMR16B0->CCR = 0x06;   // 下降沿中断

  12.    LPC_TMR16B0->MR0 = 0XFFFF; // 匹配值

  13.    LPC_TMR16B0->MCR = 0X01; // 与MR0匹配产生中断

  14.    LPC_TMR16B0->TCR = 0x01;

  15.    NVIC_EnableIRQ(TIMER_16_0_IRQn);      // 使能CT16B0中断

  16. }

以上语句的说明,基本上都在前面几个章节介绍过了。

第12和13行的配置,是一个“不得不使用的技巧”。原因是LPC1114的定时器没有溢出中断,即当定时器值递增到最大值,再回到0计数,不会产生中断。所以,我们在这里,给匹配寄存器MR0写入定时器的最大值,然后设置定时器与MR0匹配后产生中断,即可实现溢出中断的效果。在这里产生溢出中断,是为了让引脚上没有脉冲信号的时候频率为0。假如没有溢出中断,你做的车速表将停留在刹车一瞬间的车速不归0,这是一件多么悲催的作品!

在main.c中,输入以下代码:

  1. #include “lpc11xx.h”

  2. #include “timer.h”

  3. #include “uart.h”

  1. uint16_t temp;   //

  2. uint16_t freq;   //

  3. // 非精确延时

  4. void delay_ms(uint16_t ms)

  5. {

  6.    uint16_t i,j;

  1.    for(i=0;i<5000;i++)

  2.       for(j=0;j

  3. }

  1. void CLKOUT_EN(uint8_t CLKOUT_DIV)

  2. {

  3.    LPC_SYSCON->PDRUNCFG &= ~(0x1<<6);    // 看门狗振荡器时钟上电(bit6)

  4.    LPC_SYSCON->WDTOSCCTRL = 0X3F; // 0.6M/2*(1+31)=9375赫兹

  5.    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);       // 使能IOCON时钟

  6.    LPC_IOCON->PIO0_1=0XD1;          // 把P0.1脚设置为CLKOUT引脚

  7.    LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);     // 禁能IOCON时钟

  8.    LPC_SYSCON->CLKOUTDIV   = CLKOUT_DIV;

  9.    LPC_SYSCON->CLKOUTCLKSEL= 0X00000002;  // CLKOUT时钟源选择为看门狗时钟

  10.    LPC_SYSCON->CLKOUTUEN   =0;

  11.    LPC_SYSCON->CLKOUTUEN   =1;

  12.    while (!(LPC_SYSCON->CLKOUTUEN & 0x01));     // 确定时钟源更新后向下执行

  13. }

  1. void TIMER16_0_IRQHandler(void)

  2. {

  3.    if((LPC_TMR16B0->IR&0x10)==0x10) // 如果是CAP引起的中断

  4.    {

  5.       temp = LPC_TMR16B0->CR0;

  6.       LPC_TMR16B0->TC = 0;

  7.       freq = 100000/temp; // 把单位转换成赫兹

  8.    }

  9.    else if((LPC_TMR16B0->IR&0X01)==0X01) // 如果是MR0匹配引起的中断,即溢出中断

  10.    {

  11.       freq = 0;

  12.    }

  13.    LPC_TMR16B0->IR = 0X1F; // 清中断位

  14. }

  1. int main()

  2. {

  3.    UART_init(9600);

  4.    T16B0_CAP_Init();

  5.    CLKOUT_EN(200);//  9375/200=46Hz

  1.    while(1)

  2.    {

  3.       delay_ms(100);

  4.       UART_send_byte(freq);

  5.       UART_send_byte(freq>>8);

  6.    }

  7. }

从main函数第一条语句开始看起。

第42行,打开串口并设置串口波特率为9600。

第43行,初始化“16位定时器0”的CAP功能。

第44行,使能CLKOUT_EN引脚,并输出46Hz的频率信号。(关于CLKOUT功能和此函数的介绍,请看第一章,这里我们只是用它来产生一个我们要测量的频率信号。)

第45~50行,间隔100毫秒,发送串口一次测量到的频率,打开串口调试助手,选择好串口号和波特率,选择为16进制接收。把开发板上的P0.1脚,即CLKOUT引脚和P0.2脚,即CAP引脚相连,即可在串口调试助手上看到测量出的频率值。

第26~39行是“16位定时器0”的中断服务函数。

第28行,判断是否是CAP引起的中断。

第30行,读取CR0寄存器的值。当CAP引脚上有下降沿中断产生,CR0就会自动获取当前定时器的值,存到里面。

第31行,把定时器的当前值清0。

第32行,计算频率。在初始化的时候,我们把定时器的TC值设置为10毫秒增1,每次发生下降沿中断,就会读取定时器的值,再清0,所以读取出来的值就是周期,周期=1/频率,现在的周期值单位是10毫秒,所以换成赫兹以后,就是100000/temp。


关键字:lpc1114  通用定时器  捕获功能 引用地址:lpc1114通用定时器-捕获功能

上一篇:lpc1114通用定时器-PWM
下一篇:lpc1114通用定时器_计数功能

推荐阅读最新更新时间:2024-03-16 15:24

KST-STM32学习之PWM实现的各种途径(软件硬件+通用高级定时器)
一、STM32的通用定时器介绍 STM32F103ZE 拥有 TIM2、TIM3、TIM4 和 TIM5 共 4 个通用定时器。 STM32F103C8拥有TIM2/TIM3/TIM4这三个通用定时器 通用定时器除了具备基本定时器的向上计数器功能外,还可以向下、向上/向下计数。 此外还具备独立通道,能够实现输入捕获、输出比较、PWM 输出、单脉冲输出的功能。 二、输出比较产生PWM 1、产生PWM的几种方式 ①、硬件实现。比如STM32 自带的 PWM 输出功能。 注意了,硬件实现的时候,外部接线需要接到通用定时器的外部通道上! ②、通用定时器的输出比较实现软件的PWM,这个软件产生的PWM要比
[单片机]
STM32F103定时器输入捕获功能
  STM32F103单片机的定时器不仅能输出PWM波,而且还能捕获输入的PWM波。可以通过定时器的捕获功能测量输入PWM波的周期和占空比。   在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当发生捕获事件时,相应的CCxIF标志(TIMx_SR寄存器)被置1,如果开放了中断或者DMA操作,则将产生中断或者DMA请求。如果发生捕获事件时CCxIF标志已经为高,那么重复捕获标志CCxOF(TIMx_SR寄存器)被置1。写CCxIF=0可清除CCxIF,或读取存储在TIMx_CCRx寄存器中的捕获数据也可清除CCxIF。写CCxOF=0可清除CCxOF。  
[单片机]
LPC1114振荡器和时钟问题
ARM微控制器有一个显著的特点,就是都可以把时钟频率倍频到很高,具体到多高,每个系列的微控制器都有一个指标,我们现在要学的Cortex-M0内核处理器LPC1114最高能到50MHz,当然,其它的ARM内核微处理器可以倍频到更高,现在好多手机都采用了ARM内核处理器,比如卖的很火的诺基亚5233就是采用了ARM11处理器,ARM11的处理器的主频为433MHz,比Cortex-M0的50MHz高多了吧!所以Cortex-M0处理器被ARM称为入门级的内核! 要实现对系统时钟的配置,时钟配置图是必须要看懂的!因为它比文字更具有参考价值,看上这张图配置时钟,绝对不会出现漏洞!(我建议你把这张图打印出来贴到你的墙上,我就是这么
[单片机]
<font color='red'>LPC1114</font>振荡器和时钟问题
带你学习STM8自带输入捕获功能
最近在用 STM8 的过程中需要用到一个频率检测的功能,还好STM8S207的定时器中自带有输入捕获功能,之前还想着用定时器计数方式来实现的,但既然人家提供了该功能,那就试试吧,由于硬件里面接的是PC1引脚就只看了Timer1,其他的定时器应该也是类似的,看了资料之后发现 STM8 的输入捕获其实与STC12C5A60S2中的PCA捕获模式很类似,但是看资料没有后者清晰易懂。。。 在捕获模式中,基本上只用到了读进程,在 STM8 中有一个影子寄存器,但对于我们来说是看不到的,我们仅操作预装载寄存器即可。而且需要注意的是无论是计数器还是捕获/比较寄存器都是先读/写高8位,后读/写低8位数据。 在文档中给出了一个输入捕获
[单片机]
带你学习STM8自带输入<font color='red'>捕获</font><font color='red'>功能</font>
Cortex-M0 LPC1114中断优先级怎么设置
LPC1114的中断,由中断控制模块NVIC控制。一共32个中断,每个中断的优先级可编程为 0~3 四种级别。级别越高对应的优先级越低。因此,级别0 是最高的中断优先级。 设置中断优先级的函数,CMISIS已经写好,并嵌入到了编译器中,例如,我们用KEIL开发的话,设置中断优先级的函数位于core_cm0.h文件当中,函数如下所示: /** \brief Set Interrupt Priority The function sets the priority of an interrupt. \note The priority cannot be set for every core interrupt. \param IR
[单片机]
stm32通用定时器用做外部脉冲计数器的例程
最近几天要用到stm32对外部输入脉冲进行计数,很自然想到定时器,可是手上资料没有讲解stm32定时器如何用作外部计数器的,在网上找例程,也没找到几个正确的,自己硬着头皮仔细研究参考手册,终于知道如何配置了,并写了一个例程,希望将来对一些网友有用。 其实stm32通用定时器做计数器,对外部脉冲计数,还是比较简单的,使用外部时钟模式2即可轻松实现,但要注意,这种模式下,外部输入脉冲信号一定要接在相应TIM的ETR引脚上,不能接在TIMx_CHy引脚上。 使用stm32定时器的外部时钟模式2,主要就是通过配置TIMx_SMCR寄存器相应位。步骤如下: 1. 若不需要滤波器,置TIMx_SMCR寄存器中的ETF =0000 2
[单片机]
STM32F051R8T6的通用定时器配置
将系统时钟24分频,计数频率为48MHz/24 = 2MHz,则计一个数的时间为0.5us。计满1000个数的时间为0.5ms。这就是TIM3的定时周期。 void TIM3_Configuration(void) //每0.5ms发生一次更新事件(进入中断服务程序). { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_DeInit(TIM3); //重新将Timer设置为缺省值 TIM
[单片机]
cortex m0 lpc1114 RIS寄存器
这一节,介绍如何利用读取RIS寄存器检测引脚上的高低电平变化。 新建一个工程,结构如下图所示: 在main.c文件中,输入以下代码: #include “LPC11XX.H” #define LED1_ON LPC_GPIO1- DATA &= ~(1 0) #define LED1_OFF LPC_GPIO1- DATA |= (1 0) #define LED2_ON LPC_GPIO1- DATA &= ~(1 1) #define LED2_OFF LPC_GPIO1- DATA |= (1 1) #define KEY1_DOWN (LPC_GPIO1- DATA&(1 9))!=(1 9) #def
[单片机]
cortex m0 <font color='red'>lpc1114</font> RIS寄存器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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