打印
[应用相关]

STM32L431之MDK-ARM单步调试错乱

[复制链接]
580|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原文:https://blog.csdn.net/baicaiaichibaicai/article/details/60960378


芯片默认使用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;
}


使用特权

评论回复
沙发
xiaoqizi|  楼主 | 2019-6-13 15:04 | 只看该作者
但是单步调试的时候发现无法进入SystemCoreClockUpdate();继续单步往下走之后才可进入,而且能够同时进入两个分支。



使用特权

评论回复
板凳
xiaoqizi|  楼主 | 2019-6-13 15:04 | 只看该作者

使用特权

评论回复
地板
xiaoqizi|  楼主 | 2019-6-13 15:05 | 只看该作者
查看程序的反汇编



使用特权

评论回复
5
xiaoqizi|  楼主 | 2019-6-13 15:06 | 只看该作者
最终追踪到在设置SYSTEM_CLOCK时,汇编指令就变调。

    /* set clock prescaler and SYSTME_CLOCK src */
    RCC->CFGR = 0x00000003;
    while (0x0C == (RCC->CFGR & 0xC0));


使用特权

评论回复
6
xiaoqizi|  楼主 | 2019-6-13 15:06 | 只看该作者
原因是因为提高系统时钟之后,也要增加读取Flash时的延迟时间(见RM中的3.3.3 Read access latency)

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

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


使用特权

评论回复
7
heimaojingzhang| | 2019-7-5 10:05 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
keaibukelian| | 2019-7-5 10:30 | 只看该作者
有时候单步调试和非单步调试现象是不一样的

使用特权

评论回复
9
xiaoqizi|  楼主 | 2019-7-5 11:54 | 只看该作者
确实很多时候不一样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

3860

帖子

3

粉丝