11017|17

86

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一执行FLASH->ACR|=(uint32_t)FLASH_ACR_LATENCY_2就HardFault了? [复制链接]

本想将程序在flash中调试,因为之前一直在内部sram运行。
跳线啊,一些ROM/RAM地址啊 其他设置都弄好后 开始调试啦。结果发现一执行到FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2就HardFault了
这句在system_stm32f10x.c文件的static void SetSysClockTo72(void)函数里面,我用的3.3的库。
后面我把这三句话FLASH->ACR |= FLASH_ACR_PRFTBE;
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
改为了FLASH->ACR= (uint32_t)(FLASH_ACR_PRFTBE|FLASH_ACR_LATENCY_2);就没有任何fault了。程序完全正常了!我看了,上面写法不同,但寄存器最终结果还是一样的,但是库函数那种就fault了
MDK调试下看到,USG_FAULT那个寄存器里面UNDEFINSTR置位1了,HARD_FAULT里面FORCED置位1了
此帖出自stm32/stm8论坛

最新回复

lz:我也遇到同样的问题,你这边最后是怎么解决这个问题呢  详情 回复 发表于 2016-8-9 16:17
点赞 关注
 

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
晕 可以上图片啊 之前不知道啊

1.jpg (55.75 KB)

1.jpg

此帖出自stm32/stm8论坛
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
执行的这句话是设置flash的等待周期。
0:(0, 24MHz]
1: (24MHz, 48MHz]
2:(48Mhz, 72MHz]

如果你此时cpu本身的运算速度和设置后的不符合,就会hard fault。
此帖出自stm32/stm8论坛
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
CPU系统时钟设置对的啊 这个时钟频率和等待周期的对应关系我知道的
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
改为了FLASH->ACR= (uint32_t)(FLASH_ACR_PRFTBE|FLASH_ACR_LATENCY_2);
就好了 其实对ACR的设置值,两种方法最终是一样的,但是结果是库函数那样搞 第3句执行完就HardFault了。我自己写的就没有HardFault了
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 


static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
   


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
.............以下函数内容省略
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 请检查一下编译出来的汇编代码,是否有误。
此帖出自stm32/stm8论坛
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

7
 
按库函数的那三句话编译出来的
   904:     FLASH->ACR |= FLASH_ACR_PRFTBE;
   905:  
   906:     /* Flash 2 wait state */
0x08001370 4A4A      LDR      r2,[pc,#296]  ; @0x0800149C
0x08001372 6812      LDR      r2,[r2,#0x00]
0x08001374 F0420210  ORR      r2,r2,#0x10
0x08001378 4B48      LDR      r3,[pc,#288]  ; @0x0800149C
0x0800137A 601A      STR      r2,[r3,#0x00]
   907:     FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
0x0800137C 461A      MOV      r2,r3
0x0800137E 6812      LDR      r2,[r2,#0x00]
0x08001380 F0220203  BIC      r2,r2,#0x03
0x08001384 601A      STR      r2,[r3,#0x00]
   908:     FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
   909:  
   910:         /* HCLK = SYSCLK */
0x08001386 461A      MOV      r2,r3
0x08001388 6812      LDR      r2,[r2,#0x00]
0x0800138A F0420202  ORR      r2,r2,#0x02
0x0800138E 601A      STR      r2,[r3,#0x00]
/*------------------------------------------------------------------------------*/
我自己写的编译出来:
   903:     FLASH->ACR= (uint32_t)(FLASH_ACR_PRFTBE|FLASH_ACR_LATENCY_2);
   904:  
   905:         /* HCLK = SYSCLK */
0x08001370 2212      MOVS     r2,#0x12
0x08001372 4B43      LDR      r3,[pc,#268]  ; @0x08001480
0x08001374 601A      STR      r2,[r3,#0x00]
/*----------------------------------------------------------------------------------*/
我自己写的编译出来似乎。。。。不过我自己写的就没有HardFault。库函数就HardFault了啊
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
请在库函数编译出来代码的最后一行放一个断点,看看r2的内容:
    0x0800138E 601A      STR      r2,[r3,#0x00]
此帖出自stm32/stm8论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 R2是0x00000012
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 R2的值此时对应ACR寄存器的值?似乎是FLASH的ACR寄存器PRFTBS置0了,就是说预取缓冲区关闭了?
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 呵呵 手头没的硬件现在 软件仿真看到的结果 不知道会不会和实际用J-LINK在板子上跑,数值由偏差
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
呵呵 手头没的硬件现在 软件仿真看到的结果 不知道会不会和实际用J-LINK在板子上跑,数值由偏差
软件仿真?早说呢!
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

13
 
硬件仿真 r2是0x00000032啊
执行完0x0800138E 601A      STR      r2,[r3,#0x00] 就HardFault了
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 
额 我自己写的FLASH->ACR= (uint32_t)(FLASH_ACR_PRFTBE|FLASH_ACR_LATENCY_2);
硬件仿真 r2是0x00000012
看来 快要知道为什么了
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 
就是一个ACR寄存器里面,PRFTBS预取缓冲区状态 值不同。看文档,这是个只读寄存器啊??
参考的PM0042 即STM32F10XXX闪存编程中文版
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
                                 
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
                                 请不要用软件仿真,直接硬件上运行,我测试过,没有问题,别人也都没有发现这种问题。
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
lz:我也遇到同样的问题,你这边最后是怎么解决这个问题呢
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表