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.

[参考译文] TM4C123GH6PM:定时器中断处理程序有问题

Guru**** 1794070 points
Other Parts Discussed in Thread: EK-TM4C123GXL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/572576/tm4c123gh6pm-problem-with-timer-interrupt-handler

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件:EK-TM4C123GXL

我使用的是 IAR Workbench。 EK-TM4C123GXL launchpad

我编写了代码以获得方波2毫秒周期、50%占空比。

下面的代码工作正常。 我的问题是中断处理程序。 如何添加中断处理程序函数。 我为我的代码添加 了 cstartup_m.c 文件。 是不是添加正确的方法。 如果否、请分享正确的方式。

三、会议的报告 代码.................................................................

#include
#include
#include "inc/tm4c123gh6m.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"

volatile uint8_t state=0;

uint32_t freq=0;

空 TIMER0A_Handler (空)

TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
状态^=GPIO_PIN_1;
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、STY);


int main (空)

SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
SysCtlDelay(3);
FREQ = SysCtlClockGet (); // 40MHz
//GPIO 配置
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
SysCtlDelay(3);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0);

SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
SysCtlDelay(3);
TimerConfigure (TIMER0_BASE、TIMER_CFG_A_PERIODICASE);
TimerLoadSet (TIMER0_BASE、TIMER_A、39999); //持续1ms
IntMasterEnable();
TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
IntEnable (INT_TIMER0A);
TimerEnable (TIMER0_BASE、TIMER_A);

