这几天一直在尝试学STM32 bootloader,在网上查阅了一番,发现实现方法不计其数。于是自己有了想动手实现一番的欲望。
下面请听我细细道来,我选用的芯片是STM32F103ZE系类,该芯片是512k,每页是2k的。
接下来就是你要重点了:
其实bootloader说白了,就是在原有APP程序 再加上另一段程序---bootloader,这个bootloader可以对你flash进行擦写操作。
那么关于STM32具体实现BOOTLOADER步骤是怎么样的呢?
下面我就具体几个细节之处谈谈:
1,如何实现在APP程序跳转到BOOTLOADER程序.
2,既然APP程序可以跳转到bootloader,那么反之也是可以的。
//判断用户是否已经下载程序,因为正常情况下此地址是栈地址。//若没有这一句的话,即使没有下载程序也会进入而导致跑飞。
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
SerialPutString("Execute user Program\r\n\n");
//跳转至用户代码
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
//初始化用户程序的堆栈指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
else
{
SerialPutString("no user Program\r\n\n");
}
3,设计bootloader程序,采用YMODEM协议,一次数据1024字节、需要在keil进行设置ROM1,下载utilities也设置一下,然后download。
4,设计好bootloader程序并且用仿真器烧录到芯片之后,下面就开始设计APP程序,所需设置也是大同小异,只是将STARTADDRESS 设置成从 0800 0200 size只要不超过你整个flash剩下的区域即可
,还需要设置一点的是,产生bin文件,这里我教大家一个方法 \@p.bin就是说项目名来作为bin文件名,axf也一样。假设我项目名是BOOT-Y,那么你生成的bin文件就是这个名字
5.,接下来用SECURECRT软件进行程序app的bin文件烧录,我boot程序里面有设计了一个按键,就是你是进入到boot程序还是app程序,当然你app程序如果没有的话,那么就需要在这里进行校验了。如果按键按住,然后复位,那么程序就进入到刚才的boot区域,这里是一个串口菜单,有一个函数捕获你的按键输入字符。
/*******************************************************************************
* @函数名称 GetKey
* @函数说明 通过超级中断回去键码
* @输入参数 无
* @输出参数 无
* @返回参数 按下的键码
*******************************************************************************/
uint8_t GetKey(void)
{
uint8_t key = 0;
//等待按键按下
while (1)
{
if (SerialKeyPressed((uint8_t*)&key)) break;
}
return key;
}
6、下面就是boot的串口菜单,你输入1,加载bin文件,点击transfer的send-ymodem,然后选择你的bin文件,接下来就是1024字节数据开始发送到串口缓存区,如果校验正确的话,那么就会写入到对应的flash当中。
7、看到没?成功了!
(7.1)、
忘记说了,APP程序里面需要在 在system_stm32f10x.c文件的128行处 #define VECT_TAB_OFFSET 0x2000 /*!< Vector Table base offset field. 将中断向量表的偏移量改成你APP程序flash地址偏移量, 这个非常关键,因为你BOOT的中断和APP中断不能是同一个! 否则会出事的!
关键字:STM32 YMODEM bootloader
引用地址:
STM32 YMODEM实现bootloader
推荐阅读最新更新时间:2024-03-16 16:11
在Mac OS X中使用VIM开发STM32(1)
在先前的博文⎣在Mac OS X中搭建STM32开发环境⎤中,我们在Mac中DIY出了最简单的交叉编译和下载环境。但是,只有交叉编译和下载环境是不够的,方便起见,我们需要一个像Keil或者IAR for ARM一样的集编辑源代码、调试与一体的开发环境。当然我们可以选择eclipse,BUT,既然都已经走到这一步了,我们为什么不来一个彻彻底底的DIY呢? 所以,我又看到了VIM这款一直以来低调奢华的编辑器,由于其跨平台的特性,我计划一劳永逸的搞定它!从此不必再纠结用什么IDE更好了,收费的、摸不着头脑的、配置纠结的都特么滚犊子,简直受够了!VIM配置好了以后,可以装进U盘带走,走到哪写到哪,你是不是也激动了?走起
[单片机]
STM32NET学习笔记 UDP部分
1.前言 嵌入式以太网开发是一个很有挑战性的工作。通过几个月的学习,我个人觉得大致有两条途径。第一条途径,先通过高级语言熟悉socket编程,例如C#或C++,对bind,listen,connect,accept等函数熟悉之后,应用 lwIP。第二种途径,通过分析嵌入式以太网代码,结合TCPIP协议栈规范逐步实践代码。第一种途径效率高,开发周期短,编写出来的代码性能稳定,第二种途径花的时间长,开发出来的代码功能不完善,但是由于紧紧结合TCPIP规范,可以了解的内容较多,适合学习。本文通过分析和修改AVRNET源码,逐步实现TCPIP协议栈的各个子部分,包括ETHERNET部分,ARP部分,IP部分,ICMP部分,UDP部分
[单片机]
STM32系列第13篇--OLED
简介: OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。 OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。 LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。 多种接口方式,该模块提供了总共4种接口包括:6800、8080两
[单片机]
stm32中printf要做哪些配置
在调试代码时,我们经常用printf函数来输出一些打印信息,那么你的UART串口不够用,还要用printf要怎么办? 其实很简单,就是:使用SWO/SWV。 SWO:Serial Wire Output,串行线输出 SWD:Serial Wire Viewer,串行线查看器 使用printf要做哪些配置? 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。 2、在main文件中重定义《fputc》函数 3、在工程属性的 “Target“ -》 ”Code Generation“ 选项中勾选 ”Use MicroLIB“” MicroLIB 是缺省C的备份库,
[单片机]
STM32 直流减速电机控制
在直流减速电机控制中,最常用的方法就是通过PWM来控制直流电机的转速。在控制小车走直线的过程中,需要两者的转速一置(如果要走得很直,还需要在短时间内保证两者的行程大致相当,这可以用PID算法来控制)。 因此,在检测到两者转速不一样时,需要动态调整其中一个或两个轮子的PWM的点空比(简单点的就以一个轮为基准,调整另外一个轮子即可;如果以一个固定的标准的话,需要调整两个轮子的PWM占空比)。 1 程序第一步:设置GPIO,略(输出PWM的管脚用Mode_AF_PP即可) 2 3 程序第二步:设置定时器,(保证产生两路PWM即可,我用的是TIM4) 4 5 void TIM4_Configuration(void) 6 {
[单片机]
stm32对编码器计数
图和程序(部分)都是前辈留下的,我看了了半天也试了很多次,现在越来越混了,不知道前辈到底是用什么方法在测脉冲,感觉图和程序都有问题,有大神帮忙解释下给点建议吗。我现在脑子全是乱的。
[单片机]
【STM32模块化程序】PWM产生
一、STM32的通用定时器介绍 STM32F103ZE 拥有 TIM2、TIM3、TIM4 和 TIM5 共 4 个通用定时器。 STM32F103C8拥有TIM2/TIM3/TIM4这三个通用定时器 通用定时器除了具备基本定时器的向上计数器功能外,还可以向下、向上/向下计数。 此外还具备独立通道,能够实现输入捕获、输出比较、PWM 输出、单脉冲输出的功能。 二、输出比较产生PWM 1、产生PWM的几种方式 ①、硬件实现。比如STM32 自带的 PWM 输出功能。 注意了,硬件实现的时候,外部接线需要接到通用定时器的外部通道上! ②、通用定时器的输出比较实现软件的PWM,这个软件产生的PWM要比定时器模拟产
[单片机]
STM32的RFID手持终端硬件设计
引言 射频识别(Radlo Frequency Identification,RFID)技术是近年来兴起的一种自动识别技术。该技术可利用射频信号识别对象,利用电磁耦合原理交换信息。与传统的识别技术相比,RFID技术具有读卡器和射频标签无接触的特点。由于RFID技术所具有的优点,它目前被广泛应用于身份识别、电子商务、工业自动化以及交通运输等领域。但是,现有的RFID读卡器在大规模的移动应用中仍存在着一些不足,例如处理速度较慢、人机交互不够友好、成本较高、不能方便与上位机进行通信等。本文设计的RFID手持终端采用STM32F103VET6嵌入式处理器作为主控芯片,CLRC632作为射频读卡芯片,可以读写工作在13.56 MHz的多种
[单片机]