历史上的今天
今天是: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;
史海拾趣
|
规则五:高速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 ...… 查看全部问答> |
|
液晶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 ...… 查看全部问答> |
|
各位大哥帮帮忙,我如下设置了定时器中断,但是每次执行中断服务程序的时间怎么是设置时间的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 的图片文件 以下是我的部分代码; ...… 查看全部问答> |




