加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

STM32-FLASH_SetLatency问题

发布时间:2020-12-15 19:56:54 所属栏目:百科 来源:网络整理
导读:今天在工作中遇到boot启动时总是跑飞的问题,情况如下: 入口函数:main() ? int main(void) { ? /* System Clocks Configuration */ ? RCC_Configuration(); ? /* NVIC Configuration */ ? NVIC_Configuration(); ? ? dev_eerom_init(); ? dev_spi2_init();?

今天在工作中遇到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 } 如果哪位大神知道怎么回事,麻烦留言告知,谢谢!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读