This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C123GH6PM:定时器中断

Guru**** 2451110 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/624089/ccs-tm4c123gh6pm-timer-interrupt

器件型号:TM4C123GH6PM

工具/软件: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) { } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Niranjan kumar85"] TimerLoadSet (TIMER0_BASE、TIMER_A、ROM_SysCtlClockGet ());[/引用]

    上面的代码行将 Timer0设置为每1秒中断一次。 因此、将 ROM_SysCtlClockGet ()除以1000000、Timer0每1us 或0.000001秒中断一次。

    您的问题也更适合在 TI TM4C 论坛上提出。  

    -kel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Markel Robregado">您的问题也更适合在 TI TM4C 论坛上提出。  [/报价]

    同意。 我将把它移到那个论坛。

    谢谢!

    Ki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Niranjan kumar85"]需要精确到1微秒的中断 ,并且需要同时切换 GPIO。

    这可能是一个语言问题-我不清楚(海报的文字现在)是什么"确切"被问。

    • 您是否要求定时器中断的连续流程-每个/每个中断以1µS μ s 的间隔到达?   如果是、您(和之前的海报)是否"思考过这一点?"   您必须"处理"该中断-并且"中断响应时间(延迟)加上 ISR 中的时间的组合"-不得超过(同样) 1µS!  (这是有疑问的——不是吗?)
    • 您是否在该计时器中断中搜索"切换 GPIO"?   如果是- MCU 是否需要(部分)时间来执行该"GPIO 切换"指令-因此违反了您对"确切?"的要求   (即切换将始终在进入 ISR 后发生-它不能"重合"(精确)!

    您对 MCU 手册的阅读应揭示"中断请求"对"中断服务"的"最佳情况"响应。   您意识到(其他)中断可能会共存、并与您的计时器竞争、以引起 MCU 的注意、您不会这样做吗?   有一些策略可能会"提升"您选择的中断、以便它"支配"所有其他中断-从而获得最快的服务-并且可能(甚至)侵入(另一个)中断"正在处理"。

    您能否回答列出的2个不确定因素-以及(明显)无法满足您的需求(?) 更改为"切换 GPIO @的时间与中断完全相同。"

    从未提到/从未提到过此类行为的海报要求-通常是那些具有丰富经验/历史的行为-可能会设想"不同的方式"(或许更出色)达到(任何)特定目标...  (当然-不能-当此类(需要)被扣留时!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

      我的查询是否能够生成1微秒的计时器中断 、并且可以在中断上切换 GPIO。 微控制器需要以80MHz 或更低的频率运行。

    此致

    NiranjanCD

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    持续中断产生时间为1微秒
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    仍然不是很清楚! 您是否正在寻找连续系列的 MCU 中断-每个中断相隔一1µS μ s?

    如果这说明了您的要求-您仍在寻求(仍然)"切换 GPIO"-您是否已(之前)建议您尝试确定"是否"这是可能的? 您在这方面一直保持沉默。

    海报规定其"解决方法"无法完全实现其执行时、该海报"方法"可能值得(部分)重新思考。   (即利用他人的经验!)

    如果(实际)目标是可靠的切换 GPIO 输出(@ 1MHz)-"订购的定时器进入 PWM 模式-(更好)实现该目标吗?"   (因此、计时器的输出是"自动"的-因此"避免"中断延迟和代码执行损失...)