历史上的今天
今天是:2025年01月07日(星期二)
2019年01月07日 | STM32F103C8T6 IAP程序
2019-01-07 来源:eefocus
项目需要加入IAP功能,STM32F103与Nordic 51822一样也是 Cortex M的核心,只不过一个M0一个M3而已。所以我想其升级原理也大致是将Flash划分成不同的空间,一部分用来存放BootLoader,以实现升级,一部分用来存放用户应用程序。
百度了STM32 IAP,跳出来一大堆文章和代码,多数写得比较混乱,能把原理描述清楚,写得比较有条理只有战舰的文章了。连接:
http://www.openedv.com/posts/list/11494.htm
看完之后,原理大概都明白了。
只不过战舰的例程是 STM32F407的,而且其Bootloader部分程序比较大,需要删除很多代码,改起来比较耗时间。
在网上也搜索了一些资源,接近F103型号的,但是下载下来发现要使用的话还是有比较多的问题,代码也写的不规范。
决定还是官网找,开始时找到STM32 Cube生产的IAP例程,芯片型号还不是 STM32 F103C8T6的,改了一下,发现要改动地方太多。 在STM32F103C8T6的官方网页的Design Resources列表里面找,搜索"in-application-program",搜索到一个串口IAP的例程 ,里面有文档也有例程,但是例程下载下来却是和IAP毫不沾边,我也是醉了。 于是换个其它芯片型号,终于找到正确的软件包
STSW-STM32008
在main()函数里面可以知道,程序上电时会检测某个IO口电平,如果电平符合预期则进入IAP程序,如果不符合则跳到用户程序。
因此需要根据自己芯片型号作以下几个改动:
1,Keil项目的"Option for target"面板中,"更改成自己的芯片型号。
2,Keil项目的"Optrion for target"面板中,"C/C++"选项卡中,将"STM32F10X_HD_VL"删掉,然后加上"STM32F10X_MD". 因为STM32F103C8T6是属于MD的。
3,"stm32100e_eval.h" 文件中搜索 push-button 将按键(IO)口修改成自己想要的IO口,譬如PA4。
4,main()函数中, if (STM_EVAL_PBGetState(BUTTON_KEY) == 0x00)这行是IO检测的,默认检测低电平,根据自己需求变更。
5,修改串口,默认是使用Usart1的,而我想用Usart3,发现项目工程只支持Usart1和Usart2。因此需要自己加上Usart3的驱动,分别在 stm32_eval.h 和 stm32_eval.c中加上相应的代码,加起来是很简单的。
6,改好 Uart 的驱动后,将IAP_Init()函数里面的串口初始化
STM_EVAL_COMInit(COM1, &USART_InitStructure)中的COM1改成COM3。
7,将common.c中,所有EVAL_COM1的地方改成EVAL_COM3.
8,Keil工程的MDK-ARM文件夹中,将启动文件改为使用 startup_stm32f10x_md.s
9,common.h中默认flash size是128K的(0x20000),而STM32103C8T6只有64K, 因此需要将它改成64K的
#define FLASH_SIZE (0x10000) /* 64 KBytes */
整个工程中,common.c是关于串口通信协议的,ymoderm是一个串口文件传输的协议
用户程序需要编译成.bin文件,然后才能用来升级。
升级工具可以用SecureCRT, 它支持Y-Moderm协议。
用户程序默认起始地址是 0x8003000,即偏移0x3000,用户程序中相应设置要对得上。
用户程序只需要设置两个地方,
第一个是"Option for target"中"Target"选项卡中将Flash的ROM起始地址改为 0x8003000
第二步是工程里面搜索VECT_TAB_OFFSET的宏定义,将其值由 0x0 改成 0x3000。
战舰的教程是说在main()函数开始地方加上一行类似
SCB->VTOR = FLASH_BASE | 0x3000;
这样的代码,但经验证程序升级完之后无法正常运行。
---------------------
史海拾趣
|
有朋友问我ARM7有ARM9的区别,在此进行解答。 ARM7内核是0.9MIPS/MHz的三级流水线和冯·诺伊曼结构; ARM9内核是5级流水线,提供1.1MIPS/MHz的哈佛结构。 arm7没有mmu,arm720T是MMU的;arm9是有mmu的,arm940T只有Memory protection unit.不是 ...… 查看全部问答> |
|
]一、 对方要求你免费提供样品的不能接,当对方以各种理由要求寄样品,收到样品后却说产品不过关,让你重新再寄,后面就没有了下文,或者说你的产品报价高了,而对方却拿着你的样品找别的公司做 ...… 查看全部问答> |
|
在AP程序里面,我通过GetForegroundWindow( )函数找到当前顶层的窗体,然后通过PostMessage( )给这个窗体发消息,那个顶层窗体怎么 在AP程序里面,我通过GetForegroundWindow( )函数找到当前顶层的窗体,然后通过PostMessage( )给这个窗体发消息,那个顶层窗体怎么收不到消息啊?都不进顶层窗体的WindowProc( )函数。… 查看全部问答> |
|
WINCE6.0的系统,支持A2DP, 使用消息队列等待来自蓝牙耳机的命令(播放, 暂停, 下一首,上一首等). 播放器用自己的, 不是Media Player,可以收到暂停, 下一首,上一首的命令,就是收不到播放的命令,另外,耳机端按了暂停之后,耳机端就没声了,主机是收到暂 ...… 查看全部问答> |
|
本人手上有闲置 原装TI公司的 LM3S8962 Evaluation Kit 开发板(9.9成新),和2.4寸的TFT(带触摸屏)LCD ,等一些电子元件希望和大家置换或转让或赠送。 TI的 LM3S1138(一片) LM3S608(一片)STM8S105K(两片) ISO124-DIP(两片)  ...… 查看全部问答> |
|
【MSP430共享】用MSP430 实现基于PCB 的电容式接触传感 摘要: 这个应用报告讨论了如何用MSP430微处理器来设计单接触电容传感器接口的问题。采用具有超低功耗特性和集成外围设备的MSP430,单接触用户接口可以很轻松地实现。这个应用报告提供了技术概述,系统关注的细节和使用MSP430系列进行电容传感器设 ...… 查看全部问答> |




