跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1H系列
  4. 写flash 后读 flash 导致 bus fault

写flash 后读 flash 导致 bus fault

已定时 已固定 已锁定 已移动 未解决 YTM32B1H系列
9 帖子 3 发布者 93 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • iyshengI 离线
    iyshengI 离线
    iysheng
    编写于 最后由 编辑
    #1

    自己写的写 flash 函数,单次写 256 Bytes,循环写 flash 后再读 flash,容易导致如下错误

    psr: 0x01000000
    [22:12:35.756] r00: 0x20010ec4
    [22:12:35.759] r01: 0x20010ec8
    [22:12:35.759] r02: 0x02150100
    [22:12:35.762] r03: 0x20010ec4
    [22:12:35.762] r04: 0x0200ac05
    [22:12:35.765] r05: 0xdeadbeef
    [22:12:35.765] r06: 0xdeadbeef
    [22:12:35.768] r07: 0x20010e38
    [22:12:35.768] r08: 0xdeadbeef
    [22:12:35.771] r09: 0xdeadbeef
    [22:12:35.771] r10: 0xdeadbeef
    [22:12:35.774] r11: 0xdeadbeef
    [22:12:35.774] r12: 0x0000000a
    [22:12:35.777]  lr: 0x02004101
    [22:12:35.777]  pc: 0x02008280
    [22:12:35.780] hard fault on thread: main
    
    [22:12:35.780] bus fault:
    [22:12:35.783] SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:02150100
    

    但是我如果在写之后,添加一定的延时,比如 1ms (实测过),就可以正常运行。请问可能是什么原因?

    1 条回复 最后回复
    0
    • swustS 离线
      swustS 离线
      swust YunTu
      编写于 最后由 编辑
      #2

      写操作需要一定的时间,可能你读的时候还没有写完,写数据后可以等flash idle后再读

      iyshengI 1 条回复 最后回复
      0
      • iyshengI 离线
        iyshengI 离线
        iysheng
        回复了swust 最后由 编辑
        #3

        swust 感谢你的回复,目前测试了在read 之前添加下述代码可以正常运行。

        while(0X00 == (REG32(EFM_STS) & EFM_STS_IDLE_MASK));
        

        补丁如下:

        int board_flash_read(uint32_t addr, uint8_t *data, uint32_t size)
         {
        +    // Wait Flash Idle
        +    while(0X00 == (REG32(EFM_STS) & EFM_STS_IDLE_MASK));
             rt_memcpy(data, (uint8_t *)addr, size);
             return 0;
         }
        

        但是这个 while 循环等待放在 write 函数的末尾还是不能解决问题,好奇怪。

        1 条回复 最后回复
        0
        • swustS 离线
          swustS 离线
          swust YunTu
          编写于 最后由 编辑
          #4

          把while放在write后再加两个空指令试试

          iyshengI 1 条回复 最后回复
          0
          • iyshengI 离线
            iyshengI 离线
            iysheng
            回复了swust 最后由 编辑
            #5

            swust 确实可以哦,方便更深层次解释下原理么?😊

            swustS 1 条回复 最后回复
            0
            • swustS 离线
              swustS 离线
              swust YunTu
              回复了iysheng 最后由 编辑
              #6

              iysheng 应该是CPU指令时序竞争

              iyshengI 1 条回复 最后回复
              0
              • iyshengI 离线
                iyshengI 离线
                iysheng
                回复了swust 最后由 编辑
                #7

                swust 又有了新的问题出现,同样的而 API ,写 0X2150000 这个地址,4字节 0X00000000。这个 flash 地址原始数据不是全 0XFFFFFFFF(之前写过数据),发现数值不变。但是写 0X2170000 这个地址,4字节 0X00000000。这个地址之前的数据是全 0XFFFFFFFF 就可以,请问这个正常么?

                1 条回复 最后回复
                0
                • qinzhaoQ 离线
                  qinzhaoQ 离线
                  qinzhao YunTu
                  编写于 最后由 编辑
                  #8

                  flash只能在被擦除过的地方编程,擦除后就是0xffff。

                  iyshengI 1 条回复 最后回复
                  0
                  • iyshengI 离线
                    iyshengI 离线
                    iysheng
                    回复了qinzhao 最后由 编辑
                    #9

                    qinzhao flash 不是可以将 1 写成 0,ytm32b1ha0 flash 必须要是全 0XFFFFFFFF 才能写入?

                    1 条回复 最后回复
                    0

                  • 云途开发生态介绍

                    快速上手云途开发生态

                  • 云途论坛规则/Yuntu Forum Rules

                    发帖前请查看

                  • YT CONFIG TOOL调查问卷

                    帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                  • can
                    26
                    demo
                    23
                    lin stack
                    13
                    uds
                    13
                    md14
                    6
                    yt-link
                    6
                    fbl
                    5
                    adc模块
                    4
                    Online Users
                    • 登录

                    • 登录或注册以进行搜索。
                    • 第一个帖子
                      最后一个帖子
                    0
                    • 版块
                    • 最新
                    • 标签
                    • 热门