Other Parts Discussed in Thread: TM4C1294NCPDT
主题中讨论的其他器件:TM4C1294NCPDT
工具/软件:Code Composer Studio
尊敬的所有人:
使用定制应用程序调试 EK-TM4C129Xl 时、我面临一些挑战。 请查找以下附加文件以供参考。
谢谢、
SAI
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.
Other Parts Discussed in Thread: TM4C1294NCPDT
工具/软件:Code Composer Studio
尊敬的所有人:
使用定制应用程序调试 EK-TM4C129Xl 时、我面临一些挑战。 请查找以下附加文件以供参考。
谢谢、
SAI
在执行代码时、程序似乎已经分支到一个未执行内存的位置。 如果您未通过禁用存储器映射等方式获得错误"阻止读取的存储器映射"、则表示您已获得中止。 我建议您确定哪一行 C 代码产生了错误。 然后重置器件并运行到该行 C 代码。 请尝试汇编语言步进、而不是从这一点开始执行 C 步进。 在执行此操作时查看 CPU 寄存器中的值。 常见的问题是使用错误的地址执行间接调用、或从堆栈值损坏的函数返回。
[引用 user ="Johnes">查看该器件的数据表、该地址没有存储器。正如 CCS/TM4C1294NCPDT 线程中所述 :CCS GEL 文件中指定的 ROM 大小与 TM4C 器件中实际的 ROM 大小之间存在差异:
[引用用户="Brian Willoughby">在相关注释中、TM4C1294[KN]CPDT 的数据表中 ROM 的地址错误。 第103页将0x02000000.0x02FFFFFF 显示为 ROM 的存储器范围、但我们知道 ROM 实际上从0x01000000开始。[/QUERP]
[quote user="Johes">调试器将配置为阻止读取这些地址。 从上述引用的线程来看、另一个问题是 、虽然 CCS_base/emulation/gel/tm4c1294ncpdt.gel 的 ROM 的正确基址为0x01000000、但其大小小于实际的 ROM。 例如、CCS 10.1.1 CCS_base/emulation/gel/tm4c1294ncppdt.gel 具有:
GEL_MapAddStr (0x01000000、0、0x00008c00、"R"、0); /* ROM */
其中、与之前的测试一样、对于 ROM 版本为0x301的 TM4C1294NCPDT、ROM 大小为0xe700字节。
以上两项意味着、当 SAI 在地址0x01009B7C 处获得"存储器映射阻止读取"错误时、程序计数器实际上位于 ROM 中的有效地址。
是否可以更新器件数据表和 CCS GEL 文件以匹配 TM4C ROM 的实际地址?
我没有找到指定的实际 ROM 大小;只是创建了一个程序、该程序探测 ROM 地址以查找不会导致总线故障的最高地址。
好的、我的机器上没有加载该旧版本。 我只有版本8、9和10。 (您可能需要考虑更新。)
检查您加载了哪些 GEL 文件。 从顶部菜单"Tools"->"GEL Files"。 您应该看到如下所示的内容:
查找以下文件:
C:\ti\ccsv7\ccs_base\emulation\gel\tm4c1294ncpdt.gel。 将其替换为附加的版本并重新启动 Code Composer。
/cfs-file/__key/communityserver-discussions-components-files/81/tm4c1294ncpdt.gel
您好、Sai、
您的代码调用了 ROM 存储器中的函数。 源代码不是项目的一部分、因此消息是正确的。 通常、客户不会通过 ROM 函数进行调试。 它们通常是 CSTEP。 但是、有时您希望查看 TivaWare 函数内发生的情况。 一种方法是从函数名称中删除"map_"或"rom_"前缀。 这样、目标代码将从库中提取、而不是从 ROM 中执行。 您仍然会收到一条有关源位置的错误消息、但您可以搜索源并在 TivaWare 目录"C:\ti\TivaWare_C_Series-2.2.0.295\driverlib"中找到它(具体取决于您使用的 TivaWare 的版本)。
我经常使用另一种方法。 例如、如果我想通过 TivaWare UART 函数进行调试、我将把文件"C:\ti\TivaWare_C_Series-2.2.0.295\driverlib\UART.c"复制到我的项目中。 当我单步执行其中一个 UART 函数时、CCS 可以找到源代码。
第三个(更高级)选项是从"C:\ti\TivaWare_C_Series-2.2.0.295\driverlib\ccs"中导入 CCS 工程、并重建 driverlib.lib 库文件。 然后、该版本将为您的计算机上的 TivaWare 源文件提供正确的路径信息。 然后、您必须将链接器指向该版本的库。 同样、调用时 不带"map_"或"rom_"前缀。
虽然这都是值得学习的好信息、但我怀疑它不能帮助您解决最初的问题。 如果您描述的是原始问题、例如当 I C-step 进入函数"xxxx"时、器件不返回、我可能能够让您对可能发生的情况有一些了解。
尊敬的 Bob:
感谢您询问源代码。 请查找以下代码以了解相关信息。
我正在尝试在 main()循环的 Porta 初始化所有目标器件参数、例如 GPIO、TIMER1A、TIMER2A、TIMER3A 和 UART0。 直到 Timer1A 的初始化、程序执行良好。 在 Timer2A 初始化期间、程序会崩溃、我无法继续调试代码。 您能给我一个关于计划崩溃的见解吗? 期待收到您的一些建议。
/这是运行应用程序的主循环。 // int main (void) { //从 PLL 以120MHz 运行。 //注意:SYSCTL_CFG_VCO_240是 TivaWare 2.2.x 和中提供的新设置 //之后更好地反映由于 SYSCTL_22而导致的实际 VCO 速度。 // G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240)、120000000); //启用所有 GPIO 组。 MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPION); // LED 端口 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_0);//心跳/用户 LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_1);//公制 LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_2);//中文 LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_3);//公头 LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_4);//包容式 LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_5);//图形 LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_6);//普通 LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_7);//输入 LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTM_BASE、(GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3));//端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTM_BASE、(GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6));//端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTL_base、(GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2));//端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTL_base、(GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7));//端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、0xff);// DP LED 端口输出 MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);//检测信号 clrDp(); //为周期性中断配置 SysTick。 MAP_SysTickPeriodSet (g_ui32SysClock/100);// 10 msec map_SysTickIntEnable(); map_SysTickEnable(); //为周期性中断配置计时器1。 MAP_SysCtlPeripheralEnable (SYSCTL_Periph_Timer1); MAP_TimerConfigure (Timer1_base、TIMER_CFG_PERIODICRACASE); MAP_TimerLoadSet (Timer1_base、timer_A、g_ui32SysClock / 10);// 0.5秒 MAP_IntEnable (INT_TIMER1A); MAP_TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT); MAP_TimerEnable (Timer1_base、timer_A);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2); MAP_TimerConfigure (TIMER2_base、TIMER_CFG_PERIODICRACASE); MAP_TimerLoadSet (TIMER2_base、TIMER_A、g_ui32SysClock / 2);// 0.5秒 MAP_IntEnable (INT_TIMER2A); MAP_TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT); MAP_TimerEnable (TIMER2_base、TIMER_A); MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_0)^ GPIO_PIN_0);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3); MAP_TimerConfigure (TIMER3_base、TIMER_CFG_PERIODICRACASE); MAP_TimerLoadSet (TIMER3_base、TIMER_A、g_ui32SysClock / 20);// 0.5秒 MAP_IntEnable (INT_TIMER3A); MAP_TimerIntEnable (TIMER3_base、TIMER_TINA_TIMEOUT); MAP_TimerEnable (TIMER3_base、TIMER_A); //为周期性中断配置计时器2。 //为周期性中断配置计时器3。 //sai 更改为5 //启用处理器中断。 MAP_IntMasterEnable(); //启用 UART。 MAP_GPIOPinConfigure (GPIO_PA0_U0RX); MAP_GPIOPinConfigure (GPIO_PA1_U0TX); MAP_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); //UARTStdioInit (0);//在 TM4C129XL UARTStdioConfig (0、115200、g_ui32SysClock)中不可用; delay100Ms (1);
谢谢、
SAI
当您在尝试启用定时器2的行 CSTEP 后停止调试器时、您是否看到它卡在这里?
//
//
//这是当处理器收到意外
的//中断时调用的代码。 这只是进入一个无限循环、保持系统状态
//供调试器检查。
////
*****************
静态空
IntDefaultHandler (void)
{
//
//进入无限循环。
//
while (1)
{
}
}
在这种情况下、您没有为计时器1中断服务例程设置矢量、并且在尝试初始化计时器2时从计时器1获得中断。
尊敬的 Bob:
是的、我获得了正确的 Bob 信息。 请查看我的整个源代码。 我分别提到了中断。 请告诉我应用程序中的错误是什么。
#include #include #include #include "inc.h"#include #include #include #include //全局变量 uint32_t g_ui32SysClock; volatile unsigned int counter = 0; volatile unsigned int delaycnt = 0 ;volatile int ohmsReadFlag = 0; int blink = 0; char lastBuf[Ohm_BUF_SIZE];// ohmBuf 静态 char char char 'ohmBuf[Ohm_BUF_size]的副本 ;// unsigned static tranuys/void int = 0 //驱动程序库遇到错误时调用的错误例程。 // #ifdef debug void __error__(char *pcFilename,unsigned long ulLine) { } #endif //************* // SysTick 中断的中断处理程序。 // void SysTickIntHandler (void) { counter++; } //********* //针对1个计时器 A 子计时器中断的中断处理程序。 //每秒1次,用于控制 LED 闪烁速率 void Timer1AIntHandler (void) { //清除计时器中断。 ROM_TimerIntClear (Timer1_base、timer_TINA_TIMEOUT); delaycnt++; } //********* //针对2个计时器 A 子计时器中断的中断处理程序。 //每秒1次,用于控制 LED 闪烁速率 void Timer2AIntHandler (void) { //清除计时器中断。 TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT); if (blink) blink = 0; else blink = 1; if (blinkflags & GENBLINK){ maleLED (blink); femaleLED (blink ^ 1); showGender (blink); } if (blinkflags & PPWBLINK);{ blink)} (blink); (blink) graphicLED (闪烁^ 1); } if (blinkflags & PGBLINK){ graphicLED (闪烁); } if (blinkflags & PPBLINK){ plainLED (闪烁); } //********* //针对3个计时器 A 子计时器中断的中断处理程序。 //每秒10次读取密钥 //********* void Timer3AIntHandler (void) { //清除计时器中断。 TimerIntClear (TIMER3_base、TIMER_TINA_TIMEOUT); keyUpdate ();//每0.1秒读取一次 kbd MAP_IntMasterDisable (); if ((state = WAIT4WEIGHT)&&(numKey = 1)&&(weight_lb2 > STEPOFF)){// 仅静态标志 * //这是运行应用程序的主循环。 // int main (void) { //将 PLL 的时钟设置为以80MHz 运行。 // map_SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN); // //从 PLL 以120MHz 运行。 //注意:SYSCTL_CFG_VCO_480是 TivaWare 2.1.4和中提供的新设置 //之后更好地反映由于 SYSCTL_22而导致的实际 VCO 速度。 // G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); //启用所有 GPIO 组。 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM); SysCtlPeripheralEnable (SYSCTL_Periph_GPION); // LED 端口 GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_0);//心跳/用户 LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_1);//指标 LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_2);//中文 LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_3);//公头 LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_4);//包容式 LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_5);//图形 LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_6);//普通 LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_7);//输入 LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTM_BASE、(GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3));//端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTM_BASE、(GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6));//端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTL_base、(GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2));//端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTL_base、(GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7));//端口输出 GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、0xff);// DP LED 端口输出 GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);//检测信号 clrDp(); //为周期性中断配置 SysTick。 SysTickPeriodSet (g_ui32SysClock/100);// 10msec // SAI 更改为1msec SysTickIntEnable(); SysTickEnable(); //为周期性中断配置计时器1。 SysCtlPeripheralEnable (SYSCTL_Periph_Timer1); TimerConfigure (Timer1_base、timer_CFG_PERIODICRACRACASE); TimerLoadSet (Timer1_base、timer_A、g_ui32SysClock / 10);// 0.5秒// SAI 更改为100msec IntEnable (INT_TIMER1A); TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT); TimerEnable (Timer1_base、timer_A); SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2); TimerConfigure (TIMER2_base、TIMER_CFG_PERIODICRACASE); TimerLoadSet (TIMER2_base、TIMER_A、g_ui32SysClock / 2);// 0.5秒// SAI 更改为100msec IntEnable (INT_TIMER2A); TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT); TimerEnable (TIMER2_base、TIMER_A); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_0)^ GPIO_PIN_0);//使 LED 闪烁 SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3); TimerConfigure (TIMER3_base、TIMER_CFG_PERIODICASE); TimerLoadSet (TIMER3_base、TIMER_A、g_ui32SysClock / 20);// 0.5秒// SAI 更改为100ms IntEnable (INT_TIMER3A); TimerIntEnable (TIMER3_base、TIMER_TINA_TIMEOUT); TimerEnable (TIMER3_base、TIMER_A); //为周期性中断配置计时器2。 //为周期性中断配置计时器3。 //启用处理器中断。 IntMasterEnable(); //启用 UART。 GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); //UARTStdioInit (0);//在 TM4C129XL UARTStdioConfig (0、115200、g_ui32SysClock)中不可用; delay100Ms (1);
谢谢、
SAI
尊敬的 Bob:
是的、我在启动文件中缺少那些特定的 Timer1A、Timer2A、Timer3A 和 UART3中断处理程序。 感谢整个过程中的建议、也感谢为我提供调试课程。
extern void SysTickIntHandler (void); extern void UART3IntHandler (void); extern void Timer1AIntHandler (void); extern void Timer2AIntHandler (void); extern void Timer3AIntHandler (void);
SysTickIntHandler、 // SysTick 处理程序 Timer1AIntHandler、 //计时器1子计时器 A Timer2AIntHandler、 //计时器2子计时器 A Timer3AIntHandler、 //计时器3子计时器 A UART3IntHandler、 // UART3 Rx 和 Tx
此致、
SAI