STM32-FLASH_SetLatency问题

今天在工作中遇到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;)时,出错,执行不了;语法上不觉得有什么错误.
汇编语言如下,执行完这一步就飞了:
STM32-FLASH_SetLatency问题_第1张图片
后来我将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
}
如果哪位大神知道怎么回事,麻烦留言告知,谢谢!







 

你可能感兴趣的:(stm32)