最近发现了 DWT 的比较器(就是 debug 的时候实现 watchpoint 功能的模块)是可以由软件控制并触发 Debug Monitor 异常的,
由此可以实现“当某个变量/内存地址被改写的时候触发一个中断”这样的功能。
测试代码:
/* 时钟和 printf 初始化略 */
/* data[10] 是初始为 0 的全局整型数组 */
/* Enable Trace and Debug Monitor exception */
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk |
CoreDebug_DEMCR_MON_EN_Msk;
// /* Number of comparators available */
// dwt_numcomp = _FLD2VAL(DWT_CTRL_NUMCOMP, DWT->CTRL);
/* Configure comparators */
DWT->FUNCTION0 = 0; /* Disable */
DWT->COMP0 = (uint32_t)&data[