打印
[技术问答]

ISP心得体会

[复制链接]
2044|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者

使用特权

评论回复
5
東南博士|  楼主 | 2021-6-12 14:50 | 只看该作者

使用特权

评论回复
6
東南博士|  楼主 | 2021-6-12 14:53 | 只看该作者

使用特权

评论回复
7
東南博士|  楼主 | 2021-6-12 14:54 | 只看该作者

使用特权

评论回复
8
東南博士|  楼主 | 2021-6-12 14:55 | 只看该作者

使用特权

评论回复
9
東南博士|  楼主 | 2021-6-12 14:55 | 只看该作者

使用特权

评论回复
10
東南博士|  楼主 | 2021-6-12 14:56 | 只看该作者

使用特权

评论回复
11
東南博士|  楼主 | 2021-6-12 14:57 | 只看该作者
使用UART-RS232电平转换模块,发现可以验证。

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

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

使用特权

评论回复
12
東南博士|  楼主 | 2021-6-12 14:58 | 只看该作者


修改了这里的地方:

    /* 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);
        }
    }

使用特权

评论回复
13
東南博士|  楼主 | 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 */

使用特权

评论回复
14
東南博士|  楼主 | 2021-6-12 15:00 | 只看该作者
启用:
fmc.h例程中的:



33行:

使用特权

评论回复
15
東南博士|  楼主 | 2021-6-12 15:01 | 只看该作者

使用特权

评论回复
16
東南博士|  楼主 | 2021-6-12 15:02 | 只看该作者
 16/32/64/128K字节型号的芯片,Flash每页512字节
 256/512K字节型号的芯片,Flash每页2048字节

问题出在这里了!

使用特权

评论回复
17
東南博士|  楼主 | 2021-6-12 15:04 | 只看该作者
M48X系列的ISP-UART:

使用特权

评论回复
18
東南博士|  楼主 | 2021-6-12 15:05 | 只看该作者
只需要修改IO口的映射即可!

使用特权

评论回复
19
東南博士|  楼主 | 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;
        }
    }

使用特权

评论回复
20
東南博士|  楼主 | 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;
        }
    }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

382

主题

6081

帖子

34

粉丝