stm32l01系列单片机通过串口编程(ISP)

来源:互联网 发布:宁远县优化办 编辑:程序博客网 时间:2024/06/05 02:32

通过串口给stm32l01系列单片机编程方法总结

官方给出的ISP软件(串口烧录软件)FlashLoader Demonstrator不支持stm32l01系列的单片机那么我们怎么使用串口给这个型号的单片机通过串口烧录程序呢?
最近做了一个项目有这方面的需求,所以研究了一下这个方法,在此分享出来给有需要的人。准备工具只需mcuisp(也称flymcu)软件,串口助手
给懒人提供mcuisp软件mcuisp
经过我的试验mcuisp可以给这个单片机编程但是不能擦除这个芯片,后来我发现这个芯片的擦除指令不一样有兴趣的同学可以读一读这个文档AN3155 (USART protocol used in the STM32 bootloader)去度娘搜。
所以我们现在的任务就是想办法擦除这个芯片然后通过mcuisp这个软件下载进去(我的想法就是已经有了的工具知道原理后直接拿来用也无妨),AN3155资料里详细介绍了每个指令的用法,我们主要读擦除指令部分
这个芯片支持Extended Erase Memory Command,但是它不支持这个指令里的高级指令,所以想擦除这个芯片必须用最麻烦的那个步骤。一页一页的进行擦除,我的这个芯片有16k flash每页有128b所以一共有128页需要擦除,如果一条一条的发指令最少需要129条指令发,所以我用Qt写了一个串口上位机帮助我完成这个繁琐的过程。Qt我用的还不是太熟练基本上是还没看到门槛的状态,在这里提供解决思路,如果有想借鉴的话在本帖下面回复我可以把主要代码共享出来。
另外我用的这个芯片支持用户自定义boot选项所以配合这个用着就更爽。选择boot区的代码如下:

void BOOTCONF_User() //判断系统从哪启动如果从systemflsh启动更改选项字节使其从                                               //Flash program memory启动{    HAL_StatusTypeDef status = HAL_OK;     uint32_t tmp = 0U, tmp1 = 0U;    if (LL_SYSCFG_GetBootMode() == LL_SYSCFG_BOOTMODE_SYSTEMFLASH)    {        tmp = OB->USER & (~0XE000);        tmp |= (1u << 15);        tmp1 = (~tmp) << 16;        tmp |= tmp1;        HAL_FLASH_OB_Unlock();        status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);        {            OB->USER = tmp;            FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);        }               HAL_FLASH_OB_Launch();        HAL_FLASH_OB_Lock();    }}
void BOOTCONF_System()//接收到编程指令后怎么触发自己定义,让芯片进入system bootloader{    HAL_StatusTypeDef status = HAL_OK;    uint32_t tmp = 0U, tmp1 = 0U;    tmp = OB->USER | 0X00E000;    tmp &= 0X00BFFF;    tmp1 = (~tmp) << 16;    tmp |= tmp1;    HAL_FLASH_OB_Unlock();    FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);    {        OB->USER = tmp;        FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);    }    HAL_FLASH_OB_Launch();    HAL_FLASH_OB_Lock();}
0 0
原创粉丝点击