×
单片机 > 单片机程序设计 > 详情

STM32F103C8T6 IAP程序

发布时间:2020-08-27 发布时间:
|

项目需要加入IAP功能,STM32F103与Nordic 51822一样也是 Cortex M的核心,只不过一个M0一个M3而已。所以我想其升级原理也大致是将Flash划分成不同的空间,一部分用来存放BootLoader,以实现升级,一部分用来存放用户应用程序。


看完之后,原理大概都明白了。


只不过战舰的例程是 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;


这样的代码,但经验证程序升级完之后无法正常运行。

--------------------- 


关键字:STM32F103C8T6  IAP程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些