工具/软件:Code Composer Studio
您好!
这是一个较旧线程的后续操作: CCS/EK-TM4C129EXL:硬件观察点未触发
我们再次使用全新的 CCS 8.0分析了硬件观察点的行为。 错误(或不确定性)仍然存在。 这是因为: BTW:地址 0x40064004 不是位段地址。 TM4C129E 数据表第115页指出:外设位带别名从0x4200.0000到0x43FF.FFFF。
这意味着0x40064004是标准外设存储器访问。 数据表第10.3.1.2章介绍了数据寄存器修改多个位(使用位掩码)的操作。 因此、地址0x40064004的最后一个"4"表示选择最低 GPIODATA 位的0b100。 然后可以将其设置为1或0。 同样适用于0x400643FC:0x3FC = 0b11111100、它选择从7到0的所有位都可更改。
因此、如果我按照旧线程中的建议选择0x40064004作为硬件观察点的触发地址、我可以(有时)在访问 GPIO 端口 N 的位0时成功地触发硬件观察点
但是、如果我选择0x400643FC、它不会触发、尽管内存浏览器正确显示了寄存器内容的更改。 不幸的是、这不能像我们所知道的那样正常工作。
更奇怪的是:如果我同时写入两个位(例如、位0和位1来打开引脚0和1上的两个 LED)、位0上的观察点停止被触发。 因此、只能在一个端口上触发一个单一位访问、而不能在多个位上触发。
还有更多的问题:有时、当调试终止并重新启动时、会显示一个观察点被禁用、但它仍然有效、即使在所有断点都被删除后也是如此!
下次重新启动调试时、观察点仍然处于活动状态。 但无法将其删除、因为没有! 哈? 如果再次重新创建观察点、则执行会恢复、但现在不会在活动观察点停止!...
抱歉、这会使硬件观测点对我们的应用无用。
也许有人有新的建议或解释?
此致、Greg
// //显示 EK-TM4C129EXL 上的奇怪硬件观察点行为的简单示例 //********* #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" int main (void) { SysCtlPeripheralEnable (SYSCTL_Periph_GPION); //在这里等待3个时钟 SysCtlDelay (2); GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1_GPIO_PIN_0); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1|GPIO_PIN_0、0x00); while (1) { GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、1);//观察点0x40064004触发正确 GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);//观察点0x40064004触发正确 GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1|GPIO_PIN_0、3);//观察点0x40064004不会触发 GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1|GPIO_PIN_0、0);//观察点0x40064004不会触发 } }