写了个通用的stm32串口bootloader

本文介绍了一种自定义的STM32 bootloader,它支持多种MCU型号,只需配置文件调整即可适应,内置命令行功能便于Flash操作和EEPROM管理。通过修改Makefile和usart设置,简化了移植过程。
摘要由CSDN通过智能技术生成

陆续给手里若干型号的stm32写过bootloader. 每次换新型号都得重新折腾一遍, 太麻烦了. 某次水木网友spadger提到他做的一个bootloader, 支持N多型号, 只要改下配置文件就能适应不同型号;此外还提供了简单的命令解释器, 可以在串口命令行实现查看/擦除任意位置flash, 模拟eeprom读写(与app共享)等功能. 是不是挺实用? 于是打算自己也实现一个.

先给出github地址:

https://github.com/tomzbj/zboot​github.com

目前已经支持的mcu有: stm32f072cb, stm32f303cc, gd32f350cb, stm32f030c8, stm32f103rc. 前面三者均实测可用. 在flash每页1k的mcu上共占用8k flash, 其中eeprom占1页, 提供256字节eeprom空间; 在flash每页2k的mcu上共占用10k flash, 提供512字节eeprom空间.

串口波特率定为500kbps, 因为为了时钟配置简单起见, bootloader在8M HSI时钟运行.

使用时只需要选择对应型号的Makefile, 并在usart.c里修改用到的usart外设和管脚即可.

上位机见根目录的iap.py, 用python3执行, 需要zlib和bincopy两个第三方库.

app这边需要做的:

  1. 写入bootloader后在串口命令行执行## sysinfo, 取得app区的入口地址, 应该是0x08002000或0x08002800.
  2. 修改链接文件(.ld或.lds, 在不同开发环境下可能不同), 把flash区的起始地址改为上面的入口地址, length要根据页大小减去8k或10k.
  3. Makefile或者其他类似指定了flash大小的场合,要减去8k或10k.
  4. main.c在最前面加上两行, 其中VECT_TAB_OFFSET的值是0x2000或0x2800.
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, VECT_TAB_OFFSET);
    __enable_irq()

如果是stm32f0系列呢?它们不提供重定向中断向量表的功能, 所以NVIC_SetVectorTable就没用了. 不过bootloader还是能用的,稍微麻烦一点, 需要在main.c最前面加上这几行, 把中断向量表复制到SRAM的起始位置, 然后把复位地址改为指向SRAM起始位置. APP_BASE的值是前面提到过的0x08002000或0x08002800. __enable_irq()则还是需要的. 此外, .ld/.lds文件里SRAM起始位置需要改为0x20000100, LENGTH要减去256.

    memcpy((void*)(0x20000000), (void*)APP_BASE, 256);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
    __enable_irq()

如果要在app里使用eeprom呢?只要在app里加上flash_eeprom.h和flash_eeprom.c两个文件, 并在使用前先初始化即可:

    FLASH_EEPROM_Config(APP_BASE - PAGE_SIZE, PAGE_SIZE);

ps. 用到了elm-chan的xprintf库, 致谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被大佬糊弄的只会点灯的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值