硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1008|回复: 3
收起左侧

[SPI/QSPI] OSPI的IAR下载算法程序进行debug调试

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2022-12-14 09:09:41 | 显示全部楼层 |阅读模式
最近做一个stm32h723的ospi的IAR下载算法,是根据IAR的安装目录IAR\arm\src\flashloader\ST\FlashSTM32H7xx_QSPI这个工程来修改成为OSPI下载算法,出现问题是在下载算法程序中进行debug调试,有时候可以正常读到w25q的存储芯片的id,有时候卡在 image.png image.png 这里,这个概率卡在这里的概率比较大。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-12-14 15:51:50 | 显示全部楼层
不做调试算法,你这个驱动代码没问题吧,如果仅仅是读取ID就不太顺畅,说明驱动确实有点问题,
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2022-12-15 08:50:21 | 显示全部楼层
eric2013 发表于 2022-12-14 15:51
不做调试算法,你这个驱动代码没问题吧,如果仅仅是读取ID就不太顺畅,说明驱动确实有点问题,

驱动代码在flash和sram都可以正常运行,就移植到IAR下载算法就出现问题,目前找不出问题。
回复

使用道具 举报

4

主题

46

回帖

58

积分

初级会员

积分
58
发表于 2022-12-15 11:53:16 | 显示全部楼层
以前做的V7 IAR下载算法,,我用的FL2,用的时候注意看门狗.在我这边是可用的.
[C] 纯文本查看 复制代码
/*********************************************************************************************** 
** Author        : DengXiaoJun(邓小俊)
** Date          : 2022-09-07 12:02:13 +0800
** Description   : When I Has Time ,I Will Write Description Below:
** ModifyRecord1 :    
** ModifyRecord2 :    
** LastEditors   : DengXiaoJun(邓小俊)
** LastEditTime  : 2022-09-08 10:34:57 +0800
************************************************************************************************/ 
#include "BoardDrvHeader.h"
#include "flash_loader.h"
#include "flash_loader_extra.h"

extern void CoreClockInit();

#if USE_ARGC_ARGV
static const char* FlFindOption(char* option, int with_value, int argc, char const* argv[]);
#endif

//看门狗,部分脚本会在烧录时候打开看门狗
__no_init IWDG_HandleTypeDef IWDG1Handle;

//Flash初始化
#if USE_ARGC_ARGV
uint32_t FlashInit(void *base_of_flash, uint32_t image_size,uint32_t link_address, uint32_t flags,int argc, char const *argv[])
#else
uint32_t FlashInit(void *base_of_flash, uint32_t image_size,uint32_t link_address, uint32_t flags)
#endif  /* USE_ARGC_ARGV */
{
    /* Check if hardware IWDG1 is enabled */
    if (0 == (FLASH->OPTSR_CUR & FLASH_OPTSR_IWDG1_SW))
    {
        IWDG1Handle.Instance = IWDG1;
        /* IWDG1 is already initialized by the flashloader macro script */
    }
    else
    {
        IWDG1Handle.Instance = 0;
    }
    __iar_data_init3(); // Required to initialize .bss
    //系统初始化
    SystemInit();
    //时钟初始化
    CoreClockInit();
    //延时初始化
    CoreDelayInit();
    //MPU初始化
    MCU_MPU_ConfigInit();
    //Cache使能
    MCU_MPU_CacheEnable();
    //串口初始化
    MCU_UART1_Init(115200,MCU_UART_LENGTH_8B,MCU_UART_STOPBIT1,MCU_UART_CHECK_MODE_NONE,
                        MCU_UART_HARD_CONTROL_NONE);
    uint8_t ret = 0;
    //初始化
    ret = BoardW25Q256JV_Init();
    if(ret != 0)
    {
        //串口数据打印
        MCU_UART1_Printf("FlashInit BoardW25Q256JV_Init Failed\r\n");
        strcpy(ERROR_MESSAGE_BUFFER, "BoardW25Q256JV_Init Failed");
        return RESULT_ERROR_WITH_MSG;
    }
    //FLASH检查
    ret = BoardW25Q256JV_Check();
    if(ret != 0)
    {
        //串口数据打印
        MCU_UART1_Printf("FlashInit BoardW25Q256JV_Check Failed\r\n");
        strcpy(ERROR_MESSAGE_BUFFER, "BoardW25Q256JV_Check Failed");
        return RESULT_ERROR_WITH_MSG;
    }
    return RESULT_OK;
}

