之前准备电赛的时候,需要用到无线调试器,先是上淘宝看了一下,基本都是大几百,所以想着自己自制一个,直接搞DAP无线调试器有点难,所以就用手头现有的蓝牙模块搞了一个串口无线下载器,调试的话就靠printf打印了;
也做了好几个版本,最初的版本主要有两个大的问题:
1、没有程序校验过程,不能保证单片机收到的APP程序是完整且正确的;
2、没有错误解决机制,一旦APP程序错误或者程序跑飞,就必须手动按下复位键进行复位;
为解决以上两个问题,采取了以下措施
1、对APP程序加入CRC校验;
2、加入看门狗,解决程序跑飞问题;
以下是关于这个项目的具体介绍:
一、APP程序部分
首先要有一个APP程序,与一般的程序相比,APP程序有两个地方需要进行配置:
分别如下图所示:
1、在system_stm32f4xx.c中进行修改:
![]() |
|---|
2、在小锤子那里进行修改:
![]() |
|---|
3、修改完毕后,进行正常的编译即可;
二、BIN文件的处理
最初的版本并没有加入crc校验,所以经常会出错,导致程序经常跑飞,所以加入了crc32校验;经检验,效果那是非常的好;
为什么是采用bin文件而不是使用更容易得到的hex文件呢?
原因很简单:因为写入单片机flash的程序实际就是bin文件,hex文件需要转换才能写进flash中;
以上操作只是得到了hex文件,而我们需要的是bin文件,以下是对hex文件的处理过程:
1、第一步呢,当然是得到最初的bin文件;而Keil默认情况下编译成功后生成的是Hex文件,而不是bin文件,所以要将Hex文件转换为bin文件,当然是有现成的Hex转bin的程序的,但是比较麻烦,可以用Keil自带的功能完成编译后自动生成bin文件的过程,具体的方法请自行百度;
这是我的配置,仅供参考:
D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe —bin -o fromelf —bin -o “$L@L.bin” “#L”
2、然后是对bin文件进行处理,也就是crc32校验码的生成以及插入该校验码到bin文件中,我用的是python脚本的方式,代码如下:
1 | # -*- coding:utf-8 -*- |
代码我就不多解释了,应该还是挺容易看懂的;
3、然后是对Keil进行配置,实现编译,生成bin文件和加入CRC校验可以一步完成;
具体配置结果的截图如下:
![]() |
|---|
配置成功后输出的结果:
![]() |
|---|
4、此时在工程文件目录下就可以找到.bin文件了:
![]() |
|---|
Bin文件的发送我用的是正点原子的串口助手,配置好波特率什么的就可以用蓝牙发送该bin文件了;
三、Bootloader部分
BootLoader就是一个引导程序,它的功能就是用串口接收蓝牙模块收到的信息,处理信息,校验信息,最后执行APP程序;
值得注意的是,Bootloader部分程序需要通过st-link或者DAP等调试器下载到单片机flash中;
Bootloader部分程序具体的工作流程是:
1 | #接收串口收到的信息; |
关键的代码如下:
CRC校验函数以及校验过程:
1 | crc32_temp=USART_RX_BUF[0x1c]*256*256*256 |
CRC校验函数:
1 | uint32_t crc32(unsigned char *buf,uint32_t size) |
1 | static const uint32_t crc32tab[] = { |
程序加载以及程序跳转函数:
1 | if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX. |
完整的代码我放在GitHub上边了,欢迎访问。
该项目的GitHub地址是:https://github.com/fan-pengfei/Stm32_IAP/tree/master
发布时间: 2021-08-19
最后更新: 2022-12-29
本文标题: Stm32蓝牙串口下载
本文链接: http://fan-pengfei.top/2021/08/19/stm32-IAP/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!




