当前位置:首页 > 单片机 > 单片机
[导读]一,在进入主题之前我们先了解一些必要的基础知识----stm32系列芯片的种类和型号:startup_stm32f10x_cl.s互联型的器件,STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s大容量的STM32F101xx,STM32F102xx,STM32F1

一,在进入主题之前我们先了解一些必要的基础知识----stm32系列芯片的种类和型号:


startup_stm32f10x_cl.s互联型的器件,STM32F105xx,STM32F107xx
startup_stm32f10x_hd.s大容量的STM32F101xx,STM32F102xx,STM32F103xx
startup_stm32f10x_hd_vl.s大容量的STM32F100xx
startup_stm32f10x_ld.s小容量的STM32F101xx,STM32F102xx,STM32F103xx
startup_stm32f10x_ld_vl.s小容量的STM32F100xx
startup_stm32f10x_md.s中容量的STM32F101xx,STM32F102xx,STM32F103xx
startup_stm32f10x_md_vl.s中容量的STM32F100xx(我项目中用的是此款芯片stm32f100CB)
startup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xx(例如:像stm32f103re这个型号的芯片flash是512k的,启动文件用startup_stm32f10x_xl.s或者startup_stm32f10x_hd.s都可以;)
cl:互联型产品,stm32f105 / 107系列
vl:超值型产品,stm32f100系列
xl:超高密度产品,stm32f101 / 103系列
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH = 64或128
HD:高密度产品,FLASH大于128



二,在拿到ST公司官方的IAP程序后我们要思考几点:

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

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

(我的资源里有官方IAP源码:http://download.csdn.NET/ detail / yx_l128125 / 6445811)

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

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




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

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

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

B.在keil的选项中,选择C / C ++ / PREPROMCESSOR符号的定义栏里定义,把有关STM32F10X_MD的宏定义改成:STM32F10X_MD_VL

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

/ *根据您使用的目标STM32设备取消下面的行注释

应用

* /

(STM32F10X_LD)&&!定义(STM32F10X_LD)&&!定义(STM32F10X_MD)&&!定义(STM32F10X_MD)&&!定义(STM32F10X_HD)&&!定义(STM32F10X_HDL)&&!

/ * #define STM32F10X_LD * / / *!

/ * #define STM32F10X_LD_VL * / / *!

/ * #define STM32F10X_MD * / / *!

#define STM32F10X_MD_VL / *!

/ * #define STM32F10X_HD * / / *!

/ * #define STM32F10X_HD_VL * / / *!

/ * #define STM32F10X_XL * / / *!

/ * #define STM32F10X_CL * / / *!

#万一

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

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


#if!定义HSE_VALUE

#ifdef STM32F10X_CL

#define HSE_VALUE((uint32_t)25000000)//外部振荡器的值为Hz

 #else  #define HSE_VALUE((uint32_t)8000000)//值外部振荡器以Hz #endif / * STM32F10X_CL * /#endif / * HSE_VALUE * /



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

system_stm32f10x.c的系统主频率,依实际情况修改;我用的芯片主频时钟是24MHZ;

#if defined(STM32F10X_LD_VL)||(定义为STM32F10X_MD_VL)||(定义为STM32F10X_HD_VL)

/ * #define SYSCLK_FREQ_HSE HSE_VALUE * /

#define SYSCLK_FREQ_24MHz 24000000

#其他

/ * #define SYSCLK_FREQ_HSE HSE_VALUE * /

#define SYSCLK_FREQ_24MHz 24000000

/ * #define SYSCLK_FREQ_36MHz 36000000 * /

/ * #define SYSCLK_FREQ_48MHz 48000000 * /

/ * #define SYSCLK_FREQ_56MHz 56000000 * /

/ *#define SYSCLK_FREQ_72MHz 72000000 * /

#万一

E.下面是关键部分操作了,在说这部分操作前我们先来说一下内存映射: 下图在stm32f100芯片手册的29页,我们只截取关键部分

从上图我们看出几个关键部分:

1.内部flash是从0x0800 0000开始到0x0801 FFFF结束,0x0801FFFF-0x0800 0000 = 0x20000 = 128k 128也就是flash的大小;

2.SRAM的开始地址是0x2000 0000;

我们要把我们的在线升级程序IAP放到FLASH里以0x0800 0000开始的位置,应用程序放APP APP到达0x08003000开始的位置,中断向量表也放在0x0800 3000开始的位置;如图


所以我们需要先查看一下misc.h文件中的中断向量表的初始位置宏定义为NVIC_VectTab_Flash 0x0800 0000

那么要就要设置编译器keil中的目标的选项选项中的IROM1地址为0x0800 0000大小为0x20000即128K;

IRAM1地址为0x2000 0000大小为0x2000;

(提示:这一项IROM1地址即为当前程序下载到flash的地址的起始位置)

下面我们来分析一下修改后的IAP代码:


/ ******************* ******************************

* @函数名称主

* @函数说明主函数

* @输入参数无

* @输出参数无

* @返回参数无

************************************************** ************ /

int main(void)

{

// Flash解锁

FLASH_Unlock();

//配置PA15管脚

KEY_Configuration();

//配置串口1

IAP_Init();

// PA15是否为低电平

if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)== 0x00)