//Flash写入
uint32_t FlashWrite(void *block_start,uint32_t offset_into_block,uint32_t count,char const *buffer)
{
    uint32_t size = 0;
    /* Set destination address */
    uint32_t dest = (uint32_t)block_start + offset_into_block;
    /* Set source address */
    uint8_t * src = (uint8_t*)buffer;
    uint32_t result;
    /* Feed the watchdogs */
    if (IWDG1Handle.Instance) HAL_IWDG_Refresh(&IWDG1Handle);
    while(size < count)
    {
        /* Write one page */
        result = BoardW25Q256JV_WriteNoCheck(src,dest, W25Q256JV_PAGE_SIZE);
        if(result != 0)
        {
            //串口数据打印
            MCU_UART1_Printf("FlashWrite,BoardW25Q256JV_WriteNoCheck Failed,Addr: 0X%08X,Length: %d\r\n",dest,W25Q256JV_PAGE_SIZE);
            strcpy(ERROR_MESSAGE_BUFFER, "BoardW25Q256JV_WriteBufferSafe Failed");
            return RESULT_ERROR_WITH_MSG;
        }
        size += W25Q256JV_PAGE_SIZE;
        dest += W25Q256JV_PAGE_SIZE;
        src  += W25Q256JV_PAGE_SIZE;
    }
    return RESULT_OK;
}

//Flash擦除
uint32_t FlashErase(void *block_start,uint32_t block_size)
{
    uint32_t result;
    /* Feed the watchdogs */
    if (IWDG1Handle.Instance) HAL_IWDG_Refresh(&IWDG1Handle);
    uint32_t addr = (uint32_t)block_start;
    //执行擦除
    result = BoardW25Q256JV_EraseSector((uint32_t)(addr/W25Q256JV_SECTOR_SIZE));
    if(result != 0)
    {
        //串口数据打印
        MCU_UART1_Printf("FlashErase,BoardW25Q256JV_EraseSector Failed,Addr: 0X%08X,BlockSize: %d\r\n",addr,block_size);
        strcpy(ERROR_MESSAGE_BUFFER, "BoardW25Q256JV_EraseSector Failed");
        return RESULT_ERROR_WITH_MSG;
    }
    return RESULT_OK;
}

/** private functions **/
#if USE_ARGC_ARGV
/** private functions **/
static const char* FlFindOption(char* option, int with_value, int argc, char const* argv[])
{
int i;

  for (i = 0; i < argc; i++)
  {
    if (strcmp(option, argv[i]) == 0)
    {
      if (with_value)
      {
        if (i + 1 < argc)
          return argv[i + 1]; // The next argument is the value.
        else
          return 0; // The option was found but there is no value to return.
      }
      else
      {
        return argv[i]; // Return the flag argument itself just to get a non-zero pointer.
      }
    }
  }
  return 0;
}
#endif 
//
//#if CODE_ADDR_AS_VOID_PTR
//uint32_t FlashChecksum(void const *begin, uint32_t count)
//#else
//uint32_t FlashChecksum(uint32_t begin, uint32_t count)
//#endif
//{
//    uint32_t startAddr = (uint32_t)begin;
//    /* Feed the watchdogs */
//    if (IWDG1Handle.Instance) HAL_IWDG_Refresh(&IWDG1Handle);
//    //开启内存映射模式
//    BoardW25Q256JV_MemoryMapped();
//    //串口数据打印
//    MCU_UART1_Printf("FlashChecksum,Addr: 0X%08X,Length: %d\r\n",startAddr,count);
//    //计算CRC
//    uint32_t crcResult = Crc16((uint8_t const*)startAddr,count);
//    return crcResult;
//}
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 22:48 , Processed in 0.167679 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表