今天在工作中遇到boot启动时总是跑飞的问题,情况如下:
入口函数:main()
int main(void)
{
/* System Clocks Configuration */
RCC_Configuration();
/* NVIC Configuration */
NVIC_Configuration();
dev_eerom_init();
dev_spi2_init();
.................................
>>>>>>>>>>>>>
}
跑到RCC_Configuration函数时 总是跑飞,跑到0xFFFFFFFE;
跟进去之后发现:
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
在设置FLASH的等待周期时,会跑飞;但是单步 或者 执行之前等一段时间有的时候不会跑飞;
所以问题无法定位;
在网上搜索了FLASH_SetLatency函数的作用,也尝试调整FLASH_SetLatency和RCC的相对位置,都没有成功;
我的FLASH_SetLatency是这么写的:
void FLASH_SetLatency(u32 FLASH_Latency)
{
/* Sets the Latency value */
FLASH->ACR &= 0xFFFFFFF6;
FLASH->ACR |= FLASH_Latency;
}
在多次调试过程中,发现寄存器FLASH->ACR复位后一开始的是0x00000031,执行第一步(FLASH->ACR &= 0xFFFFFFF6;)后FLASH->ACR的值变成了0x00000030;执行第二步(FLASH->ACR |= FLASH_Latency;)时,出错,执行不了;语法上不觉得有什么错误.
汇编语言如下,执行完这一步就飞了:
后来我将FLASH_SetLatency函数改成了下面这个,调试就可以了:
void FLASH_SetLatency(u32 FLASH_Latency)
{
#ifdef FLASH_TEST
/* Sets the Latency value */
// FLASH->ACR &= 0xFFFFFFF6;
// FLASH->ACR |= FLASH_Latency;
#else
u32 tmpreg = 0;
/* Read the ACR register */
tmpreg = FLASH->ACR;
/* Sets the Latency value */
tmpreg &= ((u32)0xFFFFFFF6);//ACR_LATENCY_Mask;
tmpreg |= FLASH_Latency;
/* Write the ACR register */
FLASH->ACR = tmpreg;
#endif
}
如果哪位大神知道怎么回事,麻烦留言告知,谢谢!