基于STM32F103C8T6 的 Bootloder 程序源码(另附百度网盘下载链接)

本文档介绍了基于STM32F103C8T6单片机实现的Bootloader程序,采用IAP方式,详细说明了波特率设置和串口下载流程。程序会在3秒内等待通过串口接收.bin文件进行自动烧写。同时提供了Keil uVision5工程源码下载链接以及XCOM V2.6下载链接。
摘要由CSDN通过智能技术生成

说明:

1.本例程参考正点原子的IAP的代码。
2.本例程基于STM32F103C8T6单片机编写。
3.本例程使用USART1进行程序下载,波特率115200
4.串口输出”Bootloder“字样后,请在3s内通过串口将APP的.bin文件传入单片机,之后会自动烧写并启动APP。若3s内未传入.bin文件或传入的文件有误,则会自动原来的启动APP。.bin文件最大只能15KByte
5.STM32F103C8T6拥有128KByte的flash20KByte的sram。本程序将0x0800 0000 - 0x0800 FFFF作为Bootloder空间,将0x0801 0000 - 0x0801 FFFF作为APP空间。
6.APP程序需要将flash中的向量表偏移0x10000


工程源码下载(fci5), 工程使用 Keil uVision5 创建 ,密码 fci5 。

XCOM V2.6下载(48cm),密码 48cm 。



程序源码:

  • main.c
#include "delay.h"
#include "usart.h"
#include "flash.h"
#include "iap.h"


/***********************************************
*         支持最大15KByte的APP                 *
*				                                       *
*		0x0800 0000 - 0x0800 FFFF 为Bootloder空间  *
*   0x0801 0000 - 0x0801 FFFF 为APP空间        *
*                                              *
***********************************************/

int main ()
{
   
	u8 flag_update = 0; //升级完成后置1
	u16 t = 0;
	u16 oldcount = 0;
	u16 applen = 0;
		
	//初始化
	delay_init();
	USART1_Init(115200);
	delay_ms(20);
	printf("Bootloder\r\n");
	
	while(1)
	{
   
		if(USART1_RX_CNT) //如果接收到了数据
		{
   
			if(oldcount == USART1_RX_CNT) //如果新周期内没收到数据,则认为接收完成
			{
   
				applen = USART1_RX_CNT;
				oldcount = 0;
				USART1_RX_CNT = 0;
				
				if(((*(vu32*)(0x20001000+4)) & 0xFF000000) == 0x08000000) //判断是否为0x08XXXXXX,(是否为APP数据)
				{
   
					printf("APP len : %d\r\n",applen);
					
					//开始升级APP
					printf("Updating...\r\n");
					iap_write_appbin(FLASH_APP1_ADDR,USART1_RX_BUF,applen); //写入flash
					flag_update = 1;
					printf("Updae success !!!\r\n");
				}
				else printf("APP data error!!!\r\n");
			}
			else oldcount = USART1_RX_CNT; //更新接收到的字节数
		}	
		
		if(flag_update || (t == 300 & USART1_RX_CNT == 0)) //如果升级APP完成或3s内没收到正确的APP数据,则启动APP
		{
   
			printf("APP Start\r\n\r\n");
			iap_load_app(FLASH_APP1_ADDR);
		}		
		t++;
		delay_ms(10); 
	}	
}


  • delay.h
#ifndef _DELAY_H
#define _DELAY_H
#include "stm32f10x.h"

void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif


  • delay.c
#include "delay.h"

static u8 fac_us = 0;     //us延时倍乘数
static u16 fac_ms = 0;    //ms延时倍乘数

void delay_init(void)
{
   
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  	//选择外部时钟 HCL/8
	fac_us = SystemCoreClock/8000000;                      	//为系统时钟的1/8
	fac_ms = (u16)fac_us * 1000;
}

void delay_us(u32 nus)
{
   
	u32 temp;
	SysTick->LOAD = nus * fac_us;//时间加数
	SysTick->VAL = 0x00;//清空计数器
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//开始倒数
	
	do
	{
   
		temp = SysTick->CTRL;
	}while((temp & 0x01) &&! (temp & (1<<16))); //等待时间到达
	
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//关闭计数器、
	SysTick->VAL = 0x00;//清空计数器
}

void delay_ms(u16 nms)
{
   
	u32 temp;
	SysTick->LOAD = (u32)nms * fac_ms;//时间加载(SysTick->LOAD为24bit)
	SysTick
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
STM32固件升级bootloader是指在STM32微控制器中使用一个特殊的程序,用于更新设备的固件。下面我将简要介绍如何进行STM32固件升级bootloader。 首先,在STM32芯片中引导LOADER属于固件的一部分,通常它被存储在设备的片内闪存中的特殊区域。当启动器引导STM32设备时,bootloader会首先运行,并负责加载用户应用程序。 为了进行固件升级,我们需要编写一个能够在设备上运行的应用程序,并使用这个程序来更新设备的flash内存中的固件。 在使用固件升级bootloader时,首先将新的固件文件上传到计算机,并将固件传输到STM32设备上。这可以通过串口、CAN总线或其他通信协议来实现。 在STM32设备上,我们需要使用bootloader提供的接口来加载并运行固件升级程序。这些接口通常通过引导进入bootloader的方式开放。 在运行固件升级程序后,我们需要按照bootloader的指示进行固件升级。通常这包括选择要使用的固件文件、确认升级操作和等待升级完成。 在固件升级过程中,我们需要特别注意以下几点: 1. 确保选择与设备兼容的固件文件。 2. 不要中断升级过程,以免导致固件损坏。 3. 在升级完成后,验证固件是否成功加载并正常运行。 总的来说,STM32固件升级bootloader可以帮助我们方便快捷地更新设备的固件,提高设备的可靠性和功能性。通过遵循固件升级的步骤和注意事项,我们可以确保顺利完成固件升级过程。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值