大家好、我遇到了 SysTick 中断问题。 为了确保一切都正确、我从互联网上下载了工作代码、但也无法正常工作。 程序进入 HardFault_Handler 而不是 SysTick 处理程序。 您能不能帮助我、代码非常简单、我花了3天时间尝试找出问题所在。
整个项目文件: e2e.ti.com/.../Systickint.rar
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.
大家好、我遇到了 SysTick 中断问题。 为了确保一切都正确、我从互联网上下载了工作代码、但也无法正常工作。 程序进入 HardFault_Handler 而不是 SysTick 处理程序。 您能不能帮助我、代码非常简单、我花了3天时间尝试找出问题所在。
整个项目文件: e2e.ti.com/.../Systickint.rar
启动文件如下所示。 我认为一切都是正确的。 您能在这里看到任何问题了。
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)
非常感谢 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 也不是一个坏的开始...
布鲁诺
[引用 user="Furkan Erman"]使用现成的库非常简单,每个人都可以使用它[/引用]
嗯... 我问过街对面餐厅的女服务员和我的律师。 两者似乎都无法使用库...
使用制造商的官方驱动程序库与某些社区创建的模糊的 vooduino 下载库之间存在主要差异。 如果寄存器位从0更改为1、则不会真正向您显示背景情况、除非您有 IC 内部电路的完整原理图。
谢谢
布鲁诺
好的、我按照您的建议使用了驱动程序库、但结果是相同的。 我怀疑我的定制板是否具有 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 中断。 如果有人想使用、则下面是最终代码。 感谢@öm SourceTwo、@ö m Robert Adsett和@Bruno Saraiva。
#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) { } }
这里有人(尤其是快打的员工)是否不同意?
考虑一下寻找所有端口引脚的情况-员工会"割伤手腕"、而不是花"无限小时"列出 GPIO_PIN_无穷 大! (在这种情况下、0xFF 工作正常-并且"注释字段"可能会将该值记录为"基于位位置"-克服"奇迹!"
(请注意、注释字段被 GPIO_AD_infinitum 过度运行-不是吗?)
而且-通常情况下、其他端口必须得到类似的处理-使用"GPIO_PIN_AD_infinitum"变得非常旧-非常快!
哦罗伯特——前一天你"泄露"黑客秘密——现在你"和布鲁诺站在一边!"
(预期)血液路径-来自(多个)狭腕-一定要破坏我们的 ESD 安全、高科技(昂贵)地板...
至少我们的海报显示了"见光"-但使用十六进制值( 两个) Params:2和3、表现得更强(甚至更强)。 (在 Params 2和3的"和"之后产生"1"的端口位-"打开"其输出。)
虽然我不是"共谋辩护律师"、但必须注意的是、"布鲁诺的"木匠隧道专家"名单(刚刚)在安大略省的整洁位置添加了几位专家! (当然是偶然的-我们确信...)