我的问题是我设置两个定时器为输入捕获,但是我debug的时候发现两个寄存器的值是乱跳的,根本不是有规律的,至于网上说的溢出问题,我觉得在我这不存在,因为我输入的是VPP=3v,频率为1Hz的方波信号,而且在while(1)里面我尝试读取寄存器的值,发现edge_count1和edge_count2的值总是为零,不知道为什么,希望能得到回复,谢谢大家了。
#include "driverlib.h"
#define TIMER_PERIOD 12500
#define MCLK_IN_HZ 25000000
#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x)))
#define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))
volatile uint16_t edge_count1,edge_count2;
void SystemClock_Init(void)
{
PMM_setVCore(PMM_CORE_LEVEL_3); //高主频工作需要较高的核心电压
//XT1引脚复用
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);
//起振XT1
UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);
//XT2引脚复用
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);
//起振XT2
UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);
//XT2作为FLL参考时钟,先8分频,再50倍频 4MHz / 8 * 50 = 25MHz
UCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);
UCS_initFLLSettle(25000, 50);
//XT1作为ACLK时钟源 = 32768Hz
UCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);
//DCOCLK作为MCLK时钟源 = 25MHz
UCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);
//DCOCLK作为SMCLK时钟源 = 25MHz
UCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);
//设置外部时钟源的频率,使得在调用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK时可得到正确值
UCS_setExternalClockSource(32768, 4000000);
}
//timer0_A5
void Timer_LCapture_init(){
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,GPIO_PIN2);
Timer_A_initContinuousModeParam TimerA0_Init = {0};
TimerA0_Init.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
TimerA0_Init.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
TimerA0_Init.timerClear = TIMER_A_DO_CLEAR;
TimerA0_Init.startTimer = true;
Timer_A_initContinuousMode (TIMER_A0_BASE,&TimerA0_Init);
Timer_A_initCaptureModeParam Capture_Init = {0};
Capture_Init.captureRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;
Capture_Init.captureMode = TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE;
Capture_Init.captureInputSelect = TIMER_A_CAPTURE_INPUTSELECT_CCIxA;
Capture_Init.synchronizeCaptureSource = TIMER_A_CAPTURE_SYNCHRONOUS;
Capture_Init.captureInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
Capture_Init.captureOutputMode = TIMER_A_OUTPUTMODE_OUTBITVALUE;
Timer_A_initCaptureMode(TIMER_A0_BASE,&Capture_Init);
Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE,
TIMER_A_CAPTURECOMPARE_REGISTER_1
);
}
/*Timer1_A3*/
void Timer_RCapture_init(){
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2,GPIO_PIN0);
Timer_A_initContinuousModeParam TIMERA1_Init = {0};
TIMERA1_Init.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
TIMERA1_Init.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
TIMERA1_Init.timerClear = TIMER_A_DO_CLEAR;
TIMERA1_Init.startTimer = true;
Timer_A_initContinuousMode (TIMER_A1_BASE,&TIMERA1_Init);
Timer_A_initCaptureModeParam Capture_Init = {0};
Capture_Init.captureRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;
Capture_Init.captureMode = TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE;
Capture_Init.captureInputSelect = TIMER_A_CAPTURE_INPUTSELECT_CCIxA;
Capture_Init.synchronizeCaptureSource = TIMER_A_CAPTURE_SYNCHRONOUS;
Capture_Init.captureInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
Capture_Init.captureOutputMode = TIMER_A_OUTPUTMODE_OUTBITVALUE;
Timer_A_initCaptureMode(TIMER_A1_BASE,&Capture_Init);
Timer_A_clearCaptureCompareInterrupt(TIMER_A1_BASE,
TIMER_A_CAPTURECOMPARE_REGISTER_1
);
}
void Timer_B_Init(){
Timer_B_initContinuousModeParam initContParam = {0};//定义连续模式结构体变量
initContParam.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;//选择SMCLK
initContParam.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_5;//不分频
initContParam.timerInterruptEnable_TBIE = TIMER_B_TBIE_INTERRUPT_DISABLE;//暂时不使能中断
initContParam.timerClear = TIMER_B_DO_CLEAR;//清除定时器
initContParam.startTimer = false;//暂时不开始计时
Timer_B_initContinuousMode(TIMER_B0_BASE, &initContParam);
//Initiaze compare mode
Timer_B_clearCaptureCompareInterrupt(TIMER_B0_BASE,//清楚定时器的中断标志位
TIMER_B_CAPTURECOMPARE_REGISTER_4
);
Timer_B_initCompareModeParam initCompParam = {0};
initCompParam.compareRegister = TIMER_B_CAPTURECOMPARE_REGISTER_4;//选择对应的捕获比较寄存器
initCompParam.compareInterruptEnable = TIMER_B_CAPTURECOMPARE_INTERRUPT_ENABLE;//使能定时器中断
initCompParam.compareOutputMode = TIMER_B_OUTPUTMODE_OUTBITVALUE;//选择输出模式
initCompParam.compareValue = 50000;//确定比较值
Timer_B_initCompareMode(TIMER_B0_BASE, &initCompParam);//初始化比较模式
Timer_B_startCounter( TIMER_B0_BASE,//开始计数
TIMER_B_CONTINUOUS_MODE
);
}
int main(){
WDT_A_hold(WDT_A_BASE); // 关闭看门狗
SystemClock_Init();
Timer_B_Init();
Timer_LCapture_init();
Timer_RCapture_init();
GPIO_setAsOutputPin(GPIO_PORT_P4,GPIO_PIN7);
while(1){
edge_count1 = Timer_A_getCaptureCompareCount(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1);//将此时的上升沿计数值存入变量
edge_count2 = Timer_A_getCaptureCompareCount(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1);//将此时的上升沿计数值存入变量
__bis_SR_register(LPM0_bits + GIE); //进入低功耗模式0,同时打开全局中断
}
}
#pragma vector=TIMER0_B1_VECTOR //中断 TIMER1_B1_VECTOR
__interrupt void TIMERB0_ISR (void)
{
static unsigned int CNT = 0;
switch(__even_in_range(TBIV,14))
{
case 8:{
GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN7);
if(CNT % 2 == 0)//记录第一次的上升沿Counter计数值
{
edge_count1 = Timer_A_getCaptureCompareCount(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1);//将此时的上升沿计数值存入变量
}
else if(CNT % 2 == 1)//检测到下降沿触发
{
edge_count2 = Timer_A_getCaptureCompareCount(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1);//将此时的下降沿计数值存入变量
}
break;
}
}
CNT++;
_BIC_SR_IRQ(LPM0_bits);
}
每一张图片进行一次debug,可以明显的发现不正常!