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.

[参考译文] EK-TM4C1294XL:代码跳转到故障 ISR。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/588425/ek-tm4c1294xl-code-jumping-to-fault-isr

器件型号:EK-TM4C1294XL

大家好、

我一直在开发一个应用、其中 Tiva 板将通过 SPI 向其他微控制器(STM32F4)发送命令。 收到命令后、STM32F4将通过 SPI 将处理后的数据发送回 Tiva 板。 (此处 Tiva 板是 SPI 主器件、STM32F4是从器件)。

Tiva 板接收到的数据将通过以太网发送到 PC。 我已经单独开发了这些应用、但当我尝试合并这两个代码时、有时合并的代码会跳转到故障 ISR。 我不明白到底发生了什么以及代码跳转到故障 ISR 的原因。

非常感谢您的帮助。

我在下面发布代码。 请参阅。 我还将发布故障地址。(注意:我将使用 IAR 作为我的工具链)。

//
//
// spi_master.c -演示如何在 SPI 主设备//中配置 SSI0的示例
模式。
//
//版权所有(c) 2010-2017 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
以源代码和二进制形式重新分发和使用,无论是否
进行//修改,只要
满足以下条件//:
//
重新分发源代码必须保留上述版权
//声明、此条件列表和以下免责声明。
//
//二进制形式的再发行必须复制上述版权
//声明、此条件列表和//

分发随附的//文档和/或其他材料中的以下免责声明。
////
未经

事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
////
本软件由版权所有者和贡献者提供
//“按原样”,不

承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
//所有者或贡献者都不对任何直接、间接、偶然、
//特殊、模范、 或相应的损害(包括但不
限于采购替代产品或服务;丧失使用、
//数据或利润; 或业务中断)、无论

出于何种原因使用
本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
//
//这是 Tiva 固件开发包的修订版2.1.4.178的一部分。
////
*****************

#include 
#include 
include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/flash.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpin.h"
#include "driverlib/pin_map.h"
#include "driverlib/simpl.h"
#include "driverlib.utils/nexe"#include "driverlib/simplex"#driverlib.intrintrune.h/driverlib"#include
"driverlib"#driverlib.utils/intrintrl.md.ide"#include "driver.h"#include "driverlib"#include "driverlib.utils/udi.pintrin.dl.dl.utils/ude"#include "driverlib.dl.dl.utils/ude"#include"#include "driverlib.in.in.intrin.in.in.in.dl.utils/ude"








#include "driverlib.in.utils/ude"#include "driverlib.
//
//! \addtogroup SSI_examples_list
//! 

SPI 主器件(SPI_MASTER)

