我正在使用STM32F7-Discovery板,并且一直试图启用DWT循环计数器.从我在网上看到的,这应该足以启用它:
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= 1;
Run Code Online (Sandbox Code Playgroud)
但是,当我运行该代码时,不会更改值或跳过操作(我不太确定发生了什么).
我已经尝试过指向内存中的地址并直接修改它们,但也无济于事.例如:
volatile uint32_t *DWT_CONTROL = (uint32_t *) 0xE0001000;
volatile uint32_t *DWT_CYCCNT = (uint32_t *) 0xE0001004;
volatile uint32_t *DEMCR = (uint32_t *) 0xE000EDFC;
*DEMCR = *DEMCR | 0x01000000;
*DWT_CYCCNT = 0;
*DWT_CONTROL = *DWT_CONTROL | 1;
Run Code Online (Sandbox Code Playgroud)
目前,我获得的唯一方法是在Visual Studio中使用调试器(使用VisualGDB)时,如果我将DWT-> CTRL的值更改为ON值,则循环计数器开始.除此之外,我似乎无法获得改变代码的价值.
编辑:可能导致这些代码行没有执行任务但也没有崩溃和继续的行为.
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= 1;
Run Code Online (Sandbox Code Playgroud)
在运行这些代码行之后,这些内存位置的所有值都保持不变,并且不会随着应该执行的操作而改变.
EG:
//DWT_CTRL_CYCCNTENA_Msk = 1
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk
Run Code Online (Sandbox Code Playgroud)
应该导致DWT-> CTRL的值为0x40000001,但它保持默认值0x40000000
下面的图片是运行时期间发生的事情的示例.
我知道每个粒子都是特定功能的解决方案,每个粒子和群体都在不断寻找最佳解决方案.如果在第一次迭代后发现全局最佳,并且没有新的粒子被添加到混合中,那么循环是否应该退出并且第一个全局最佳找到的是最合适的解决方案?如果是这种情况,那么PSO比仅仅迭代列表更好.