工具/软件:Code Composer Studio
您好!
再次感谢大家引导我解决各种疑问。 现在、我在计时器部分工作、并通过切换 GPIO 引脚的计时器生成中断。 毫无疑问、中断工作正常、但我希望中断精确到1微秒 、并且需要同时切换 GPIO。 有没有人能指导我如何在定时器中断中执行这些操作并进行清晰的解释?
此致
NiranjanCD
// // // timers.c -计时器示例。 // //版权所有(c) 2012-2016德州仪器(TI)公司。 保留所有权利。 //软件许可协议 // //德州仪器(TI)提供此软件仅供 和//仅供 TI 的微控制器产品使用。 软件归 // TI 和/或其供应商所有,并受适用的版权 //法律保护。 您不能将此软件与"病毒"开源 //软件组合在一起以形成更大的程序。 // //此软件按“原样”提供,且存在所有故障。 //对于 本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何 //情况下、TI 不对任何 原因造成的特殊、意外或必然//损害负责。 // //这是 EK-TM4C123GXL 固件包版本2.1.3.156的一部分。 //// ***************** #include #include #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/debug.h" #include "driverlib/fpu.h" #include "driverlib/gpio.h"#include "driverlib/interrupt.h" #include "driverlib/driverlib"#driverlib/driver.h"#include"#driverlib.driverlib/driverlib.driverlib.mdio.md小时 #include "#include "driverlib"#include "driverlib/driverlib"#driverlib.util.ide"#include "driverlib"#include "driverlib/driver.h"#include "driver.h"#include "driverlib"#driverlib.mdio.md // //! \addtogroup example_list //!计时器(计时器)
//! //! 此示例应用演示了如何使用计时器来生成 //! 周期性中断。 一个计时器设置为每秒中断一次和 //! 另一个中断每秒中断两次;每个中断处理程序将切换 //! 显示屏上有自己的指示灯。 //! //! UART0、连接到虚拟串行端口、运行速度为115、200、8-N-1、 //! 用于显示来自此应用程序的消息。 //// ***************** // // //包含 UART 上显示的中断指示符当前值的标志//。 //// ***************** //uint32_t g_ui32Flags; 静态无符号字符测试[4]={0x00、0x01、0x10、0x11}; //********* // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *dpcFilename、uint32_t ui32Line) { #endif //********* // //第一个定时器中断的中断处理程序。 //// ***************** void Timer0IntHandler (void) { UARTprintf ("#\n"); // //清除计时器中断。 // ROM_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT); GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、TEST[0]); GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、TEST[2]); /*ROM_IntMasterDisable(); UARTprintf ("#\n"); ROM_IntMasterEnable();*/ } //********* // //第二个计时器中断的中断处理程序。 //// ***************** void Timer1IntHandler (void) { UARTprintf ("$\n"); // //清除计时器中断。 // ROM_TimerIntClear (Timer1_base、timer_TINA_TIMEOUT); GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、TEST[1]); GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、TEST[3]); /*ROM_IntMasterDisable(); UARTprintf ("$\n"); ROM_IntMasterEnable();*/ } //********* // //配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。 //// ***************** void ConfigureUART (void) { // //启用 UART 使用的 GPIO 外设。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //启用 UART0 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //为 UART 模式配置 GPIO 引脚。 // ROM_GPIOPinConfigure (GPIO_PA0_U0RX); ROM_GPIOPinConfigure (GPIO_PA1_U0TX); ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } //********* // //此示例应用演示了如何使用计时器生成 //周期性中断。 //// ***************** int main (void) { // //为中断处理程序启用怠惰堆栈。 这允许使用浮点 //在中断处理程序中使用的指令,但代价是 //额外的堆栈用法。 // ROM_FPULazyStackingEnable(); // //将时钟设置为直接从晶体运行。 // //rom_SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | //sysctl_XTAL_10MHz); SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |//10MHz 时钟频率 SYSCTL_XTAL_10MHz); // //初始化 UART 和写入状态。 // ConfigureUART(); UARTprintf ("\033[2JTimers 示例\n"); UARTprintf ("t1:0 t2:0"); // //启用用于板载 LED 的 GPIO 端口。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); // //为 LED 启用 GPIO 引脚(PF1和 PF2)。 // ROM_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_4); // //启用此示例使用的外设。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_Timer1); // //启用处理器中断。 // ROM_IntMasterEnable(); // //配置两个32位周期定时器。 // ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE); ROM_TimerConfigure (Timer1_base、timer_CFG_PERIODICRACRACASE); TimerLoadSet (TIMER0_BASE、TIMER_A、ROM_SysCtlClockGet ()); TimerLoadSet (Timer1_base、timer_A、ROM_SysCtlClockGet ()); // //设置计时器超时的中断。 // ROM_IntEnable (INT_TIMER0A); ROM_IntEnable (INT_TIMER1A); ROM_TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT); ROM_TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT); // //启用计时器。 // ROM_TimerEnable (TIMER0_BASE、TIMER_A); ROM_TimerEnable (Timer1_base、timer_A); // //在计时器运行时永久循环。 // while (1) { } }