历史上的今天
返回首页

历史上的今天

今天是:2024年12月14日(星期六)

2018年12月14日 | STM32L431之MDK-ARM单步调试错乱

2018-12-14 来源:eefocus

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

推荐阅读

史海拾趣

Hei Inc Optoelectronic Division公司的发展小趣事
无触点控制电路结构相对简单,维护更为方便,且随着电子技术的不断发展,易于进行功能升级和扩展。
Aerovox Corporation公司的发展小趣事
控制电路需要具备良好的电磁兼容性,以避免对周边设备产生干扰或被干扰。
Geo Semiconductor Inc公司的发展小趣事
采用更先进的微处理器或PLC(可编程逻辑控制器)作为控制核心,以提高控制精度和响应速度。
GE Industrial Solutions公司的发展小趣事
由于光耦的CTR随温度变化而变化,可能导致输出信号的非线性失真。解决方法包括选择温度稳定性好的光耦,或在电路中加入温度补偿电路。
First Sensor公司的发展小趣事
通过输入不同幅度的信号,测量输出信号的幅度,并计算输入输出之间的线性关系。
對餘科技(DIOFIT)公司的发展小趣事

随着科技的不断发展,DIOFIT公司始终将技术创新作为发展的核心驱动力。他们不断投入研发资金,引进先进技术和人才,致力于研发具有自主知识产权的电子产品。在物联网、人工智能等前沿领域,DIOFIT公司取得了一系列突破性的成果,推出了一系列具有竞争力的产品,成为行业内的技术创新引领者。

问答坊 | AI 解惑

高速PCB设计EMI规则探讨(二)

规则五:高速PCB设计的布线方向规则 相邻两层间的走线必须遵循垂直走线的原则,否则会造成线间的串扰,增加EMI辐射,如下图: 此主题相关图片如下: 相邻的布线层遵循横平竖垂的布线方向,垂直的布线可以抑制线间的串扰。 规则六:高速PCB设计 ...…

查看全部问答>

无刷直流的为什么不可以反转啊

来自EEWORLD合作qq群:49900581 群主:wangkj void SetPhase (unsigned char direction,unsigned char BLDCstatus,unsigned int power) { if(direction==BLDC_CLOCKWISE) //正转 { switch(BLDCstatus) { case 1: SetGate(1,2,power);break; ...…

查看全部问答>

控制面板下电源属性的界面为什么简体中文和繁体中文不一样????

电池属性->方案 简体中文下只有 \"将状态切换为系统空闲\" 繁体中文下有 \"切换状态为使用者闲置\" \"切换状态为系统闲置\" \"切换状态为暂停\" 想让 简体中文 和 繁体中文的选项一致,请问应该怎样修改?? …

查看全部问答>

串口ReadPortThread读到数据后,怎样正确显示出来?

DWORD WINAPI ReadPortThread(LPVOID lpvoid) { BYTE Byte;     DWORD dwCommModemStatus,         dwBytesTransferred;     CString tempStr;     // Specify a set of events ...…

查看全部问答>

vxWorks 组件

vxWorks中的组件很多,还都是英文的,不太方便。 请问有没有翻译好的,并且概述每个组件功能的网站或者电子书。 谢谢了!…

查看全部问答>

液晶1602显示源代码

液晶1602显示源代码 #include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit en=P2^0;sbit rs=P2^1;uchar code table[]=\"I LOVE YOU\";uchar code table1[]=\"FOREVER MAMA!\";uchar num;void delay(uint z);void write ...…

查看全部问答>

程序跳转

void send (uchar n) {     SBUF=n;     while(!TI)   ;    TI=0; }   void main() {    SP=0x30;    init_cpu();   //这个函数设置串口通讯 &n ...…

查看全部问答>

求助F2001定时器问题

各位大哥帮帮忙,我如下设置了定时器中断,但是每次执行中断服务程序的时间怎么是设置时间的3倍啊! void Init_TimerA(void) { BCSCTL3 |= LFXT1S_2; // ACLK = VLO TACCR0 = 10000; ...…

查看全部问答>

Verilog HDL练习题和Verilog基础知识适合verilog新人.rar

Verilog HDL练习题和Verilog基础知识适合verilog新人 Verilog的135个经典设计实例…

查看全部问答>

stm32+sd卡+fatfs0.08文件系统,图片的数据读取不对。。请大侠们支个招。。

  这个是bmp图片的数据;   我现在用文件系统读取前面八个字节的数据,老读不出来,读取的数据总是2000073c(16进制); 图片文件直接在sd卡下面,读取一个名叫,qin.bmp 的图片文件     以下是我的部分代码;   ...…

查看全部问答>