打印

TM4c123捕获计数问题

[复制链接]
3490|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sc机器猫|  楼主 | 2015-1-7 00:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教为什么下面程序明明捕获值是3,可为什么单片机实际情况却是复位后第一次捕获值是3,以后却是4了,搞了好久始终想不通,请大神帮帮忙吧。
/*******************************************
开发坏境:CCSv5.4
开发板:TIVA C Launchpad(TM4C123GH6PM)
程序功能:16位定时器,计数捕获模式,递增计数模式
程序说明:捕获引脚PB6,当捕获边沿数达到Match时产生中断
编程者:Linchpin
********************************************/
#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"


int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
        //5分频,使用PLL,外部晶振16M,system时钟源选择 main osc。系统时钟40MHZ
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
            //使能TIMER0 32位(TIMER0A16位+TIMER0B16位)
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        //使能GPIOF和GPIOC外设
        GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
        GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_6);
        GPIOPinConfigure(GPIO_PB6_T0CCP0);    //#define GPIO_PC4_WT0CCP0   0x00021007
        GPIOPinTypeTimer(GPIO_PORTB_BASE, GPIO_PIN_6);


        //计数捕获模式,上升沿捕获,Two half-width timers
        TimerConfigure(TIMER0_BASE,TIMER_CFG_A_CAP_COUNT_UP|TIMER_CFG_SPLIT_PAIR);
        //捕获模式,A定时器,上升沿捕获,增计数模式,到达匹配值后可自动清零
        TimerControlEvent(TIMER0_BASE,TIMER_A,TIMER_EVENT_POS_EDGE);
        //TimerLoadSet(TIMER0_BASE, TIMER_A, 6);//溢出值6
        TimerMatchSet(TIMER0_BASE, TIMER_A, 3);//匹配值3
        TimerIntEnable(TIMER0_BASE, TIMER_CAPA_MATCH);
        IntEnable(INT_TIMER0A);
        IntMasterEnable();
    //master interrupt enable API for all interrupts
        TimerEnable(TIMER0_BASE, TIMER_A);
        while(1)
        {
        }
}


void Timer0IntHandler(void)
{


        TimerIntClear(TIMER0_BASE,TIMER_CAPA_MATCH);
    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 14);
    SysCtlDelay(SysCtlClockGet() / 30);//100ms
    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0);


}


相关帖子

沙发
dirtwillfly| | 2015-1-8 20:47 | 只看该作者
@xyz549040622
帮忙给看看  

使用特权

评论回复
板凳
xyz549040622| | 2015-1-8 21:18 | 只看该作者
看着程序的配置是没问题的,你加个断点,看看第二次的4是怎么来的了,跟踪运行一遍看看

使用特权

评论回复
地板
xyz549040622| | 2015-1-8 21:21 | 只看该作者
发现个问题,你定时器的终端中,居然有延时函数,把延时函数去掉试试

使用特权

评论回复
5
sc机器猫|  楼主 | 2015-1-9 00:55 | 只看该作者
应该不是延时问题,我加断点后从maim函数开始运行第一次在while循环里要用三次上升沿后进入中断,从中断出来之后的每一次在while循环里要四次上升沿后才进入中断,我就纳闷了,见鬼了这是,还是timerintclear函数这清除中断标志后下一次上升沿从0开始记,如果这样就符合了。。。

使用特权

评论回复
6
sc机器猫|  楼主 | 2015-1-9 00:56 | 只看该作者
xyz549040622 发表于 2015-1-8 21:21
发现个问题,你定时器的终端中,居然有延时函数,把延时函数去掉试试

应该不是延时问题,我加断点后从maim函数开始运行第一次在while循环里要用三次上升沿后进入中断,从中断出来之后的每一次在while循环里要四次上升沿后才进入中断,我就纳闷了,见鬼了这是,还是timerintclear函数这清除中断标志后下一次上升沿从0开始记,如果这样就符合了。。。

使用特权

评论回复
7
xyz549040622| | 2015-1-9 08:00 | 只看该作者
sc机器猫 发表于 2015-1-9 00:56
应该不是延时问题,我加断点后从maim函数开始运行第一次在while循环里要用三次上升沿后进入中断,从中断 ...

断点看看,清中断后,计数器的值,是从什么开始呢,跟踪寄存器的值

使用特权

评论回复
8
sc机器猫|  楼主 | 2015-1-9 23:53 | 只看该作者
xyz549040622 发表于 2015-1-9 08:00
断点看看,清中断后,计数器的值,是从什么开始呢,跟踪寄存器的值

果然跟我想的一样,按你说的跟踪调试后发现有两个寄存器GPTMTAV,GPTMTAR的值增到3时不自动清零而是等到下次上升沿才清零,与timerintclear函数无关系,timerintclear函数只清除GPTMRIS,GPTMMIS寄存器值,现在就不知道怎样清除两个寄存器GPTMTAV,GPTMTAR的值,期待你的解答??

使用特权

评论回复
9
xyz549040622| | 2015-1-10 22:53 | 只看该作者
sc机器猫 发表于 2015-1-9 23:53
果然跟我想的一样,按你说的跟踪调试后发现有两个寄存器GPTMTAV,GPTMTAR的值增到3时不自动清零而是等到 ...

你用MDK打开timer.h看看操作说明寄存器的说明,也可以直接操作寄存器的值

使用特权

评论回复
10
四夕月月鸟| | 2015-7-24 15:37 | 只看该作者
问一下  有人用过捕获计时的吗,用来读高电平时间大小。两个边沿的时刻读出来总是很奇怪

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