×
单片机 > 单片机程序设计 > 详情

STM32L431之MDK-ARM单步调试错乱

发布时间:2020-09-01 发布时间:
|

芯片默认使用MSI,频率只有4M,现在需要改成最大时钟80M。一个简单的程序如下:


void SystemClock_Init(void){


    /* enable HSE */

    RCC->CR |= 0x00010000U;

    while (0 == (RCC->CR & 0x00020000U));


    /* configure PLL */

    RCC->PLLCFGR = (3 << 0) | (3 << 4) | (80 << 8) | (1 << 16) | (0 << 17) | (1 << 20) | (1 << 21) | (1 << 24) | (0 << 25); /* Fvco = (8M) * (80/4) = 160M,SYSTEM_CLOCK = PLL_R = (Fvco / 2) = 80M */

    /* enable PLL */

    RCC->CR |= 0x01000000U;

    while (0 == (RCC->CR & 0x02000000U));


    /* set clock prescaler and SYSTME_CLOCK src */

    RCC->CFGR = 0x00000003;

    while (0x0C == (RCC->CFGR & 0xC0));


    SystemCoreClockUpdate();

    return;

}


int main(void){


    SystemClock_Init();

    return 0;

}


但是单步调试的时候发现无法进入SystemCoreClockUpdate();继续单步往下走之后才可进入,而且能够同时进入两个分支。 




查看程序的反汇编 

 

 


最终追踪到在设置SYSTEM_CLOCK时,汇编指令就变调。


    /* set clock prescaler and SYSTME_CLOCK src */

    RCC->CFGR = 0x00000003;

    while (0x0C == (RCC->CFGR & 0xC0));


原因是因为提高系统时钟之后,也要增加读取Flash时的延迟时间(见RM中的3.3.3 Read access latency)


解决方法为在切换时钟前先配置Flash的延迟时间


FLASH->ACR = (FLASH->ACR & 0xFFFFFFF8) | 4;

关键字:STM32L431  MDK  ARM  单步调试 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会