//! //! 此示例展示了如何将 SSI0配置为 SPI 主设备。 代码将 //! 在主 Tx 上发送三个字符、然后轮询接收 FIFO、直到 //! 在主 Rx 上接收3个字符。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - SSI0外设 //! - GPIO 端口 A 外设(用于 SSI0引脚) //! SSI0Clk - PA2 //! - SSI0Fss - PA3 //! - SSI0Rx - PA4 //! - SSI0Tx - PA5 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 SSI0的运行不需要这些。 //! - UART0外设 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -无。 //// ***************** // // //定义设置系统时钟。 //// ***************** #define SYSTICKHZ 500 #define SYSTICKMS (1000 / SYSTICKHZ) //********* // //中断优先级定义。 这些值的前3位是 //有效的、较低的值表示较高优先级的中断。 //// ***************** #define SysTK_INT_PRIORITY 0x80 #define ETHERNET_INT_PRIORITY 0xC0 uint16_t PORT = 12; uint8_t ui8_Flag = 0; struct UDP_PCB * UDP_1; struct pbuf * pbuf1; //********* // //当前 IP 地址。 //// ***************** uint32_t g_ui32IPAddress; //********* // //要发送和接收的字节数。 //// ***************** #define NUM_SSI_DATA 3 uint32_t g_ui32SysClock; uint32_t dummy = 0; uint32_t pui32DataTx[3]; uint32_t pui32DataRx[16]; void DisplayIPAddress (uint32_t ui32Addr) { char pcBuf[16]; // //将 IP 地址转换为字符串。 // usprintf (pcBuf、"%d.%d.%d.%d"、ui32Addr & 0xff、(ui32Addr >> 8)& 0xff、 (ui32Addr >> 16)& 0xff、(ui32Addr >> 24)& 0xff); // //显示字符串。 // UARTprintf (pcBuf); } void lwIPHostTimerHandler (void) { uint32_t ui32NewIPAddress; // //获取当前 IP 地址。 // ui32NewIPAddress = lwIPLocalIPAddrGet (); // //查看 IP 地址是否已更改。 // if (ui32NewIPAddress!= g_ui32IPAddress) { // //查看是否分配了 IP 地址。 // if (ui32NewIPAddress == 0xffffffff) { // //表示没有链接。 // UARTprintf ("正在等待链接。\n"); } 否则、如果(ui32NewIPAddress =0) { // //没有 IP 地址,因此请指明 DHCP 进程是什么 //正在运行。 // UARTprintf ("正在等待 IP 地址。\n"); } 其他 { // //显示新的 IP 地址。 // UARTprintf ("IP 地址:"); DisplayIPAddress (ui32NewIPAddress); UARTprintf ("\n 打开浏览器并输入 IP 地址。\n"); } // //保存新的 IP 地址。 // G_ui32IPAddress = ui32NewIPAddress; } // //如果没有 IP 地址。 // if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff)) { // //不执行任何操作并继续等待。 // } 其他 { UARTprintf ("我有一个 IP"); pbuf1 = pbuf_alloc (PBUF_transport、100、PBUF_RAM); pbuf1 ->有效载荷=(void*) pui32DataRx; pbuf1 -> tut_len = 16; pbuf1 -> len = 16; udp_send (udp_1、pbuf1); pbuf_free (pbuf1); } ui8_Flag = 1; } //********* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } void SysTickIntHandler (void) { // //调用 lwIP 计时器处理程序。 // lwIPTimer (SYSTICKMS); } //********* // //在主 Freescale (SPI)模式下配置 SSI0。 此示例将发出 // 3个字节的数据,然后等待3个字节的数据进入。 这将全部由 //使用轮询方法完成。 //// ***************** int main (void) { uint32_t ui32Index; uint32_t ui32User0、ui32User1; uint8_t pui8MACArray[8]; struct ip_addr ip_remote; // //确保主振荡器已启用,因为这是所要求的 // PHY。 系统必须将一个25MHz 晶体连接到 OSC //引脚。 晶体时使用 SYSCTL_MOSC_HIGHFREQ 参数 //频率为10MHz 或更高。 // SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ); // //从 PLL 以120MHz 运行。 // G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); // //配置器件引脚。 // PinoutSet (true、false); // //设置用于显示消息的串行控制台。 这是 //仅用于此示例程序,SSI 操作不需要。 // InitConsole(); // //在控制台上显示设置。 // UARTprintf ("SSI ->\n"); UARTprintf ("模式:SPI\n"); UARTprintf ("数据:8位\n"); // //必须启用 SSI0外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_SSI0); // //对于本示例,SSI0与 Porta[5:2]一起使用。 实际端口和引脚 //您的器件上使用的可能不同、请参阅数据表以了解更多信息 //信息。 GPIO 端口 A 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // // //将的端口 N1配置为动画 LED 的输出。 // MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1); // //将 LED 初始化为关闭(0) // MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1); // //为周期性中断配置 SysTick。 // MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ); map_SysTickEnable(); map_SysTickIntEnable(); map_FlashUserGet (&ui32User0、&ui32User1); if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff) { // //我们永远不应该来这里。 如果 MAC 地址有、则这是一个错误 //未编程到器件中。 退出程序。 //告知用户没有 MAC 地址 // UARTprintf ("未对 MAC 进行编程!\n"); while (1) { } } // //告诉用户我们现在正在做什么。 // UARTprintf ("正在等待 IP.\n"); // //将24/24拆分 MAC 地址从 NV RAM 转换为32/16拆分 MAC //对硬件寄存器进行编程所需的地址,然后对 MAC 进行编程 //将地址输入以太网控制器寄存器。 // pui8MACArray[0]=((ui32User0 >> 0)& 0xff); pui8MACArray[1]=((ui32User0 >> 8)& 0xff); pui8MACArray[2]=((ui32User0 >> 16)& 0xff); pui8MACArray[3]=((ui32User1 >> 0)& 0xff); pui8MACArray[4]=((ui32User1 >> 8)& 0xff); pui8MACArray[5]=((ui32User1 >> 16)& 0xff); // //使用 DHCP 初始化 lwIP 库。 // //lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp); // I.P. 地址:169.254.19.65 = 0xA9FE1341 //网关:169.254.68.215 = 0xA9FE44D7 //子网掩码:255.255.0.0 = 0xFFFFFF0000 lwIPInit (g_ui32SysClock、pui8MACArray、0xA9FE1341、0xFFFFFF0000、0、 ipaddr_use_static); // //设置设备定位服务。 // LocatorInit(); LocatorMACAddrSet (pui8MACArray); LocatorAppTitleSet ("EK-TM4C1294XL enet_IO"); // //初始化示例 httpd 服务器。 // udp_init(); IP4_ADDR (&IP_REMOTE、169、254、19、64); UDP_1 = UDP_NEW (); if (UDP_1 ==空) { UARTprintf ("UDP 失败\n"); } 其他 { UARTprintf ("UDP up\n"); } if (udp_bind (udp_1、ip_ADDR_ANY、port)!= ERR_OK) { UARTprintf ("绑定失败"); } if (udp_connect (udp_1、&ip_remote、port)!= ERR_OK) { UARTprintf ("连接失败"); } // //设置中断优先级。 我们将 SysTick 中断设置为更高的值 //优先级比以太网中断高,以确保文件系统 如果 SysTick 在以太网处理程序运行时发生、则处理// tick //已处理。 这很可能是因为所有 TCP/IP 和 HTTP 工作都是 //在以太网中断上下文中完成。 // MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY); MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY); GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_3); GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、GPIO_PIN_3); GPIOPinConfigure (GPIO_PA2_SSI0CLK); GPIOPinConfigure (GPIO_PA4_SSI0XDAT0); GPIOPinConfigure (GPIO_PA5_SSI0XDAT1); // //配置 SSI 引脚的 GPIO 设置。 该函数也会提供 将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表 //查看每个引脚分配的函数。 //引脚分配如下: // PA5 - SSI0Tx // PA4 - SSI0Rx // PA3 - SSI0Fss // PA2 - SSI0CLK // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2); // //为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI0、 //系统时钟电源,空闲时钟低电平和低电平有效时钟输入 //飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。 //对于 SPI 模式,可以设置 SSI 时钟的极性 //单元空闲。 您还可以配置所需的时钟边沿 //在上捕获数据。 有关的更多信息、请参阅数据表 //不同的 SPI 模式。 // SSIConfigSetExpClk (SSI0_BASE、g_ui32SysClock、SSI_FRF_MOTO_MODE_0、 SSI_MODE_MASTER、1000000、8); // //启用 SSI0模块。 // SSIEnable (SSI0_BASE); // //从 SSI 端口读取任何残留数据。 这将确保接收 // FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成 //因为 SPI SSI 模式为全双工模式,允许您发送和 //同时接收。 SSIDataGetNonBlocking 函数返回 //返回数据时为"true",未返回数据时为"false"。 //“非阻塞”函数检查接收中是否有数据 // FIFO、如果没有、则不会"挂起"。 // while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0])) { } // //初始化要发送的数据。 // pui32DataTx[0]= 0xC1; pui32DataTx[1]= 0xC2; pui32DataTx[2]= 0xC3; // //显示 SSI 正在发送数据的指示。 // UARTprintf ("sent:\n "); GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、0); SysCtlDelay(1); // //发送3个字节的数据。 // for (ui32Index = 0;ui32Index < 3;ui32Index++) { // //显示 SSI 正在传输的数据。 // UARTprintf ("'%c'"、pui32DataTx[ui32Index]); // //使用“阻塞”Put 函数发送数据。 此函数 //将等待发送 FIFO 中有空间后再返回。 //这使您可以确保发送的所有数据都将其输入 //发送 FIFO。 // SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]); } SysCtlDelay(1); GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、GPIO_PIN_3); // //等待 SSI0完成传输发送 FIFO 中的所有数据。 // while (SSIBusy (SSI0_BASE)) { } // //显示 SSI 正在接收数据的指示。 // UARTprintf ("\n 接收:\n "); // //接收3个字节的数据。 // while (1) { while (ui8_Flag) { SysCtlDelay (10000); GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、0); //~CS -将其设置为逻辑低电平-开始传输 SysCtlDelay(1); for (ui32Index = 0;ui32Index < 16;ui32Index++) { // //使用“阻塞”GET 函数接收数据。 此函数 //将等待接收 FIFO 中有数据后再返回。 // SSIDataPut (SSI0_BASE、dummy); while (SSIBusy (SSI0_BASE)); SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]); while (SSIBusy (SSI0_BASE)); // //因为我们仅使用 MSB 的8位数据掩码 // pui32DataRx[ui32Index]&= 0x00FF; UARTprintf ("'%c'"、pui32DataRx[ui32Index]); } SysCtlDelay(1); GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、GPIO_PIN_3); } }
启动文件-
//*************
//
//// startup_ewarm.c -与 IAR Embedded Workbench 一起使用的启动代码,
// 版本5。
//
//版权所有(c) 2013-2017 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
//德州仪器(TI)提供此软件仅供
和//仅供 TI 的微控制器产品使用。 软件归
// TI 和/或其供应商所有,并受适用的版权
//法律保护。 您不能将此软件与"病毒"开源
//软件组合在一起以形成更大的程序。
//
//此软件按“原样”提供,且存在所有故障。
//对于

