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:SysTick 中断问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/604345/tm4c123gh6pm-problem-with-systick-interrupt

器件型号:TM4C123GH6PM

大家好、我遇到了 SysTick 中断问题。 为了确保一切都正确、我从互联网上下载了工作代码、但也无法正常工作。 程序进入 HardFault_Handler 而不是 SysTick 处理程序。 您能不能帮助我、代码非常简单、我花了3天时间尝试找出问题所在。

整个项目文件: e2e.ti.com/.../Systickint.rar

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

    尽管我尚未打开.rar 存档文件、但您似乎忽略了在启动文件中填充 SysTick 处理程序的中断矢量。 我怀疑这会让您直接离开。

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

    启动文件如下所示。 我认为一切都是正确的。 您能在这里看到任何问题了。

    extern language=extended
    #pragma segment="CSTACACK"
    
    void __IAR_program_start( void );
    
    extern void NMI_Handler ( void );
    extern void HardFault_Handler( void );
    extern void
    BusFault_Handler ( void );
    extern void UsageFault_Handler ( void );
    void
    Pendon( void )
    
    extern void SysTick _Handler (void);
    
    typedef void (* intfunc)(void);
    typedef union{intfunc __fFun;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、
    UsageFault_Handler、
    0、
    0、
    0、
    0、
    SVC_Handler、
    DebugMON_Handler、
    0、
    PendSV_Handler、
    SysTick 处理
    
    程序};
    
    #pragma call_graph_root =“interrupt”
    __weak niNMI_Handler (void){ while (1){}
    #pragma call_graph_root =“interrupt”
    __weak HardFault_Handler (void){ while (1){}#pragma
    call_MemManage_root =“interrupt"
    __weak Hardault_Handler (void) {while (1){}#pragma
    call_graph_root ="interrupt"
    __weak BusFault_Handler (void){while (1)}{
    #pragma call_graph_root ="interrupt"
    __weak UsageFault_Handler (void){while (1)}}}#pragma
    call_graph_root ="interrupt"__ssvault 处理程序(void)
    {while (1){}#pragma
    call_graph_root ="interrupt"
    __weak DebugggMon_Handler (void){while (1)}{
    #pragma call_graph_root ="interrupt"
    __weak Pendvoid _Handler (void){while (1){}}#Syma
    call_graph_root ="interrupt"
    _ pragma void (void) {while (1){}
    
    
    void __cmain (void);
    __weak void __IAR_init_core (void);
    __weak void __IAR_init_vfp (void);
    
    #pragma required=__vector_table
    void __IAR_program_start (void)
    {_IAR_core()
    ;
    __Vfp_init_vfp
    
    (void);__Vfp (void) 

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

    您仍然没有显示中断例程或初始化。 不过、有两点很关键

    1. 切勿将未使用的向量设置为零
    2. 始终填充整个中断表

    这两者都很关键。

    这看起来与 TIVAWare 启动不同。 我建议使用它。

    Robert

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

    非常感谢 Robert。 3天后、它能正常工作、谢谢您。 但我注意到了一些奇怪的东西。 当我放置 printf ("%d\n"、NVIC_ST_CURRENT_R)时;在 while 循环中、为了查看 SysTick 的当前值、中断正常工作(LED 闪烁)。 但是、当我擦除该线路中断时、它停止工作并保持在主代码中的 while 循环中。 重要的一点是、我没有启用全局中断。 即使我在  while 循环中放置 printf ("%d\n"、NVIC_ST_CURRENT_R)时未启用全局中断、它也起作用。 我无法低估它的工作方式。 此外、在 SysTick 中断工作时、我放置一个 printf ("entered");在 SysTick 处理程序函数中 、为了确保程序进入该函数、它会进入 FaultISR。 printf()对 interrupts 有何影响。 我共享 startup 和 main 下面的代码。

    main.c

    #include 
    #include 
    #include "inc/tm4c123gh6m.h"
    
    
    volatile unsigned long counts=0;
    
    
    void SysTick _Init (unsigned long period){// priority 2
    NVIC_ST_CTRL_R = 0; //在设置过程中禁用 SysTick
    NVIC_ST_RELOAD_R = PERIO-1;//重新加载值
    NVIC_ST_CURRENT_R = 0; //对当前的任何写入都会将其清除
    NVIC_SYS_PRI3_R =(NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
    NVIC_ST_CTRL_R = 0x07;//使用内核时钟和中断启用 SysTick
    //完成所有初始化,然后启用中断
    }
    
    
    
    void SysTick 处理程序(void){
    GPIO_PORTF_DATA_R ^= 0x04; //切换 PF2
    计数=计数+ 1;
    // printf ("enter");
    }
    
    
    int main (void)
    {
    volatile uint32_t ui32Loop;
    
    //
    //启用用于板载 LED 的 GPIO 端口。
    //
    SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF;
    
    //
    //执行虚拟读取以在启用外设后插入几个周期。
    //
    ui32Loop = SYSCTL_RCGC2_R;
    计数= 0;
    //
    //为 LED 启用 GPIO 引脚(PF2)。 将方向设置为输出、然后
    //启用 GPIO 引脚以实现数字功能。
    //
    GPIO_PORTF_DIR_R = 0x04;
    GPIO_PORTF_AFSEL_R &=~0x04;//禁用 PF2上的 alt funt
    GPIO_PORTF_DEN_R = 0x04;
    GPIO_PORTF_PCTL_R =(GPIO_PORTF_PCTL_R&0xFFFFFF+ 0x00000000;
    GPIO_PORTF_AMSEL_R = 0; //禁用 PF 上的模拟功能
    
    SysTick Init (16000); //每1ms 初始化一次 SysTick 计时器
    //
    //永久循环。
    //
    while (1)
    {
    
    printf ("%d\n"、NVIC_ST_CURRENT_R);
    
    }
    }
    

    startup.c

    #include 
    #include "inc/hw_NVIC.h"
    #include "inc/hw_types.h"
    
    //*********
    //
    //为此源文件启用 IAR 扩展。
    ////
    *****************
    #pragma language=extended
    
    //*********
    //
    //转发默认故障处理程序的声明。
    ////
    *****************
    void ResetISR (void);
    static void NmiSR (void);
    static void FaultISR (void);
    extern void SysTick 处理程序(void);
    static void IntDefaultHandler (void);
    
    //
    //
    //应用程序启动代码的入口点。
    ////
    *****************
    extern void __IAR_program_start (void);
    
    //*********
    //
    //为系统堆栈保留空间。
    ////
    *****************
    静态 uint32_t pui32stack[64]@".noinit";
    
    //*********
    //
    //描述向量表条目的联合体。 需要使用 union
    //、因为第一个条目是栈指针、而余数是函数
    //指针。
    ////
    *****************
    typedef union
    {
    void (* pfnHandler)(void);
    uint32_t ui32Ptr;
    }
    uVectorEntry;
    
    //*********
    //
    //矢量表。 请注意、必须在这个上放置适当的结构、以
    //确保它在物理地址0x0000.0000处结束。
    ////
    *****************
    __root const uVectorEntry __vector_table[]@".intvec"=
    {
    {.ui32Ptr =(uint32_t) pui32Stack + sizeof (pui32Stack)}、
    //初始堆栈指针
    ResetISR、 //重置处理程序
    NmiSR、 // NMI 处理程序
    FaultISR、 //硬故障处理程序
    IntDefaultHandler、 // MPU 故障处理程序
    IntDefaultHandler、 //总线故障处理程序
    IntDefaultHandler、 //用法故障处理程序
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    IntDefaultHandler、 // SVCall 处理程序
    IntDefaultHandler、 //调试监视器处理程序
    0、 //保留
    IntDefaultHandler、 // PendSV 处理程序
    SysTick 处理程序、 // SysTick 处理程序
    IntDefaultHandler、 // GPIO 端口 A
    IntDefaultHandler、 // GPIO 端口 B
    IntDefaultHandler、 // GPIO 端口 C
    IntDefaultHandler、 // GPIO 端口 D
    IntDefaultHandler、 // GPIO 端口 E
    IntDefaultHandler、 // UART0 Rx 和 Tx
    IntDefaultHandler、 // UART1 Rx 和 Tx
    IntDefaultHandler、 // SSI0 Rx 和 Tx
    IntDefaultHandler、 // I2C0主机和从机
    IntDefaultHandler、 // PWM 故障
    IntDefaultHandler、 // PWM 发生器0
    IntDefaultHandler、 // PWM 发生器1
    IntDefaultHandler、 // PWM 发生器2.
    IntDefaultHandler、 //正交编码器0
    IntDefaultHandler、 // ADC 序列0
    IntDefaultHandler、 // ADC 序列1
    IntDefaultHandler、 // ADC 序列2.
    IntDefaultHandler、 // ADC 序列3.
    IntDefaultHandler、 //看门狗计时器
    IntDefaultHandler、 // Timer 0子计时器 A
    IntDefaultHandler、 // Timer 0子计时器 B
    IntDefaultHandler、 //计时器1子计时器 A
    IntDefaultHandler、 //计时器1子计时器 B
    IntDefaultHandler、 //计时器2子计时器 A
    IntDefaultHandler、 //计时器2子计时器 B
    IntDefaultHandler、 //模拟比较器0
    IntDefaultHandler、 //模拟比较器1
    IntDefaultHandler、 //模拟比较器2.
    IntDefaultHandler、 //系统控制(PLL、OSC、BO)
    IntDefaultHandler、 //闪存控制
    IntDefaultHandler、 // GPIO 端口 F
    IntDefaultHandler、 // GPIO 端口 G
    IntDefaultHandler、 // GPIO 端口 H
    IntDefaultHandler、 // UART2 Rx 和 Tx
    IntDefaultHandler、 // SSI1 Rx 和 Tx
    IntDefaultHandler、 //计时器3子计时器 A
    IntDefaultHandler、 //计时器3子计时器 B
    IntDefaultHandler、 // I2C1主设备和从设备
    IntDefaultHandler、 //正交编码器1
    IntDefaultHandler、 // CAN0
    IntDefaultHandler、 // CAN1
    IntDefaultHandler、 // CAN2
    0、 //保留
    IntDefaultHandler、 //休眠
    IntDefaultHandler、 // USB0
    IntDefaultHandler、 // PWM 发生器3.
    IntDefaultHandler、 // uDMA 软件传输
    IntDefaultHandler、 // uDMA 错误
    IntDefaultHandler、 // ADC1序列0
    IntDefaultHandler、 // ADC1序列1
    IntDefaultHandler、 // ADC1序列2.
    IntDefaultHandler、 // ADC1序列3.
    0、 //保留
    0、 //保留
    IntDefaultHandler、 // GPIO 端口 J
    IntDefaultHandler、 // GPIO 端口 K
    IntDefaultHandler、 // GPIO 端口 L
    IntDefaultHandler、 // SSI2 Rx 和 Tx
    IntDefaultHandler、 // SSI3 Rx 和 Tx
    IntDefaultHandler、 // UART3 Rx 和 Tx
    IntDefaultHandler、 // UART4 Rx 和 Tx
    IntDefaultHandler、 // UART5 Rx 和 Tx
    IntDefaultHandler、 // UART6 Rx 和 Tx
    IntDefaultHandler、 // UART7 Rx 和 Tx
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    IntDefaultHandler、 // I2C2主设备和从设备
    IntDefaultHandler、 // I2C3主设备和从设备
    IntDefaultHandler、 //计时器4子计时器 A
    IntDefaultHandler、 //计时器4子计时器 B
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    IntDefaultHandler、 //计时器5子计时器 A
    IntDefaultHandler、 //计时器5子计时器 B
    IntDefaultHandler、 //宽定时器0子定时器 A
    IntDefaultHandler、 //宽定时器0子定时器 B
    IntDefaultHandler、 //宽定时器1子定时器 A
    IntDefaultHandler、 //宽定时器1子定时器 B
    IntDefaultHandler、 //宽定时器2子定时器 A
    IntDefaultHandler、 //宽定时器2子定时器 B
    IntDefaultHandler、 //宽定时器3子定时器 A
    IntDefaultHandler、 //宽定时器3子定时器 B
    IntDefaultHandler、 //宽定时器4子定时器 A
    IntDefaultHandler、 //宽定时器4子定时器 B
    IntDefaultHandler、 //宽定时器5子定时器 A
    IntDefaultHandler、 //宽定时器5子定时器 B
    IntDefaultHandler、 // FPU
    0、 //保留
    0、 //保留
    IntDefaultHandler、 // I2C4主设备和从设备
    IntDefaultHandler、 // I2C5主设备和从设备
    IntDefaultHandler、 // GPIO 端口 M
    IntDefaultHandler、 // GPIO 端口 N
    IntDefaultHandler、 //正交编码器2
    0、 //保留
    0、 //保留
    IntDefaultHandler、 // GPIO 端口 P (摘要或 P0)
    IntDefaultHandler、 // GPIO 端口 P1
    IntDefaultHandler、 // GPIO 端口 P2
    IntDefaultHandler、 // GPIO 端口 P3
    IntDefaultHandler、 // GPIO 端口 P4
    IntDefaultHandler、 // GPIO 端口 P5
    IntDefaultHandler、 // GPIO 端口 P6
    IntDefaultHandler、 // GPIO 端口 P7
    IntDefaultHandler、 // GPIO 端口 Q (摘要或 Q0)
    IntDefaultHandler、 // GPIO 端口 Q1
    IntDefaultHandler、 // GPIO 端口 Q2
    IntDefaultHandler、 // GPIO 端口 Q3
    IntDefaultHandler、 // GPIO 端口 Q4
    IntDefaultHandler、 // GPIO 端口 Q5
    IntDefaultHandler、 // GPIO 端口 Q6
    IntDefaultHandler、 // GPIO 端口 Q7
    IntDefaultHandler、 // GPIO 端口 R
    IntDefaultHandler、 // GPIO 端口 S
    IntDefaultHandler、 // PWM 1发生器0
    IntDefaultHandler、 // PWM 1发生器1
    IntDefaultHandler、 // PWM 1发生器2
    IntDefaultHandler、 // PWM 1发生器3
    IntDefaultHandler // PWM 1故障
    };
    
    
    void
    ResetISR (void)
    {
    _IAR_program_start();
    }
    
    
    静态空
    NmiSR (void)
    {
    //
    //输入无限循环。
    //
    while (1)
    {
    }
    }
    
    
    静态空
    FaultISR (空)
    {
    //
    //输入无限循环。
    //
    while (1)
    {
    }
    }
    
    
    静态空
    IntDefaultHandler (void)
    {
    //
    //进入无限循环。
    //
    while (1)
    {
    }
    }
    

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

    你好,Furkan!

    也许我会有所帮助:

    请看以下几行:

    SysTickPeriodSet (系统时钟/1000);
    SysTickEnable();
    SysTickIntEnable();
    

    现在、我们来看看以下内容:

    NVIC_ST_CTRL_R = 0;
    NVIC_ST_RELOAD_R =周期-1;
    NVIC_ST_CURRENT_R = 0;
    NVIC_SYS_PRI3_R =(NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
    NVIC_ST_CTRL_R = 0x07; 

    想象一下、如果您从现在起一年后再看一下它们。 您可能已经忘记了 TivaWare API 的一些详细信息、但您认为可以理解和管理这两组代码中的哪一组? 哪一项将更快地得到解决? 想象一下、有些事情不太好、您可以相信哪一个能够被证明? 当您需要调试或在未来发展项目时、编码的清晰度非常重要。 这里的建议是:不要因寄存器配置模糊而浪费时间、而是使用驱动程序库。

    现在、对于您的神秘硬故障、可能是由于堆栈太小? printf 系列会占用大量堆栈、2K 也不是一个坏的开始...

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在某些情况下、您可能会正确、但在我的情况下、我试图弄清楚背景中发生的情况。 使用现成的库很简单、每个人都可以做到。 例如、在遇到 SysTick 问题之前、我从未查看过启动文件、现在我知道启动文件中每行都在执行什么操作。 使代码工作后、我可以创建自己的库。

    我不认为它是关于堆栈的、因为当我使用 printf 时、它会起作用、当我不使用它时、它的代码不起作用。 我只是注意到代码在调试模式下工作、但当我从计算机中删除 Launchpad 并从外部5V 电源中移除电源时、它不起作用。 这真的很奇怪。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Furkan Erman"]使用现成的库非常简单,每个人都可以使用它[/引用]

    嗯... 我问过街对面餐厅的女服务员和我的律师。 两者似乎都无法使用库...

    使用制造商的官方驱动程序库与某些社区创建的模糊的 vooduino 下载库之间存在主要差异。 如果寄存器位从0更改为1、则不会真正向您显示背景情况、除非您有 IC 内部电路的完整原理图。

    谢谢

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这个平台不适合争论这些问题,我有一个问题等待解决,需要集中精力解决
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    两个注释

    首先、你的矢量表中仍然有零、这是一个坏主意。

    第二个 Bruno 是正确的、您应该用 TIVAWare 替代直接寄存器操作(是的、这是一个合适的建议)。 这应该是您关注问题的下一步。 使用 DRM 是将您的注意力从您的问题中移除。

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

    Furkan Erman 说:
    printf()对 interrupts 有何影响。

    有关在中断中使用 stdio 的规则

    1. 不要在中断中使用 stdio
    2. 请参阅规则1

    Robert

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

    大家好、Erman、

    我不是想提出一场斗争,而是想提出好的做法。 与解决一个问题相比、这些功能更为重要。

    [引用用户="Furkan Erman"]此平台不适合争论此类问题[/引用]

    我再次尝试了你的建议:我去了高速公路上的体育商店,也去了铁匠。 我都没有找到有线索的人、尽管他人很好、也没有打电话给安全部门、但他们建议我"必须有一个技术场所来讨论这些事情"。

    然后我回到 PC、在合适的地方用谷歌搜索。 嗯、我找到了一个地方-看看这个页面的内容!!!

    一件!

    布鲁诺

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

    好的、我按照您的建议使用了驱动程序库、但结果是相同的。 我怀疑我的定制板是否具有 proplem、但它在 Tm4c123gxl launchpad 上也不起作用。

    main.c

    //
    //
    // interrupts.c -中断抢占和尾链示例。
    //
    //版权所有(c) 2012-2013 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)提供此软件仅供
    和//仅供 TI 的微控制器产品使用。 软件归
    // TI 和/或其供应商所有,并受适用的版权
    //法律保护。 您不能将此软件与"病毒"开源
    //软件组合在一起以形成更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //对于
    
    本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
    //情况下、TI 不对任何
    原因造成的特殊、意外或必然//损害负责。
    //
    //这是 EK-TM4C123GXL 固件包修订版1.0的一部分。
    ////
    *****************
    
    #include 
    #include 
    include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_NVIC.h"
    #include "Filename/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/ipt_intrinu.ide"
    
    
    
    
    #include "driverlib_ipt_driverlib_pinc.h"#include "#driveript_intrine_pio.ide"#include "#driverlib_trin.ide"
    
    
    
    
    
    
    
    
    
    、#def_ipt_ipt_infot.ipt_in.id_in_in_in_in.id_in_in.ide"#include "#include "#def"#def"#def_ipt_ipt_ipt_ipt_ipt_in.ipt_in.ipt_in.id_in.ipt_in.id_in_in_in.id_in.id_in_in_in.h #include #include #include "#include "#include "#def_in.ipt_ipt_in.
    
    
    
    
    
    
    
    
    
    
    
    int
    main (void)
    {
    
    //
    //将时钟设置为直接从晶体运行。
    //
    SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    
    //
    //启用此示例使用的外设。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    
    
    
    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);
    
    //
    //设置和启用 SysTick 计时器。 它将用作参考
    //用于中断处理程序中的延迟循环。 SysTick 计时器周期
    //将设置一秒钟。
    //
    SysTickPeriodSet (16000);
    SysTickEnable();
    SysTickIntEnable();
    
    
    //
    //启用到处理器的中断。
    //
    IntMasterEnable();
    
    while (1)
    {
    
    
    }
    }
    

    startup.c

    //
    //
    //// startup.c -与 IAR Embedded Workbench 一起使用的启动代码,
    // 版本5。
    //
    //版权所有(c) 2012-2013 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)提供此软件仅供
    和//仅供 TI 的微控制器产品使用。 软件归
    // TI 和/或其供应商所有,并受适用的版权
    //法律保护。 您不能将此软件与"病毒"开源
    //软件组合在一起以形成更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //对于
    
    本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
    //情况下、TI 不对任何
    原因造成的特殊、意外或必然//损害负责。
    //
    //这是 EK-TM4C123GXL 固件包修订版1.0的一部分。
    ////
    *****************
    
    #include 
    #include "inc/hw_NVIC.h"
    #include "inc/hw_types.h"
    
    //*********
    //
    //为此源文件启用 IAR 扩展。
    ////
    *****************
    #pragma language=extended
    
    //*********
    //
    //转发默认故障处理程序的声明。
    ////
    *****************
    void ResetISR (void);
    static void NmiSR (void);
    static void FaultISR (void);
    static void IntDefaultHandler (void);
    
    //*********
    //
    //应用程序使用的中断处理程序的外部声明。
    ////
    *****************
    
    extern void SysTick 处理程序(void);
    
    //*************
    //
    //应用程序启动代码的入口点。
    ////
    *****************
    extern void __IAR_program_start (void);
    
    //*********
    //
    //为系统堆栈保留空间。
    ////
    *****************
    静态 uint32_t pui32stack[128]@".noinit";
    
    //*********
    //
    //描述向量表条目的联合体。 需要使用 union
    //、因为第一个条目是栈指针、而余数是函数
    //指针。
    ////
    *****************
    typedef union
    {
    void (* pfnHandler)(void);
    uint32_t ui32Ptr;
    }
    uVectorEntry;
    
    //*********
    //
    //矢量表。 请注意、必须在这个上放置适当的结构、以
    //确保它在物理地址0x0000.0000处结束。
    ////
    *****************
    __root const uVectorEntry __vector_table[]@".intvec"=
    {
    {.ui32Ptr =(uint32_t) pui32Stack + sizeof (pui32Stack)}、
    //初始堆栈指针
    ResetISR、 //重置处理程序
    NmiSR、 // NMI 处理程序
    FaultISR、 //硬故障处理程序
    IntDefaultHandler、 // MPU 故障处理程序
    IntDefaultHandler、 //总线故障处理程序
    IntDefaultHandler、 //用法故障处理程序
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 // SVCall 处理程序
    IntDefaultHandler、 //调试监视器处理程序
    IntDefaultHandler、 //保留
    IntDefaultHandler、 // PendSV 处理程序
    SysTick 处理程序、 // SysTick 处理程序
    IntDefaultHandler、 // GPIO 端口 A
    IntDefaultHandler、 // GPIO 端口 B
    IntDefaultHandler、 // GPIO 端口 C
    IntDefaultHandler、 // GPIO 端口 D
    IntDefaultHandler、 // GPIO 端口 E
    IntDefaultHandler、 // UART0 Rx 和 Tx
    IntDefaultHandler、 // UART1 Rx 和 Tx
    IntDefaultHandler、 // SSI0 Rx 和 Tx
    IntDefaultHandler、 // I2C0主机和从机
    IntDefaultHandler、 // PWM 故障
    IntDefaultHandler、 // PWM 发生器0
    IntDefaultHandler、 // PWM 发生器1
    IntDefaultHandler、 // PWM 发生器2.
    IntDefaultHandler、 //正交编码器0
    IntDefaultHandler、 // ADC 序列0
    IntDefaultHandler、 // ADC 序列1
    IntDefaultHandler、 // ADC 序列2.
    IntDefaultHandler、 // ADC 序列3.
    IntDefaultHandler、 //看门狗计时器
    IntDefaultHandler、 // Timer 0子计时器 A
    IntDefaultHandler、 // Timer 0子计时器 B
    IntDefaultHandler、 //计时器1子计时器 A
    IntDefaultHandler、 //计时器1子计时器 B
    IntDefaultHandler、 //计时器2子计时器 A
    IntDefaultHandler、 //计时器2子计时器 B
    IntDefaultHandler、 //模拟比较器0
    IntDefaultHandler、 //模拟比较器1
    IntDefaultHandler、 //模拟比较器2.
    IntDefaultHandler、 //系统控制(PLL、OSC、BO)
    IntDefaultHandler、 //闪存控制
    IntDefaultHandler、 // GPIO 端口 F
    IntDefaultHandler、 // GPIO 端口 G
    IntDefaultHandler、 // GPIO 端口 H
    IntDefaultHandler、 // UART2 Rx 和 Tx
    IntDefaultHandler、 // SSI1 Rx 和 Tx
    IntDefaultHandler、 //计时器3子计时器 A
    IntDefaultHandler、 //计时器3子计时器 B
    IntDefaultHandler、 // I2C1主设备和从设备
    IntDefaultHandler、 //正交编码器1
    IntDefaultHandler、 // CAN0
    IntDefaultHandler、 // CAN1
    IntDefaultHandler、 // CAN2
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //休眠
    IntDefaultHandler、 // USB0
    IntDefaultHandler、 // PWM 发生器3.
    IntDefaultHandler、 // uDMA 软件传输
    IntDefaultHandler、 // uDMA 错误
    IntDefaultHandler、 // ADC1序列0
    IntDefaultHandler、 // ADC1序列1
    IntDefaultHandler、 // ADC1序列2.
    IntDefaultHandler、 // ADC1序列3.
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 // GPIO 端口 J
    IntDefaultHandler、 // GPIO 端口 K
    IntDefaultHandler、 // GPIO 端口 L
    IntDefaultHandler、 // SSI2 Rx 和 Tx
    IntDefaultHandler、 // SSI3 Rx 和 Tx
    IntDefaultHandler、 // UART3 Rx 和 Tx
    IntDefaultHandler、 // UART4 Rx 和 Tx
    IntDefaultHandler、 // UART5 Rx 和 Tx
    IntDefaultHandler、 // UART6 Rx 和 Tx
    IntDefaultHandler、 // UART7 Rx 和 Tx
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 // I2C2主设备和从设备
    IntDefaultHandler、 // I2C3主设备和从设备
    IntDefaultHandler、 //计时器4子计时器 A
    IntDefaultHandler、 //计时器4子计时器 B
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //计时器5子计时器 A
    IntDefaultHandler、 //计时器5子计时器 B
    IntDefaultHandler、 //宽定时器0子定时器 A
    IntDefaultHandler、 //宽定时器0子定时器 B
    IntDefaultHandler、 //宽定时器1子定时器 A
    IntDefaultHandler、 //宽定时器1子定时器 B
    IntDefaultHandler、 //宽定时器2子定时器 A
    IntDefaultHandler、 //宽定时器2子定时器 B
    IntDefaultHandler、 //宽定时器3子定时器 A
    IntDefaultHandler、 //宽定时器3子定时器 B
    IntDefaultHandler、 //宽定时器4子定时器 A
    IntDefaultHandler、 //宽定时器4子定时器 B
    IntDefaultHandler、 //宽定时器5子定时器 A
    IntDefaultHandler、 //宽定时器5子定时器 B
    IntDefaultHandler、 // FPU
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 // I2C4主设备和从设备
    IntDefaultHandler、 // I2C5主设备和从设备
    IntDefaultHandler、 // GPIO 端口 M
    IntDefaultHandler、 // GPIO 端口 N
    IntDefaultHandler、 //正交编码器2
    IntDefaultHandler、 //保留
    IntDefaultHandler、 //保留
    IntDefaultHandler、 // GPIO 端口 P (摘要或 P0)
    IntDefaultHandler、 // GPIO 端口 P1
    IntDefaultHandler、 // GPIO 端口 P2
    IntDefaultHandler、 // GPIO 端口 P3
    IntDefaultHandler、 // GPIO 端口 P4
    IntDefaultHandler、 // GPIO 端口 P5
    IntDefaultHandler、 // GPIO 端口 P6
    IntDefaultHandler、 // GPIO 端口 P7
    IntDefaultHandler、 // GPIO 端口 Q (摘要或 Q0)
    IntDefaultHandler、 // GPIO 端口 Q1
    IntDefaultHandler、 // GPIO 端口 Q2
    IntDefaultHandler、 // GPIO 端口 Q3
    IntDefaultHandler、 // GPIO 端口 Q4
    IntDefaultHandler、 // GPIO 端口 Q5
    IntDefaultHandler、 // GPIO 端口 Q6
    IntDefaultHandler、 // GPIO 端口 Q7
    IntDefaultHandler、 // GPIO 端口 R
    IntDefaultHandler、 // GPIO 端口 S
    IntDefaultHandler、 // PWM 1发生器0
    IntDefaultHandler、 // PWM 1发生器1
    IntDefaultHandler、 // PWM 1发生器2
    IntDefaultHandler、 // PWM 1发生器3
    IntDefaultHandler // PWM 1故障
    };
    
    //*********
    //
    //这是在处理器首次开始执行
    时调用的代码//在复位事件之后。 只执行绝对必要的设置,
    //之后调用应用程序提供的 entry()例程。 任何花式
    //操作(例如根据复位原因寄存
    
    器做出决策、和//复位该寄存器中的位)都只能由//应用程序控制。
    ////
    *****************
    void
    ResetISR (void)
    {
    //
    //启用浮点单元。 必须在此处执行此操作才能处理
    // main()使用浮点且函数 prologueue 保存的情况
    //浮点寄存器(如果浮点不是浮点、则会出现故障
    //启用)。 使用 DriverLib 的浮点单元的任何配置
    //必须在启用浮点单元之前在此处完成 API。
    //
    //请注意,这不使用 DriverLib,因为它可能未包含在中
    //此项目。
    //
    HWREG (NVIC_CPAC)=((HWREG (NVIC_CPAC)&
    ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)|
    NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL);
    
    //
    //调用应用程序的入口点。
    //
    __IAR_program_start();
    }//*************
    
    
    //
    //这是当处理器接收到 NMI 时被调用的代码。 这个
    //只需进入一个无限循环,保留系统状态供
    调试器检查//。
    ////
    *****************
    静态空
    NmiSR (void)
    {
    //
    //输入无限循环。
    //
    while (1)
    {
    }
    }
    
    //*********
    //
    //这是处理器收到故障
    //中断时调用的代码。 这只是进入一个无限循环、保持系统状态
    //供调试器检查。
    ////
    *****************
    静态空
    FaultISR (空)
    {
    //
    //输入无限循环。
    //
    while (1)
    {
    }
    }
    
    //*********
    //
    //这是当处理器收到意外
    的//中断时调用的代码。 这只是进入一个无限循环、保持系统状态
    //供调试器检查。
    ////
    *****************
    静态空
    IntDefaultHandler (void)
    {
    //
    //进入无限循环。
    //
    while (1)
    {
    }
    }
    

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

    Hallo Erman、

    阅读更简单(至少对我来说)!

    1) 1) SysTick 部件完美、它应该可以正常工作。 如果您在 SysTick ISR 内设置断点、程序是否会到达该断点?

    2) 2)下一行不会打开所有引脚。 第三个参数应该是包含您要激活的引脚的掩码-在这种情况下、值1将只屏蔽到 PIN_0:

    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3、1);

    3) 3)我研究了系统时钟已经有一段时间了、现在我们只需复制/粘贴已经在这里工作的内容。 在本例中、我们使用 PLL、80MHz 的设置如下:

    SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);

    关于主题:我没有发现运行 MCU 的速度比它慢的原因(个人意见)。 我想、如果目标是节省能源、那么尽快完成任务并在可能的情况下睡眠会更高效。 请注意、在这种情况下、您必须更改 SysTick 参数以使其恢复到1000Hz。

    布鲁诺

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

    问题得到解决、现在我有了正常工作的 SysTick 中断。 如果有人想使用、则下面是最终代码。 感谢@ö、@和@。  

    #include 
    #include 
    #include 
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_NVIC.h"
    #include "inc/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/ipt_dive_dive"#include
    "driverlib_dive/ipt_out.ide"
    #driveript_unch_ude_dive.ide"
    
    
    #include "#driverlib_dive/ipt_id.ide"#include "#driveript_une.t_unt #include "#def_intrl"#def_idive"#id_id_ide.t_in.ide"#include "#ide"#/ipt_in.ide"#idr.idr.idr.idr.ide"#idr.idr.idr.idr.idr.idr.idr.ide"#include "#/ipt_u.idr.idr.idr.idr.idr.idr.id_
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    if (count == 500){
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3、14);
    }
    否则(计数= 1000){
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3、0);
    count=0;
    }
    }
    
    
    int
    main (void)
    {
    
    volatile uint32_t ui32Loop;
    
    //
    //将时钟设置为直接从晶体运行。
    //
    // SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
    
    SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);
    
    //
    //启用此示例使用的外设。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    
    
    
    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);
    
    //
    //设置和启用 SysTick 计时器。 它将用作参考
    //用于中断处理程序中的延迟循环。 SysTick 计时器周期
    //将设置一秒钟。
    //
    SysTickPeriodSet (80000);
    SysTickEnable();
    SysTickIntEnable();
    
    
    //
    //启用到处理器的中断。
    //
    // IntMasterEnable();
    
    while (1)
    {
    
    }
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的反馈。
    只需一个 QUIC 注释:
    -为了更清楚地说明、可以只重复 GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3而不是数字14。 它在编译后完全是一样的、但从现在开始一周(或一两个月...)、您将会看到并浪费几分钟的宝贵时间、好奇"地球上是什么14???"
    谢谢
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这里有人(尤其是快打的员工)是否不同意?

    考虑一下寻找所有端口引脚的情况-员工会"割伤手腕"、而不是花"无限小时"列出 GPIO_PIN_无穷 大!    (在这种情况下、0xFF 工作正常-并且"注释字段"可能会将该值记录为"基于位位置"-克服"奇迹!"

    (请注意、注释字段被 GPIO_AD_infinitum 过度运行-不是吗?)   

    而且-通常情况下、其他端口必须得到类似的处理-使用"GPIO_PIN_AD_infinitum"变得非常旧-非常快!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我和 Bruno 一起参加这个 CB1。 如果 TIVAWare 不是所有引脚都有一个常数、那么创建一个就足够简单了。

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

    哦罗伯特——前一天你"泄露"黑客秘密——现在你"和布鲁诺站在一边!"

    (预期)血液路径-来自(多个)狭腕-一定要破坏我们的 ESD 安全、高科技(昂贵)地板...

    至少我们的海报显示了"见光"-但使用十六进制值( 两个) Params:2和3、表现得更强(甚至更强)。   (在 Params 2和3的"和"之后产生"1"的端口位-"打开"其输出。)

    虽然我不是"共谋辩护律师"、但必须注意的是、"布鲁诺的"木匠隧道专家"名单(刚刚)在安大略省的整洁位置添加了几位专家!   (当然是偶然的-我们确信...)