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;)时,出错,执行不了;语法上不觉得有什么错误.
汇编语言如下,执行完这一步就飞了:

后来我将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
}
如果哪位大神知道怎么回事,麻烦留言告知,谢谢!







 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值