打印
[应用相关]

STM32 IAP在线升级详解

[复制链接]
3078|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Mozarts|  楼主 | 2016-11-9 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1.ST 官方IAP是什么针对什么芯片型号的,我们要用的又是什么芯片型号;

2.我们要用官方IAP适合我们芯片的程序升级使用,要在原有的基础上做那些改变;

初略看了一下IAP源码后,现在我们可以回答一下上面的2个问题了:

1.官网刚下载的IAP针对的是stm32f103c8芯片的,所以他的启动代码文件选择的是 startup_stm32f10x_md.s,而我的芯片是stm32f100cb,所以我的启动代码文件选择的是 startup_stm32f10x_md_lv.s

2 .第二个问题就是今天我们要做详细分析才能回答的问题了;

(1).知道了IAP官方源码的芯片和我们要用芯片的差异,首先我们要在源码的基础上做芯片级的改动;

A.首先改变编译器keil的芯片型号上我们要改成我们的芯片类型---STM32F100CB;

B.在keil的options for targer 选项C/C++/PREPROMCESSOR symbols的Define栏里定义,把有关STM32F10X_MD的宏定义改成:STM32F10X_MD_VL

也可以在STM32F10X.H里用宏定义



  • #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
  • #define STM32F10X_MD_VL
  • #endif


上面代码说的是如果没有定义 STM32F10X_MD_VL, 则宏定义 STM32F10X_MD_VL

C.外部时钟问价在stm32f10x.h 依据实际修改,原文是 说如果没有宏定义外部时钟HES_VALUE的值,但是宏定义了stm32f10x_cl 则外部时钟设置为25MHZ, 否则外部时钟都设置为8MHZ; 我用的外部晶振是8MHZ的所以不必修改这部分代码;

  • #if !defined HSE_VALUE
  • #ifdef STM32F10X_CL
  • #define HSE_VALUE ((uint32_t)25000000) // Value of the External oscillator in Hz #else#define HSE_VALUE ((uint32_t)8000000) //Value of the External oscillator in Hz #endif #endif

D.做系统主频时钟的更改

system_stm32f10x.c的系统主频率,依实际情况修改 ;我用的芯片主频时钟是24MHZ;
  • #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
  • #define SYSCLK_FREQ_24MHz 24000000
  • #else
  • #define SYSCLK_FREQ_24MHz 24000000
  • #endif



沙发
Listate| | 2016-11-9 20:26 | 只看该作者
当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。

使用特权

评论回复
板凳
feiqi1| | 2016-11-9 20:29 | 只看该作者
无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件

使用特权

评论回复
地板
androidbus| | 2016-11-9 20:33 | 只看该作者
无论是keiluvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件了。

使用特权

评论回复
5
litengg| | 2016-11-9 20:35 | 只看该作者
相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。

使用特权

评论回复
6
qiangweii| | 2016-11-9 20:39 | 只看该作者
ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动。

使用特权

评论回复
7
shashaa| | 2016-11-9 20:43 | 只看该作者
需要判断用处是否已经下载了用户程序,因为正常情况下此地址是栈地址

使用特权

评论回复
8
bbapple| | 2016-11-9 20:56 | 只看该作者
若没有这一句话,即使没有下载程序也会进入而导致跑飞。
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
SerialPutString("Execute user Program\r\n\n");

使用特权

评论回复
9
handleMessage| | 2016-11-9 20:58 | 只看该作者
学习了,楼主总结的不错,还有大神回复也不错,知道了IAP官方源码的芯片和我们要用芯片的差异

使用特权

评论回复
10
zhouhuanの| | 2016-11-9 21:01 | 只看该作者
真是好东西,好资料,谢谢楼主。

使用特权

评论回复
11
xia00| | 2016-11-9 21:08 | 只看该作者
ARM7/ARM9内核的控制器在复位后一般控制程序的开机启动吧。

使用特权

评论回复
12
secowo| | 2016-11-10 09:13 | 只看该作者

好资料,谢谢楼主。

使用特权

评论回复
13
soulmist| | 2016-11-10 09:56 | 只看该作者
不明所以

使用特权

评论回复
14
zhuomuniao110| | 2016-11-10 10:41 | 只看该作者
这个就看你怎么设计代码的存储结构了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

1320

帖子

0

粉丝