{

//执行IAP驱动程序更新的Flash程序

SerialPutString(“ r n =========================================== ===========================“);

SerialPutString(“ r n =(C)COPYRIGHT 2011 Lierda =”);

SerialPutString(“ r n = =”);

SerialPutString(“ r n =应用程序编程应用程序(版本1.0.0)=”);

SerialPutString(“ r n = =”);

SerialPutString(“ r n =由wuguoyan =”);

SerialPutString(“ r n =========================================== ===========================“);

SerialPutString( “ r n r n”);

主菜单 ();

}

//否则执行用户程序

其他

{

//判断用处是否已经下载了用户程序,因为正常情况下此地址是栈地址

//若没有这一句话,即使没有下载程序也会进入而导致跑飞。

if(((*(__ IO uint32_t *)ApplicationAddress)&0x2FFE0000)== 0x20000000)

{

SerialPutString(“执行用户程序 r n n”);

//跳转至用户代码

JumpAddress = *(__ IO uint32_t *)(ApplicationAddress + 4);

Jump_To_Application

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

电磁铁是一种利用电流产生磁场的装置,具有快速响应、易于控制等特点,在工业自动化、电子设备、科学实验等领域有着广泛的应用。STM32是一款功能强大的微控制器,具有高性能、低功耗、易于编程等优点,是控制电磁铁的理想选择。本文...

关键字: 电磁铁 微控制器 STM32

边缘人工智能的实现涉及到三个基本 要素:安全性,连接性、自主性,而其中自主性是AI能力的体现,也是边缘AI有别于其他传统的物联网的关键。而通过ST Edge AI套件,就可以帮助各种不同类型的开发者实现覆盖全硬件平台的全...

关键字: 边缘人工智能 AI STM32

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

STM32是一款由STMicroelectronics生产的微控制器系列,具有高性能、低功耗和丰富的外设资源。其中,串口通信是一种常用的通信方式,可以实现与其他设备之间的数据传输。

关键字: STM32 串口通信 微控制器

STM32是一种广泛使用的微控制器,具有丰富的通信接口。其中,串口通信是STM32与其他设备或系统进行数据交换的重要方式之一。本文将详细介绍STM32串口通信的原理、应用及常见故障。

关键字: STM32 串口通信

由于目前缺乏相应的监测技术,地下电缆线路出现异常运行状态无法被及时发现,久而久之易演变成大故障,最终只能通过更换地下电缆进行修复,耗费大量的人力、物力。鉴于此,开发了一种基于STM32的地下电缆异常状态检测系统,利用热传...

关键字: STM32 地下电缆

交通灯控制器是用于控制交通信号灯运行的设备,它可以根据交通流量、行人需求以及其他因素,动态地调整信号灯的变化时间和绿灯时长,以保证交通的流畅和安全。

关键字: 交通信号灯 STM32
关闭
关闭