本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
//情况下、TI 不对任何
原因造成的特殊、意外或必然//损害负责。
//
//这是 EK-TM4C1294XL 固件包版本2.1.4.178的一部分。
////
*****************

#include 
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"

//*********
//
//为此源文件启用 IAR 扩展。
////
*****************
#pragma language=extended

//*********
//
//转发默认故障处理程序的声明。
////
*****************
void ResetISR (void);
static void NmiSR (void);
void HardFault_HandlerAsm (void);
static void IntDefaultHandler (void);

extern void lwIPEthernetIntHandler (void);
extern void SysTickIntHandler (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 处理程序
HardFault_HandlerAsm、 //硬故障处理程序
IntDefaultHandler、 // MPU 故障处理程序
IntDefaultHandler、 //总线故障处理程序
IntDefaultHandler、 //用法故障处理程序
0、 //保留
0、 //保留
0、 //保留
0、 //保留
IntDefaultHandler、 // SVCall 处理程序
IntDefaultHandler、 //调试监视器处理程序
0、 //保留
IntDefaultHandler、 // PendSV 处理程序
SysTickIntHandler、 // 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、 // CAN0
IntDefaultHandler、 // CAN1
lwIPEthernetIntHandler、 //以太网
IntDefaultHandler、 //休眠
IntDefaultHandler、 // USB0
IntDefaultHandler、 // PWM 发生器3.
IntDefaultHandler、 // uDMA 软件传输
IntDefaultHandler、 // uDMA 错误
IntDefaultHandler、 // ADC1序列0
IntDefaultHandler、 // ADC1序列1
IntDefaultHandler、 // ADC1序列2.
IntDefaultHandler、 // ADC1序列3.
IntDefaultHandler、 //外部总线接口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
IntDefaultHandler、 // I2C2主设备和从设备
IntDefaultHandler、 // I2C3主设备和从设备
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
0、 //保留
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、 // SHA/MD5 0
IntDefaultHandler、 // AES 0
IntDefaultHandler、 // DES3DES 0
IntDefaultHandler、 // LCD 控制器0
IntDefaultHandler、 //计时器6子计时器 A
IntDefaultHandler、 //计时器6子计时器 B
IntDefaultHandler、 //计时器7子计时器 A
IntDefaultHandler、 // Timer 7子计时器 B
IntDefaultHandler、 // I2C6主从设备
IntDefaultHandler、 // I2C7主设备和从设备
IntDefaultHandler、 // HIM 扫描矩阵键盘0
IntDefaultHandler、 //单线0
IntDefaultHandler、 // HIM PS/2 0
IntDefaultHandler、 // HIM LED 序列发生器0
IntDefaultHandler、 // HIM 消费者 IR 0
IntDefaultHandler、 // I2C8主设备和从设备
IntDefaultHandler、 // I2C9主设备和从设备
IntDefaultHandler // GPIO 端口 T
};

