你好。
我正在编写一个代码来测量振荡器电路555的周期。
我配置了两个计时器、Timer0A 每1秒用于中断、Timer1A 用于捕获模式。
Timer0A 中断工作正常、但 Timer1A 未被定向到中断。
遵循配置代码...
我已经就这个问题对论坛进行了研究,但我无法解决这个问题。
注:代码未完成、但未定向到中断。
谢谢你。
#define VET_Transmit 20 #define VET_PERIOD_FREQ 50 #define FREQ_MICRO 16000000.0 void Config_Clock (void); void Config_Timer (void); uint32_t g_ui32Clock; uint32_t Tempo = 0、allCaped = 0; volatile UINT32_t count、Edge1、Edge2、Edge2 Period[VET_PERIOD_FREQ]、t = 0、l = 0、 FLAG = 0、TX_INDEX = 0、TEMP = 0、segundo = 0; volatile float freq[VET_PERIOD_FREQ]、 CAP = 0、media_freq = 0、soma_freq = 0; char buffer[VET_transmit、I = 0; void main (void) { CONFIG_Clock(); CONFIG_Timer(); while (1) { 标志= 0;//初始化新捕捉的计数 IF (全培养= 1) { allCaped = 0; IF (Edge2 > Edge1) { //如果发生溢出,则忽略计算 Period[t]= Edge2 - Edge1; //计算周期 T++; Edge1 = Edge2; } } } void Config_Clock (void) { G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、 120000000); } void Config_Timer (void) { //------ 配置 TimerA0 Interupcao cada 1s--------------- // SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);//恢复时钟参数 o 计时器 TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICRACRACASE);//配置计时器参数可互连周期 TimerLoadSet (TIMER0_BASE、TIMER_A、g_ui32SysClock);//gera UMA interupcao a cada 1s TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT); TimerEnable (TIMER0_BASE、TIMER_A); IntEnable (INT_TIMER0A); ///---------------- Timer2A 模式捕捉--- // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);//启用用于输入边沿计数的 GPIO 端口 GPIOPinTypeTimer (GPIO_PORTM_BASE、GPIO_PIN_0);//将 PM0配置为定时器2A 上的正边沿捕获 GPIOPinConfigure (GPIO_PM0_T2CCP0); SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);//用于边沿计时模式 TimerConfigure (TIMER2_base、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME)); TimerControlEvent (TIMER2_base、TIMER_A、TIMER_EVENT_NEG_EDGE); TimerIntEnable (TIMER2_base、TIMER_CAP_EVENT); TimerEnable (TIMER2_base、TIMER_A);//启用计时器 IntEnable (INT_TIMER2A);//为计时器启用中断 IntMasterEnable(); } void Interrupt_Timer0A (void) { TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT); Tempo ++; } void Interrupt_Timer2A (void) { uint32_t InterruptFlags = TimerIntStatus (TIMER2_base、true); IF (InterruptFlags & TIMER_CAP_EVENT) { 如果(!flag) { //捕获第一个边沿计时器值并指示程序已在第一个边沿捕获 Edge1 = MAP_TimerValueGet (TIMER2_base、timer_A); Flag = 1; } //捕捉到下降沿后、存储完成采样的第二个上升沿的值 否则 IF (标志) { Edge2 = MAP_TimerValueGet (TIMER2_base、timer_A); //表示计算所需的全部三个边沿均已捕获并准备好计算 已全部捕捉= 1; } } //清除中断标志以使能中断再次发生。 TimerIntClear (TIMER2_base、TIMER_CAP_EVENT); }