[技术问答] ISP心得体会

[复制链接]
2525|25
 楼主| 東南博士 发表于 2021-6-12 14:41 | 显示全部楼层 |阅读模式
ISP心得体会:
前使用M480系列和M031系列开发了两个产品,其中在使用ISP的时候,发现了一点问题。

不过迎刃而解。

现在把心得体会分享一下
 楼主| 東南博士 发表于 2021-6-12 14:42 | 显示全部楼层
使用环境是:MCU-MAX3232-RS232-PC机;

PC机使用的是USB-RS232 的CH340接口;
 楼主| 東南博士 发表于 2021-6-12 14:43 | 显示全部楼层
使用M031的时候,发现在开发板可以使用ISP,在我们的产品板不行。具体的两个产品型号是不一样的。对此排查了半天,终于发现了原因所在:

FMC.H的定义需要修改
 楼主| 東南博士 发表于 2021-6-12 14:46 | 显示全部楼层
 楼主| 東南博士 发表于 2021-6-12 14:50 | 显示全部楼层
 楼主| 東南博士 发表于 2021-6-12 14:53 | 显示全部楼层
 楼主| 東南博士 发表于 2021-6-12 14:54 | 显示全部楼层
 楼主| 東南博士 发表于 2021-6-12 14:55 | 显示全部楼层
 楼主| 東南博士 发表于 2021-6-12 14:55 | 显示全部楼层
 楼主| 東南博士 发表于 2021-6-12 14:56 | 显示全部楼层
 楼主| 東南博士 发表于 2021-6-12 14:57 | 显示全部楼层
使用UART-RS232电平转换模块,发现可以验证。

但是在我们的产品上,发现不行。

经过debug,发现卡在了一个地方。

7611360c45af4729e3.png
 楼主| 東南博士 发表于 2021-6-12 14:58 | 显示全部楼层
8775860c45b17ce498.png

修改了这里的地方:

    /* Checking if flash page size matches with target chip's */
    if( (GET_CHIP_SERIES_NUM == CHIP_SERIES_NUM_I) || (GET_CHIP_SERIES_NUM == CHIP_SERIES_NUM_G) )
    {
        if(FMC_FLASH_PAGE_SIZE != 2048)
        {
            /* FMC_FLASH_PAGE_SIZE is different from target device */
            /* Please enable the compiler option PAGE_SIZE_2048 in fmc.h */
            while(SYS->PDID);
        }
    }
    else
    {
        if(FMC_FLASH_PAGE_SIZE != 512)
        {
            /* FMC_FLASH_PAGE_SIZE is different from target device */
            /* Please disable the compiler option PAGE_SIZE_2048 in fmc.h */
            while(SYS->PDID);
        }
    }
 楼主| 東南博士 发表于 2021-6-12 14:59 | 显示全部楼层
            /* FMC_FLASH_PAGE_SIZE is different from target device */
            /* Please enable the compiler option PAGE_SIZE_2048 in fmc.h */
 楼主| 東南博士 发表于 2021-6-12 15:00 | 显示全部楼层
启用:
fmc.h例程中的:

3543960c45b770689f.png

33行:
 楼主| 東南博士 发表于 2021-6-12 15:01 | 显示全部楼层
 楼主| 東南博士 发表于 2021-6-12 15:02 | 显示全部楼层
 16/32/64/128K字节型号的芯片,Flash每页512字节
 256/512K字节型号的芯片,Flash每页2048字节

问题出在这里了!
 楼主| 東南博士 发表于 2021-6-12 15:04 | 显示全部楼层
M48X系列的ISP-UART:

7747860c45c8425a47.png
 楼主| 東南博士 发表于 2021-6-12 15:05 | 显示全部楼层
只需要修改IO口的映射即可!
 楼主| 東南博士 发表于 2021-6-12 15:08 | 显示全部楼层
int main(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();
    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();
    /* Init UART to 115200-8n1 */
    UART_Init();
    CLK->AHBCLK |= CLK_AHBCLK_ISPCKEN_Msk;
    FMC->ISPCTL |= FMC_ISPCTL_ISPEN_Msk;
    g_apromSize = GetApromSize();
    GetDataFlashInfo(&g_dataFlashAddr, &g_dataFlashSize);
    SysTick->LOAD = 300000 * CyclesPerUs;
    SysTick->VAL   = (0x00);
    SysTick->CTRL = SysTick->CTRL | SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;//using cpu clock

    while (1)
    {
        if ((bufhead >= 4) || (bUartDataReady == TRUE))
        {
            uint32_t lcmd;
            lcmd = inpw(uart_rcvbuf);

            if (lcmd == CMD_CONNECT)
            {
                goto _ISP;
            }
            else
            {
                bUartDataReady = FALSE;
                bufhead = 0;
            }
        }

        //if((SysTick->CTRL & (1 << 16)) != 0)//timeout, then goto APROM
        if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)
        {
            goto _APROM;
        }
    }
 楼主| 東南博士 发表于 2021-6-12 15:09 | 显示全部楼层
M48X系列的MCU并没有判断FMC页空间的大小部分;以后验证一下,M031是不是去掉这部分也可以!

    /* Unlock protected registers */
    SYS_UnlockReg();
    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();
    /* Init UART to 115200-8n1 */
    UART_Init();
    CLK->AHBCLK |= CLK_AHBCLK_ISPCKEN_Msk;
    FMC->ISPCTL |= FMC_ISPCTL_ISPEN_Msk;
    g_apromSize = GetApromSize();
    GetDataFlashInfo(&g_dataFlashAddr, &g_dataFlashSize);
    SysTick->LOAD = 300000 * CyclesPerUs;
    SysTick->VAL   = (0x00);
    SysTick->CTRL = SysTick->CTRL | SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;//using cpu clock

    while (1)
    {
        if ((bufhead >= 4) || (bUartDataReady == TRUE))
        {
            uint32_t lcmd;
            lcmd = inpw(uart_rcvbuf);

            if (lcmd == CMD_CONNECT)
            {
                goto _ISP;
            }
            else
            {
                bUartDataReady = FALSE;
                bufhead = 0;
            }
        }

        //if((SysTick->CTRL & (1 << 16)) != 0)//timeout, then goto APROM
        if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)
        {
            goto _APROM;
        }
    }

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

本版积分规则

385

主题

6103

帖子

35

粉丝
快速回复 在线客服 返回列表 返回顶部