//*********
//
//这是在处理器首次开始执行
时调用的代码//在复位事件之后。 只执行绝对必要的设置,
//之后调用应用程序提供的 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)
{
}
}

//*********
//
//这是处理器收到故障
//中断时调用的代码。 这只是进入一个无限循环、保持系统状态
//供调试器检查。
////
*****************
void HardFault_HandlerAsm (void)
{
/*
*根据我们的模式、获取适当的堆栈指针、
*并将其用作 C 处理程序的参数。 此函数
*不会再来了
*

_asm ("\n"
"MOV R0、#4 \n"
"MOV R1、LR \n"
"TST R0、R1 \n"
"BEQ _MSP \n"
"R0夫人、PSP \n"
" HardFault_HandlerC \n"
"_MSP:\n"
"R0夫人、MSP \n"
" HardFault_HandlerC \n"
"\n");
}/**


* HardFaultHandler_C:
*这是使用指针从 HardFault_HandlerAsm 调用
的,并将 Fault stack *作为参数。 然后、我们可以从堆栈中读取这些值、
并将它们*放入局部变量中以方便读取。
*然后、我们读取各种故障状态和地址寄存
器、以帮助解码*故障原因。
*该函数以 BKPT 指令结束、以强制控制权返回到调试器
中*/
void HardFault_HandlerC (unsigned long * hardFAULT_args){
volatile unsigned long stacked_r0;
volatile unsigned long stacked_r1;
volatile unsigned long stacked_r2;
volatile unsigned long stacked_r3;
volatile unsigned long stacked_r12;
volatile unsigned long stacked_lr;
volatile unsigned long stacked_pc;
volatile unsigned long stacked_psr ;
volatile unsigned long _CFSR;
volatile unsigned long _HFSR;
volatile unsigned long _dfSR;
volatile unsigned long _AFSR;
volatile unsigned long _BFAR;
volatile unsigned long _MMAR;

stacked_r0 =((unsigned long) hardfault_args[0]);
stacked_r1 =((unsigned long) hardfault_args[1]);
stacked_r2=((unsigned long) hardfault_args[2]);
stacked_r3 =((unsigned long) hardfault_args[3]);
级联_R12 =((无符号长整型) hardfault_args[4]);
级联_lr =((unsigned long) hardfault_args[5]);
stacked_pc =((unsigned long) hardfault_args[6]);
级联_PSR =((无符号长整型) hardfault_args[7]);

//可配置故障状态寄存器
//由 MMSR、BFSR 和 UFSR 组成
_CFSR =(*(volatile unsigned long *)(0xE000ED28)));

//硬故障状态寄存器
_HFSR =(*(volatile unsigned long *)(0xE000ED2C));

//调试故障状态寄存器
_dfsr =(*(volatile unsigned long *)(0xE000ED30)));

//辅助故障状态寄存器
_AFSR =(*(volatile unsigned long *)(0xE000ED3C)));

//读取故障地址寄存器。 这些值可能不包含有效值。
//检查 BFARVALID/MMARVALID 是否为有效值
// MemManage 故障地址寄存器
_MMAR =(*(volatile unsigned long *)(0xE000ED34)));
//总线故障地址寄存器
_BFAR =(*(volatile unsigned long *)(0xE000ED38)));

_asm ("BKPT #0\n");//中断到调试器

中}

//*********
//
//这是当处理器收到意外
的//中断时调用的代码。 这只是进入一个无限循环、保持系统状态
//供调试器检查。
////
*****************
静态空
IntDefaultHandler (void)
{
//
//进入无限循环。
//
while (1)
{
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从您包含的调试器映像中、我可以看到地址0x2010D78上的总线故障非常精确。 对该地址的任何读取或写入都应生成精确的中止、因为这不是 RAM、而是保留的存储器位置。 查看链接寄存器、了解您是否可以确定生成中止的代码。 这可能是由错误的指针引起的。