while (1){


................................................................................................................................

三、会议的报告 cstartup_m.c ........................................................................

/********
*
*此文件包含一个用 C 语言编写的 Cortex-M 的中断向量
*实际的中断函数必须由应用程序开发人员提供。
*
*版权所有2007 IAR Systems。 保留所有权利。
*
*$Revision:66254 $
*
(二 /

#pragma language=extended
#pragma 段="CSTACK"

extern void __IAR_program_start( void );

extern void NMI_Handler( void );
extern void HardFault_Handler( void );
extern void MemManage_Handler( void );
extern void BusFault_Handler( void );
extern void UsageFault_Handler( void );
extern void SVC_Handler (void);
extern void DebugMon_Handler (void);
extern void PendSV_Handler (void);
extern void SysTick 处理程序( void );

//..........................................................................
extern void TIMER0A_Handler( void );   //********
//..........................................................................
typedef void (* intfunc)(void);
typedef union{intfunc __funk;void *__ptr;}intvec_elem;

//矢量表通常位于地址0。
//在 RAM 中调试时、它可以位于 RAM 中、至少对齐到2^6。
//如果您需要定义中断服务例程,
//复制此文件并将其包含在项目中。
//名称"_vector_table"对于 C-SPY 具有特殊意义
//是查找 SP 起始值的位置。
//如果向量表不在地址0,用户必须初始化
//使用中断前的 NVIC 矢量表寄存器(VTOR)。


#pragma LOCATION =".intvec"
const intvec_elem __vector_table[]=

{.__ptr =__SFE ("CSTACK")},
_IAR_program_start、

NMI_Handler、
HardFault_Handler、
MemManage_Handler、
BusFault_Handler、
使用 Fault_Handler、
0、
0、
0、
0、
Svc_Handler、
DebugMon_Handler、
0、
PendSV_Handler、
SysTick 处理程序、
//..........................................................................
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
0、
TIMER0A_Handler                    //********
//..........................................................................
};

#pragma call_graph_root ="中断"
__weak void NMI_Handler( void ){ while (1){}}
#pragma call_graph_root ="中断"
__weak void HardFault_Handler( void ){ while (1){}}
#pragma call_graph_root ="中断"
__weak void MemManage_Handler( void ){ while (1){}}
#pragma call_graph_root ="中断"
__weak void BusFault_Handler( void ){ while (1){}}
#pragma call_graph_root ="中断"
__weak void UsageFault_Handler( void ){ while (1){}
#pragma call_graph_root ="中断"
__weak void SVC_Handler( void ){ while (1){}}
#pragma call_graph_root ="中断"
__weak void DebugMON_Handler( void ){ while (1){}}
#pragma call_graph_root ="中断"
__weak void PendSV_Handler( void ){ while (1){}}
#pragma call_graph_root ="中断"
__weak void SysTick 处理程序( void ){ while (1){}}

//..........................................................................
#pragma call_graph_root ="中断"
__weak void TIMER0A_Handler( void ){ while (1){}//  ********
//..........................................................................

void __cmain( void );
__weak void __IAR_init_core (void);
__weak void __IAR_init_vfp (void);

#pragma 必需='_vector_table
void __IAR_program_start( void )

__IAR_init_core();
_IAR_init_vfp ();
__cmain();

................................................................................................................................

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

    是的。 您需要在与计时器中断编号相对应的矢量位置添加中断处理程序、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Krishnat、
    可以使用计时器创建方波-至少对于学习计时器很好!
    但看看 PWM 外设。 如果您使用它、您将使方波正常工作、而不必再为此而烦恼 CPU。 它只是"初始化、启动并忘记它"、CPU 消耗为零。
    此致
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、 

    此代码工作正常。 未显示错误。

    我想知道、它是不是始终模式下的正确配置方式、ADC。

    另一个问题是,如果我使用以前的计时器和此 ADC,它是否正常工作。如果我缺少任何计时器,请告诉

     谢谢您的问候  

    Krishnat

    三、会议的报告  ADC 代码..........................................................................

    SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
    SysCtlDelay(3);
    FREQ = SysCtlClockGet ();


    //GPIO 配置
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    SysCtlDelay(3);
    GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0);


    //ADC 配置
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    SysCtlDelay(3);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    SysCtlDelay(3);
    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_2);
    ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_ALE一直、0);
    ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END);
    ADCSequenceEnable (ADC0_BASE、3);
    ADCIntClear (ADC0_BASE、3);


    while (1)

     while (!ADCIntStatus (ADC0_BASE、3、false){

     }
     ADCIntClear (ADC0_BASE、3);
     ADCSequenceDataGet (ADC0_BASE、3、&A[i]);

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

    您好!

    我希望您将向我发送上述 ADC 代码中的更正。
    我更需要的是、代码特定部分的 DRM 样式代码

    。 需要 Belo 部件的 DRM 样式代码..................................................................................................

    while (!ADCIntStatus (ADC0_BASE、3、false){


    ADCIntClear (ADC0_BASE、3);
    ADCSequenceDataGet (ADC0_BASE、3、&A[i]);
    ..................................................................................................

    这是因为、
    ADCSequenceDataGet (ADC0_BASE、3、&A[i]);//执行需要1047纳秒
    A[i]= ADC0->SSFIFO3 & 0XFFF;//执行所需的时间为477纳秒

    570纳秒的差异对我的代码产生了很大影响。
    我的脉冲宽度低于100 u 秒、无法进行扫描。
    如果一行代码产生570ns 的差异。
    然后 while (!ADCIntStatus... 会产生更大的影响。
    因此、我想为这部分代码制作 DRM 样式代码。

    此致、

    Krishnat

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

    当以最大采样率操作 ADC 控制器时、CPU 可能会有移动数据的开销。 您是否检查了 DMA 是否可以改为使用? 如果 DMA 不能用于您的应用程序、则需要任一 DRM。 此外、您还可以评估 ROM 版本的 API、因为它是单周期路径。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、您好!  

    代码的其他部分将执行一次、使用 API 时没有问题。

    我只想知道在下面的2行代码中对哪些寄存器进行寻址、因此我可以为这2行代码编写 DRM 样式代码。

    while (!ADCIntStatus (ADC0_BASE、3、false){};  -->不知道
    ADCIntClear (ADC0_BASE、3);                 --> 不知道
    ADCSequenceDataGet (ADC0_BASE、3、&A[i]);  --> A[i]= ADC0->SSFIFO3 & 0XFFF; <--我知道这一行

    此致、

    Krishnat

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

    您好、Krishnat、

    第一个优点:

    如何查看 TIVAWARE API 的源代码

    您很容易就能找到任何 TivaWare 函数内发生的情况! 只需"遵循代码":

    -在按住 CONTROL 的同时单击函数、CCS 可能会打开声明此函数的头文件。
    -假设您要查看 ADCIntEnable()-单击它并查看它在 ADC.h 上声明为 extern
    -嗯、有一个同名的.c 文件、它可以在项目的包含文件夹中找到。 打开该文件(adc.c)
    -找到此类文件中的函数,完整的代码就在这里!

    现在、"坏部件":

    在大多数情况下、通过将应用程序代码从 TivaWare 更改为 DRM、您将不会获得任何内容。

    - Tivaware 在您的 MCU 的 ROM 上有一个 API 副本。 它占用的闪存更少、速度更快
    您不必在 gazilion 时间重复代码
    -如果您将程序移植到另一个 TM4C MCU、您甚至不必费心寻找新的寄存器地址

    这些是否足够令人信服?

    谢谢

    布鲁诺

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

    您好!

    我在"始终"模式下找不到正确的 ADC 代码。

    我需要具有中断处理程序的 ADC。

    此致

    Krishnat

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

    中断处理程序将花费更多的 CPU 周期来加载和执行与您在中断处理程序之外执行的代码。 考虑到它是处于始终触发模式的 ADC、这会降低 CPU 执行速度。 我强烈建议改用 DMA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此线程称为"定时器中断处理程序的问题"

    如果我们继续在这里作出答复、这将是一个私人咨询、将来任何人都不会使用此信息来寻求具体问题的答案。 如果他有新的问题、我想询问海报、在论坛中搜索以前的帖子、或者创建一个具有特定标题的新主题、以便在以后对他人有用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    我想我之前和您谈谈 DMA。 我肯定会执行 ADC DMA 代码。
    在此之前、我想使用中断处理程序和/或轮询方法在始终触发模式下执行 ADC。
    我从数据表中获得了一些线索、明天我将提供解决方案。

    此致、
    Krishnat。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruno、
    我认为这不会导致私人咨询。
    因为...
    首先、我询问了计时器的中断处理程序
    其次、我要询问具有中断的始终模式下的 ADC
    最后、当我将这两个模块组合在一起时、会出现"HARDFAULT 错误"。。。我认为这与中断处理程序有关、并且与中断优先级相关。

    所有这些都已连接。

    完成后、我将在这里发布工作代码、因此像我这样的新手将获得一定的帮助。

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

    鉴于搜索词的多种多样以及主题的复杂性、在论坛上查找答案已经很难。

    想象一下、未来几个月、有人会遇到"在始终处于中断模式下询问 ADC"的问题。 假设有人今天在这条线程中为您提供了完美的答案。

    您是否认为有人会打开一个名为"定时器中断处理程序的问题"的线程、希望他的问题得到解决?

    无论如何、这就是我的"逻辑大脑"喜欢的工作方式。 一个新的员额是"免费的",可能会使事情变得更容易:其内容应尽可能与标题有关。 特别是、当第一个问题得到解决时、OP 应将其标记为已解决并继续-转到下一个帖子!!!

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    在这种情况下... 我只需将我的工作代码粘贴到名为 ADC 的其他帖子中、该帖子处于带有中断的始终模式。 论坛上有很多类似的帖子、但没有特定的答案。
    你也是对的。 但在每一步中、像我这样的新手都会遇到问题、并为同样的烦恼发布新帖子。

    此致、
    甲基什纳特