《16位输入边沿定时捕获.docx》由会员分享,可在线阅读,更多相关《16位输入边沿定时捕获.docx(5页珍藏版)》请在金锄头文库上搜索。
1、源程序清单见程序清单1,其中黄色背景红色字体为错误的代码。该程序的功能是测量方波信号的频率,由串口输出显示。基本思路是:利用Timer0的TimerB的16位PWM功能产生一个方波作为被测信号,利用Timer2的TimerA定时捕捉功能捕捉被测信号的相邻两个上升沿,利用两次捕捉时的计数值计算出被测信号的频率。程序清单1实验源程序(有误)#includesystemInit.h#includeuartGetPut.h#include#include#definePART_LM3S1138#include/在CCP1管脚产生1KHz方波,为Timer2的16位输入边沿定时捕获功能提供时钟源void
2、 pulseInit(void)SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0);/使能TIMER0模块SysCtlPeriEnable(CCP1_PERIPH);/使能CCP1所在的GPIO端口GPIOPinTypeTimer(CCP1_PORT, CCP1_PIN);/配置相关管脚为Timer功能TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR |/配置TimerB为16位PWMTIMER_CFG_B_PWM);TimerLoadSet(TIMER0_BASE, TIMER_B, 6000);/设置TimerB初
3、值TimerMatchSet(TIMER0_BASE, TIMER_B, 3000);/设置TimerB匹配值TimerEnable(TIMER0_BASE, TIMER_B);/定时器16位输入边沿定时捕获功能初始化void timerInitCapTime(void)SysCtlPeriEnable(SYSCTL_PERIPH_TIMER2);/使能Timer模块SysCtlPeriEnable(CCP4_PERIPH);/使能CCP4所在的GPIO端口GPIOPinTypeTimer(CCP4_PORT, CCP4_PIN);/配置CCP4管脚为脉冲输入TimerConfigure(TI
4、MER2_BASE, TIMER_CFG_16_BIT_PAIR |/配置Timer为16位事件定时器TIMER_CFG_A_CAP_TIME);TimerControlEvent(TIMER2_BASE,/控制TimerA捕获CCP正边沿TIMER_A,TIMER_EVENT_POS_EDGE);TimerControlStall(TIMER2_BASE, TIMER_A, true);/允许在调试时暂停定时器计数TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT);/使能TimerA事件捕获中断IntEnable(INT_TIMER2A);/使能Tim
5、erA中断IntMasterEnable();/使能处理器中断/定义捕获标志volatile tBoolean CAP_Flag = false;/测量输入脉冲频率并显示void pulseMeasure(void)unsigned short i;unsigned short usVal2;char s40;TimerLoadSet(TIMER2_BASE, TIMER_A, 0xFFFF);/设置计数器初值TimerEnable(TIMER2_BASE, TIMER_A);/使能Timer计数for (i = 0;i 2;i+)while (!CAP_Flag);/等待捕获输入脉冲CAP_
6、Flag = false;/清除捕获标志usVali = TimerValueGet(TIMER2_BASE, TIMER_A);/读取捕获值TimerDisable(TIMER2_BASE, TIMER_A);/禁止Timer计数sprintf(s, %d Hzrn, (usVal0 - usVal1) / 6);/输出测定的脉冲频率uartPuts(s);/主函数(程序入口)int main(void)jtagWait();/防止JTAG失效,重要!clockInit();/时钟初始化:晶振,6MHzuartInit();/UART初始化pulseInit();timerInitCapTi
7、me();/Timer初始化:16位定时捕获for (;)pulseMeasure();SysCtlDelay(1500 * (TheSysClock / 3000);/Timer2的中断服务函数void Timer2A_ISR(void)unsigned long ulStatus;ulStatus = TimerIntStatus(TIMER2_BASE, true);/读取当前中断状态TimerIntClear(TIMER2_BASE, ulStatus);/清除中断状态,重要!if (ulStatus & TIMER_CAPA_EVENT)/若是TimerA事件捕获中断CAP_Flag = true;/置位捕获标志在源程序中,用两次捕捉时的计数值计算频率的公式有误。原公式为:f = (usVal0 - usVal1) / 6正确的公式应为:f = 6000000/(usVal0 - usVal1)