因此,使用STMicroelectronics提供的常用工具几乎完全没有逐步说明,这促使了这种手法的工作。
不幸的是,对于网络上发现的大量引导加载程序,有时非常繁忙,它们对于任何特定的晶体都是“锐化的”。
提议的材料包含使用CubeMX软件包,DfuSeDemo“引导程序”和Dfu文件管理器固件准备实用程序的过程,也就是说,我们从硬件中提取了我们的愿望清单,请原谅宏汇编器和数据表大师。
烹饪环境...
我们需要CubeMX本身,DfuSeDemo + Dfu文件管理器下载文件,并且都在同一软件包STM32 ST-LINK Utility中,我们可以在STMicroelectronics网站上免费找到所有内容。
我们的实验棒配备了廖叔叔的STM32F103C8T6芯片

以及那里的ST-Link程序员。

好吧,您最喜欢的IDE,在此特定演示中,我们使用KEIL,其他IDE中的编译设置也没有太大不同。
所以走吧...
启动CubeMX并选择您的水晶...

庆祝您的愿望清单...

在此特定任务中,我们将激活USB设备→设备FS,并因此激活USB设备→下载更新固件类,而令人难忘的RCC→高速时钟→晶体/陶瓷谐振器就是其中一个。
接下来,选择bootloader-a模式开关,在此示例中,仅使用现有的boot1跳线。

我们看一下这个小方案,根据它,boot1连接到PB2的分支,因此我们在GPIO_Input模式下使用它。
完成后,激活“时钟配置”选项卡并启动配置选择器。

跳转到Cofiguration选项卡...

选择GPIO按钮...

在野外...

编写一个自定义标签,将其设为boot1。
接下来,设置项目...

选择项目→设置...

选择并填充....

因此,我们选择为哪个IDE Cub生成项目,在本例中为MDK-ARM V5。
在此实施例中,“代码生成器”选项卡将保持不变...

好了,就是这样,我们开始生成项目Project→Generate Code

最后,Cub将提示您立即启动您的IDE ...您应该做什么。


我们开始编译和组装,并将其加载到晶体... F7,F8 ...

最终结果...
我们将板上的引脚切换到工作模式,然后连接USB电缆...


在Windows→系统→设备管理器→USB控制器中打开控制面板。 再看一下设备列表,Windows会沙沙作响,并在DFU模式驱动程序中安装STM设备(如果尚未安装)。
因此,驱动程序起来并决定启动“ boot” DfuSeDemo ...

我们查看捕获了DFU设备的内容,然后双击“选择目标”字段...

我们仔细观察并惊奇地发现,关闭了写入地址0x0800C000的闪存以进行写入,然后写入该地址,我们需要它...
顺便说一下,我在STM32F407VE上进行了尝试,该存储器从一开始就是从0x08000000开始记录的。。。为什么,在我们的版本中,不清楚,没有挖掘,它被埋在某个地方,但是显然没有写,没有通俗的说法,因为一大块东西消失了,没有主人了……也许有人会告诉你在哪里挖……
因此,“理发才刚刚开始” ...
我们只需要两个源文件...

我们在IDE中打开它们,然后更正,我们添加了...
我们考虑到在重新生成USER CODE BEGIN和USER CODE END之间的插入时CubeMX不会在一起...在这里我们将输入附加内容...
让我们从main.c开始
typedef void (*pFunction)(void); pFunction JumpToApplication; uint32_t JumpAddress; . . . uint32_t AddressMyApplicationBegin = 0x0800C000; uint32_t AddressMyApplicationEnd = 0x0800FBFC; . . . if(HAL_GPIO_ReadPin(boot1_GPIO_Port, boot1_Pin ) == GPIO_PIN_SET) { if (((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000) == 0x20000000) { JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4); JumpToApplication = (pFunction) JumpAddress; __set_MSP(*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD); JumpToApplication(); } } MX_USB_DEVICE_Init(); . . .
这就是main.c ...
转到usbd_conf.h并转到
#define USBD_DFU_APP_DEFAULT_ADD 0x0800000
想到...
#define USBD_DFU_APP_DEFAULT_ADD 0x080C000
我们传递给usbd_dfu_it.c,这里还有更多...。
. . . extern uint32_t AddressMyApplicationBegin; extern uint32_t AddressMyApplicationEnd; . . . #define FLASH_ERASE_TIME (uint16_t)50 #define FLASH_PROGRAM_TIME (uint16_t)50 . . . , «» … uint16_t MEM_If_Init_FS(void) { HAL_StatusTypeDef flash_ok = HAL_ERROR;
其实就这些...
我们连接编程器,将跳线置于编程模式,并记录F7,F8和botloader ...
我可以使用...
现在,我们将准备我们的应用程序以通过引导程序加载...
最喜欢的应用程序将闪烁LED ...
我们准备和调试应用程序,并更改编译器和程序主体中的各个位置,以更改程序启动和中断向量的地址...
即在KEIL中→配置→Flash工具

更改程序开头的地址...

我们说要生成一个十六进制文件

并更改向量表的地址...
收集F7程序...
使用Dfu文件管理器实用程序将接收到的HEX转换为dfo文件...

使用按钮S19或HEX ...选择我们的HEX文件,然后单击Generate ...

我们得到了dfu文件。
实际上,一切都准备就绪。
正在载入控制器...
将跳线设置为DFU模式后,我们将实验板与已经加载的botloader连接到USB。

您可以在设备列表中以DFU模式控制STM设备的外观。
运行“ bootloader”。

告诉她我们的DFU文件...

我们按升级,然后观察加载的结果...为了放心,我们按。

一切都成功了...您可以运行...
如果错误出了错,那意味着某个地方出现了...

例如...
因此,我们将假设一切成功...将跳线切换到应用程序模式

并享受闪烁的二极管...
...
h 这么多布科夫。 厌倦了复制图片:-)
谢谢大家的关注...