主题中讨论的其他器件:TM4C123
工具/软件:TI C/C++编译器
你(们)好,查尔斯
为什么进入 ISR 时会有800ns 的延迟? ?
附加源代码和测量波形
//includes
#include // C99标准的变量定义。
#include // C99标准的输入和输出功能。
#include // C99标准的布尔定义。
#include "inc/tm4c123gh6pge.h"//中断和寄存器分配的定义。
#include "inc/hw_memmap.h"// Tiva C 系列器件的存储器映射定义。
#include "inc/hw_types.h"//常用类型和宏的定义。
#include "inc/hw_gpio.h"
#include "driverlib/sysctl.h"// DriverLib 系统控制 API 的定义和宏。
#include "driverlib/interrupt.h"//为 DriverLib 的 NVIC 控制器 API 定义和宏。
#include "driverlib/gpio.h"// DriverLib GPIO API 的定义和宏。
#include "driverlib/timer.h"//为 DriverLib 的计时器 API 定义和宏。
#include "driverlib/pin_map.h"//Mapping of peripherals to pins for all parts。
#include "driverlib/uart.h"// DriverLib UART API 的定义和宏。
#include "driverlib/adc.h"// DriverLib 的 ADC API 定义。
#include "driverlib/fpu.h"// FPU 操作例程的原型。
#include "utils/uartstdio.h"// UART 控制台函数的原型。
//需要通过相对链接添加"utils/uartstdio.c"。
//定义
#define UART1_BAUDRATE 115200 // UART 波特率(bps)
//函数原型
void init_timer (void);
void Duty_cycle (void);
void init_uart (void);
//全局变量
uint32_t sys_clock;
uint32_t start = 0、end = 0、length = 0;
uint32_t int_FLAG = 0;
int main (void
)
//在40MHz
SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN)上配置系统时钟;
SYS_CLOCK = SysCtlClockGet ();
//ISR 处理器周期
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
//使能处理器响应中断。
IntMasterEnable();
init_uart();
UARTprintf ("\n TCLK =%d\n",sys_clock);
// GPIO PD[2]-TA,PD[3]-TB 输出 ISR 处理时间的持续时间
GPIOPinTypeGPIOOutput (GPIO_PORTD_base,GPIO_PIN_2 | GPIO_PIN_3);
init_timer();
TimerEnable (TIMER0_BASE、TIMER_Both);
while (1){
GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、~GPIO_PIN_2);
如果(int_FLAG = 0x1)
{
INT_FLAG = 0;
//GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、GPIO_PIN_2);
UARTprintf ("\nDUTY:%d =%d (结束)-%d (开始)\n"、长度、结束、开始);
//GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、0);
}
}
void init_timer (void)
{
//启用和配置 Timer0外设。
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
//初始化计时器 A 和 B,以便在边沿计时模式中向上计数
TimerConfigure (TIMER0_BASE、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP | TIMER_CFG_B_CAP_TIME_UP));
// Timer A 记录位置边沿时间,Timer b 记录 neg 边沿时间
TimerControlEvent (TIMER0_BASE、TIMER_A、TIMER_EVENT_POS_EDGE);
TimerControlEvent (TIMER0_BASE、TIMER_B、TIMER_EVENT_NEG_EDGE);
//设置定时器计数的值
//输入信号20Mhz,TS=0.05us,SYSCLK 40MHz TC=0.025,计数= 0.05uS/0.025us = 2 (2-1=1 (0x1)
//输入信号1MHz,TS=1us ,SYSCLK 40MHz TC=0.025,计数=1uS/0.025us = 40 (40-1=39 (0x27)
//输入信号500kHz、TS=2us ,SYSCLK 40MHz TC=0.025,计数=2uS/0.025us = 80 (80-1=79 (0x4F)
//输入信号200kHz、TS=5us ,SYSCLK 40MHz TC=0.025,计数=5uS/0.025us = 200 (200-1=199 (0xC7)
//输入信号1kHz、 TS=1ms 、SYSCLK 40MHz TC=0.025、计数= 1ms/0.025us = 40000 (40000-1=39999 (0x9C3F)
TimerLoadSet (TIMER0_BASE、TIMER_Both、0x4F);
TimerSynchronize (TIMER0_BASE,TIMER_0A_SYNC|TIMER_0B_SYNC);
//配置定时器读取的引脚(PF0)
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
// TM4C Port-F0解锁并置位提交控制寄存器。 PA[1:0]、PA[5:2]、PB[3:2]、PC[3:0]、PD[7]、 PF[0]
HWREG (GPIO_PORTF_BASE + GPIO_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTF_BASE + GPIO_CR)|= GPIO_PIN_0;
// GPIO 配置,T0CCP0 (TA)-PF[0],T0CCP1 (TTB)-PF[1]
GPIOPinConfigure (GPIO_PF0_T0CCP0);
GPIOPinConfigure (GPIO_PF1_T0CCP1);
GPIOPinTypeTimer (GPIO_PORTF_BASE、GPIO_PIN_0 | GPIO_PIN_1);
//计时器中断清除(TA、TB)
TimerIntClear (TIMER0_BASE、TIMER_CAPA_EVENT|TIMER_CAPB_EVENT);
//启用指示的定时器中断源。
TimerIntEnable (TIMER0_BASE、TIMER_CAPA_EVENT|TIMER_CAPB_EVENT);
//在中断控制器中启用指定的中断。
IntEnable (INT_TIMER0A);
IntEnable (INT_TIMER0B);
}
// TIMERA、上升沿、中断 ISR
空时间0AIntHandler (空)
{
GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、GPIO_PIN_2);
TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
Start = TimerValueGet (TIMER0_BASE、TIMER_A);
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、0);
}
// TIMERB,下降沿,中断 ISR
空时间0BIntHandler (空)
{
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_3、GPIO_PIN_3);
TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);
结束= TimerValueGet (TIMER0_BASE、TIMER_B);
长度=结束-开始;
INT_flag = 1;
GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_3、0);
}
void init_UART (void)
{
//启用和配置 UART0以调试打印输出。
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、(GPIO_PIN_0 | GPIO_PIN_1));
UARTStdioConfig (0、UART1_AUDRATE、SYS_CLOCK);
} 
CH1:TimerA (T0CCP0)、CH2:TimerB (T0CCP1)、CH3:TimerA-ISR CH4:TimerB-ISR