1 使用的芯片和引脚说明
使用的芯片:STM32F407VET6
串口调试引脚:USART1 PA9 PA10
W25Q128引脚:CS-PB12 SCK-PB13 MISO-PB14 MOSI-PB15
2 制作bootloader
制作bootloader可以参考官方文档:STM32通用Bootloader (rt-thread.org)
Bootloader 在线获取地址: http://iot.rt-thread.com
由于我使用的是STM32F407VET6,所以我的配置如下:
配置好后点击生成bootloader即可获取到bootloarder.
随后我们把生成的bootloarder下载到板子上,这里我使用的是DAP下载器,我们可以利用coflash这个软件,把bin文件下载到板子里面。
假如你下载bootloader固件的时候,下进去是这样的:
那么基本上再次下载程序或者固件是下不进去的,需要将stm32的boot0引脚上拉。
即板子通电前可以用镊子将3.3V和boot0引脚相解除,解除好后再上电,上电后镊子就可以拿开了,然后再下载程序,这样就可以继续下载程序了!!!!!
下载完后,可以看到串口打印出如下信息:
到这里我们的bootloader就已经制作完成。
这个串口打印出的信息参数讲解可以参考:RT-Thread STM32F4通用BootLoader 的制作和使用(串口YModem协议升级方式)_stm32f4 bootloader-CSDN博客
3 制作APP
然后到cubemx setting里配置好时钟和引脚
接下来的这两张图配置SPI是因为我要把download放在w25q128里面才配置,如果你的download只需要放在芯片本身的flash里面,那就可以不配置.
然后在打开SPI2
然后再配置时钟树
随后配置rtthread setting
开启 BSP_USING_ON_CHIP_FLASH(必开),#define BSP_USING_SPI2(用到才开)
添加fal_config
随后将复制过来的inc 目录下的fal_cfg.h变成如下:
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_
#include <rtconfig.h>
#include <board.h>
#ifndef FAL_USING_NOR_FLASH_DEV_NAME
#define NOR_FLASH_DEV_NAME "norflash0"
#else
#define NOR_FLASH_DEV_NAME FAL_USING_NOR_FLASH_DEV_NAME
#endif
#define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024)
#define FLASH_SIZE_GRANULARITY_64K (64 * 1024)
#define FLASH_SIZE_GRANULARITY_128K (7 * 128 * 1024)
#define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS
#define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K)
#define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K)
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32_onchip_flash_16k;
extern const struct fal_flash_dev stm32_onchip_flash_64k;
extern const struct fal_flash_dev stm32_onchip_flash_128k;
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32_onchip_flash;
extern struct fal_flash_dev nor_flash0;
/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \
&stm32_onchip_flash_16k, \
&stm32_onchip_flash_64k, \
&stm32_onchip_flash_128k, \
&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0 * 1024, 128 * 1024, 0}, \
{FAL_PART_MAGIC_WROD, "download", NOR_FLASH_DEV_NAME, 0* 1024, 256 * 1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
修改main函数如下:
/*
* Copyright (c) 2006-2024, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-01-16 RT-Thread first version
*/
#include <rtthread.h>
#include <board.h>
#include <rtdbg.h>
#define W25Q_SPI_BUS_NAME "spi2"
#define W25Q_SPI_DEVICE_NAME "spi20"
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "fal.h"
#define APP_VERSION "1.0.0"
int main(void)
{
fal_init();
rt_kprintf ("The·current·version·of ·APP·firmware ·is%s\r\n",APP_VERSION);
return RT_EOK;
}
//用到W25Q128才需要下面代码
static int rt_hw_spi_flash_init(void)
{
//此处为片选引脚
rt_hw_spi_device_attach(W25Q_SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOB, GPIO_PIN_12);
//flash名称要正确
if (RT_NULL == rt_sfud_flash_probe("W25Q128", W25Q_SPI_DEVICE_NAME))
{
return -RT_ERROR;
};
return RT_EOK;
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
接下来的操作要和bootloader对应!!!
配置好后,先编译一下!!!
用到的是DAP下载器:
随后再编译下载。
串口打印信息如下:
4 制作一版新的APP将其下载到downloader分区
添加软件包
添加软件包后,编译下载!!一定要下载!
修改main函数将版本号修改为2.0.0,然后编译一下!!!
然后到文件夹中找到这个exe文件,可以直接选中这个文件然后打开文件所在目录
编译后的bin文件, 同样可以直接打开其所在的文件夹。:
然后将编译后的bin文件放入,如果不懂的一定要参考官方文档是怎么做的:STM32通用Bootloader (rt-thread.org)
打包好之后我们用Xshell,来进行固件升级。
在 msh 命令行中输入 ymodem_ota 命令,然后回车,然后鼠标右键点击空白处。。选择传输。
然后选中我们生成的rbl文件,将其进行传输。
传输完后,等一会,然后就把新的固件给他下载到download区啦!!!
参考的连接:
STM32通用Bootloader (rt-thread.org)
RT-Thread STM32F4通用BootLoader 的制作和使用(串口YModem协议升级方式)_stm32f4 bootloader-CSDN博客
stm32f407单片机rt thread 片外spi flash OTA升级配置示例_error: 'stm32_flash_start_adress_16k' unde-CSDN博客