STM32启动文件的选择及宏定义及芯片型号更改IAP总结(精)
关于stm32f1ox.h头文件启动代码与编译器里的宏定义
#define HSE_VALUE ((uint32_t)25000000)
#else
#define HSE_VALUE ((uint32_t)8000000)
#endif
#endif
最后将.cl启动文件添加到工作组中。
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
STM32F10X_CL,或者在stm32f10x。h中找到#if!defined(STM32F10X_LD)&&
!defined(STM32F10X_LD_VL)&&!defined(STM32F10X_MD)&&!defined
(STM32F10X_MD_VL)&&!defined(STM32F10X_HD)&&!defined
关于stm32f1ox.h头文件启动代码与编译器里的宏定义
今天调试stm32f107vc发现他的外部时钟竟是25M,和之前的
stm32f103rbt6的8M晶振有所区别。在此总结一下自己的发现。stm32f107vc
属于互联性器件,他的启动文件应该是.cl。对于启动文件有ji个,
.ld.md.hd.cl.xlrbt6选用的是md可以在keilc++宏定义那边说明
(STM32F10X_HD_VL)&&!defined(STM32F10X_XL)&&!defined
(STM32F10X_CL)
#define STM32F10X_MD
#endif
如果用的是rbt6如上,如果用的是10ቤተ መጻሕፍቲ ባይዱ将cl打开
同时我们会看到我们启用了外部的25M晶振,
STM32启动文件详解
STM32启动文件详解(2012-07-28 11:22:34)转载▼分类:STM32标签:stm32启动在<<STM32不完全手册里面>>,用的是STM32F103RBT6,所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。
STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。
实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。
比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。
又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。
而在固件库里出现3个文件startup_stm32f10x_ld.sstartup_stm32f10x_md.sstartup_stm32f10x_hd.s其中,ld.s适用于小容量产品;md.s适用于中等容量产品;hd适用于大容量产品;这里的容量是指FLASH的大小.判断方法如下:小容量:FLASH≤32K中容量:64K≤FLASH≤128K大容量:256K≤FLASH;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s;* Author : MCD Application Team;* Version : V3.5.0;* Date : 11-March-2011;* Description : STM32F10x High Density Devices vector table for MDK-ARM;* toolchain.;* This module performs:;* - Set the initial SP;* - Set the initial PC == Reset_Handler;* - Set the vector table entries with the exceptions ISR address;* - Configure the clock system and also configure the external;* SRAM mounted on STM3210E-EVAL board to be used as data;* memory (optional, to be enabled by user);* - Branches to __main in the C library (which eventually;* calls main()).;* After Reset the CortexM3 processor is in Thread mode,;* priority is Privileged, and the Stack is set to Main.;* 说明: 此文件为STM32F10x高密度设备的MDK工具链的启动文件;* 该模块执行以下操作:;* -设置初始堆栈指针(SP);* -设置初始程序计数器(PC)为复位向量,并在执行main函数前初始化系统时钟;* -设置向量表入口为异常事件的入口地址;* -复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈;* <<< Use Configuration Wizard in Context Menu >>>; 首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈; 顶地址,第二个表项是复位中断服务入口地址。
STM32F103启动文件详解汇总
转。
在<<STM32不完全手册里面>>,用的是STM32F103RBT6,所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。
STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。
实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。
比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。
又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。
而在固件库里出现3个文件startup_stm32f10x_ld.sstartup_stm32f10x_md.sstartup_stm32f10x_hd.s其中,ld.s适用于小容量产品;md.s适用于中等容量产品;hd适用于大容量产品;这里的容量是指FLASH的大小.判断方法如下:小容量:FLASH≤32K中容量:64K≤FLASH≤128K大容量:256K≤FLASH;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s;* Author : MCD Application Team;* Version : V3.5.0;* Date : 11-March-2011;* Description : STM32F10x High Density Devices vector table for MDK-ARM ;* toolchain.;* This module performs:;* - Set the initial SP;* - Set the initial PC == Reset_Handler;* - Set the vector table entries with the exceptions ISR address;* - Configure the clock system and also configure the external;* SRAM mounted on STM3210E-EVAL board to be used as data ;* memory (optional, to be enabled by user);* - Branches to __main in the C library (which eventually;* calls main()).;* After Reset the CortexM3 processor is in Thread mode,;* priority is Privileged, and the Stack is set to Main.;* 说明: 此文件为STM32F10x高密度设备的MDK工具链的启动文件;* 该模块执行以下操作:;* -设置初始堆栈指针(SP);* -设置初始程序计数器(PC)为复位向量,并在执行main函数前初始化系统时钟;* -设置向量表入口为异常事件的入口地址;* -复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈;* <<< Use Configuration Wizard in Context Menu >>>; 首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈; 顶地址,第二个表项是复位中断服务入口地址。
STM32 系列MCU 不同型号的移植步骤解析
STM32系列MCU不同型号的移植!
第一步
更换启动件:
第二步
修改宏定义:
图1
或者修改stm32f10x.h
具体修改如下:
图2
第三步
修改系统主频率:
文件:system_stm32f10x.c
具体修改如下:
图3
第四步
修改外部晶振源:
文件:stm32f10x.h
其中,Project.bin和Project.axf要和Output选项卡中的Nameof
Executable的名字相同
三、如何使用IAP
1、设置超级终端波特率选择为115200
2、需要下载时将Tamper键按住再按下复位键超级终端打印出帮助信息
3、选择下发文件,协议选择Y_modem,选择下发。
延时修改
使用J-Link调试设置
图7
J-Link不能正常连接目标板
可以尝试一下方法(恢复出厂设置)
具体修改如下:
图4
第五步
定时器需要根据以上修改的系统主频率进行对应的修改。
其他:
修改Flash地址
文件:misc.h
具体修改如下:
图5
与以下配置一致:
IAP设置步骤
一、IAP工程设置
1、修改main中的按键触发键
2、修改下载串口
二、下载工程设置
1、修改程序入口地址
查找NVIC_VectTab_FLASH将其修改为:0x08002000
2、修改options
1)打开Target选项卡在IROM1中将Start和Size分别修改为
0x08002000和0x3E00
2)打开User选项卡在RunUserProgramsBeforeBuild/Rebuild中,勾选
STM32启动文件的选择及宏定义及芯片型号更改IAP总结
STM32启动文件的选择及宏定义及芯片型号更改IAP总结对于STM32芯片,启动文件主要包括以下几个部分:1.启动向量表:包含中断服务程序的地址信息,用于系统初始化和中断处理等功能。
2.中断服务程序:对中断进行处理的代码,包括系统初始化时的复位中断和其他外部中断。
3.系统初始化代码:完成芯片的初始化工作,包括时钟配置、外设初始化、堆栈初始化等。
在选择启动文件时,需要注意以下几点:1.芯片型号匹配:确保所选择的启动文件与使用的芯片型号兼容,以确保正常的系统初始化和中断处理。
2. 如需使用外部存储器:如果需要使用外部存储器,如外部Flash 或RAM,需要选择支持外部存储器的启动文件。
3. 如需使用操作系统:如果需要在系统中运行操作系统,如FreeRTOS或uc/OS等,需要选择对应操作系统的启动文件。
在启动文件中,还涉及宏定义的使用。
宏定义是一种预处理指令,用于在编译时替换特定的文本字符串。
在启动文件中,通常会使用宏定义来配置系统的时钟频率、中断向量表的起始地址等参数。
在更改芯片型号时1.切换器件描述文件:在工程文件中,需要将所使用的芯片型号对应的器件描述文件进行切换。
这个文件通常在项目设置中进行配置。
2.修改启动文件:将原有的启动文件替换为新的芯片型号所对应的启动文件。
3.更新宏定义:在新的启动文件中,需要确认并更新宏定义,以确保系统的配置和参数正确。
4.复查外设配置:在启动文件中,有可能包含对外设的初始化代码。
在更改芯片型号后,需要复查外设的配置和初始化。
总结起来,选择合适的STM32启动文件,需要根据所使用的芯片型号来进行选择,并注意更改宏定义和复查外设配置。
这样才能确保系统正常初始化和中断处理的功能。
STM32启动文件的选择及宏定义及芯片型号更改IAP总结(精)
STM32启动文件的选择及宏定义及芯片型号更改 IAP总结startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xxstartup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xxstartup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_md_vl.s 中容量的STM32F100xxstartup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xxcl:互联型产品,stm32f105/107系列vl:超值型产品,stm32f100系列xl:超高密度产品,stm32f101/103系列ld:低密度产品,FLASH小于64Kmd:中等密度产品,FLASH=64 or 128hd:高密度产品,FLASH大于128在KEIL下可以在项目的选项C/C++/PREPROMCESSOR symbols的Define栏里定义,比如STM32F10X_CL也可以在STM32F10X.H里用宏定义#if !defined (STM32F10X_LD && !defined (STM32F10X_LD_VL && !defined (STM32F10X_MD && !defined (STM32F10X_MD_VL && !defined(STM32F10X_HD && !defined (STM32F10X_XL && !defined (STM32F10X_CL#define STM32F10X_HD#endif如果芯片更换,除了做如上所述的更改外,还需以下几步:第一步 system_stm32f10x.c的系统主频率,依实际情况修改#if defined (STM32F10X_LD_VL || (defined STM32F10X_MD_VL#define SYSCLK_FREQ_24MHz 24000000#else#define SYSCLK_FREQ_72MHz 72000000#endif另外外部时钟在文件:stm32f10x.h 依实际修改第二步定时器的参数依系统主时钟做适当修改第三步 flash地址misc.h中的NVIC_VectTab_Flash 0x08000000 要与KEIL选项target的IROM1的地址一致,如果是IAP程序,依ISP程序占用大小,APP的FLASH地址向后延,比如0X8002000,那么KEIL选项target的IROM1的地址也要就0x8002000,SIZE因为ISP占用了2000,所以就为0x40000-0x2000,即只能填写0X3E000第四步 ISP程序与APP程序连接----(这一步我还不明白意思,需要验证)打开 User 选项卡在 Run User Programs Before Build/Rebuild 中,勾选 Run#1,并在其中填入D:\Keil\ARM\BIN40\fromelf.exe --bin -o ./obj/Project.bin ./obj/Project.axf 其中,Project.bin 和 Project.axf 要和 Output 选项卡中的 Name of Executable 的名字IAP我的总结1 先FLASH_Unlock(;2 小于或等于128K的STM每页为1k bytes,大于128K的每页为2K BYTES,减去从地址0x8002000占用的0x2000后,算出页数,比如IAP占用8K,则64K的MD的STM32F系列用for(i=0;i<(64-8;i++ FLASH_ErasePage(0x8002000+0x400*i;循环按页擦除FLASH3 按从外部串口获取到的数据,FLASH_ProgramWord(address,dat;//注意是按4字节方式写入的 if (*(uint32_t*address!= dat//字编程后校验。
STM32启动文件选用说明
stm32 启动文件的选择最近在网上看到一些关于STM32启动文件的问题帖,都是类似这样的问题:随便选两个“startup_stm32f10x_ld、hd、md这3个启动文件有什么不同”“官网固件库中的启动文件有啥区别,怎么选择?”搜索了论坛,也看了一下,有一些回答,但是都不太全或者不甚明了。
其实我以前也不清楚,当然我是新手,只不过是个爱折腾的新手,因为我觉得,这个有必要弄清楚。
一是启动文件在一个工程中有着不可取代的作用,二是对于STM32这个让人蛋疼而又强大的东东,经常是新手乱添加启动文件或者去找一下工程例子“依葫芦画瓢”的添加,试问你的MCU和人家工程例子的就是一样,换一款型号,要命[夸张的修辞手法,呵呵]?所有说,基于这些,我就说一说我的认识:注意此处只针对MDK-ARM的IDE,其他的一样,只不过想说明的是对不同的IDE,同一芯片型号的启动文件的“内容”是不一样的,这是因为编译器造成的,意思就是说,启动文件的功能一样,但是指令有所区别。
这个每个启动文件也注释了,如:(原文件名:.s for MDK IAR.JPG)啰嗦了……启动文件的作用:无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。
最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。
[来自网上]我的理解,说白了,大家常说,程序执行都从main函数开始,是的,没错,但是在这之前是谁来完成了这一个繁琐而又复杂的启动过程呢?就是它。
(看来.s尽干脏活苦活,就像“活雷锋一样,做了好事有不留名”)具体的启动过程论坛里有,想了解的可以去细看。
好了,上图:(原文件名:MDK-s.JPG)看到是不好多,都晕了,慢慢来看:重要的来看这些缩写:这几个是代表Flash容量的ld Low-density 小容量 16-32Kmd Medium-density 中容量 64-128Khd High-density 大容量 256-512Kxl 超大容量512-1024K这些都是基本型的,包括STM32F101xx, STM32F102xx 和STM32F103xx然后vl value line devices 超值型系列大家记住:这个只有STM32F100xx,也就是说只要是vl那一定是STM32F100的启动文件,其他的不予考虑下面还有个特殊的:cl Connectivity line devices 互联型有STM32F105xx和STM32F107xx区别完了,我想你大概也知道什么样的片子对应什么启动文件了吧,如果还有点迷糊,不要紧,下面来举个例子:如:STM32F103VC首先你要知道它的容量,这儿IDE下面器件选型(原文件名:MDK opt.JPG)还有这儿,数据手册(原文件名:database 103vc.JPG)都可以知道它的容量,看你习惯,我人懒,经常用第一种方式知道容量了之后,因为它不属于超值型STM32F100xx系列,也不属于互联型的STM32F105xx和STM32F107xx,所有我想你知道该怎么办了吧:(原文件名:s.JPG)工程下面如是添加最后你可以打开这个.s看一下,这儿注释得也很明确(原文件名:stm32f103vc s.JPG)。
STM32启动代码分析、简化、实战
本文通过对STM32的官方固件库STM32F10x_StdPeriph_Lib_V3.5.0里的MDK启动文件分析,简化部分不需要的代码,并从繁杂的固件库里,精炼出一个类似于“hello world”的入门实战小程序——点亮一个LED。
该工程仅仅包含一个启动文件和一个有main函数的C文件。
本文初衷:不用固件库建立自己的工程!实验软件:Keil uVision4实验硬件:神舟IV号开发板芯片型号:STM32F107VCSTM32启动代码分析、简化、实战汇编基础:1.伪指令:EQU语法格式:名称EQU表达式{,类型}EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言的#define。
其中EQU可以用“*”代替。
名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有一下三种类型:CODE16、CODE32和DA TA2.伪指令:AREA语法格式:AREA段名{,属性1}{,属性2}……AREA命令指示汇编程序汇编一个新的代码段或数据段。
段是独立的、指定的、不可见的代码或数据块,它们由链接程序处理。
段名:可以为段选择任何段名。
但是,以一个数字开始的名称必须包含在竖杠号内,否则会产生一个缺失段名错误。
例如,|1_DataArea|。
有些名称是习惯性的名称。
例如:|.text|用于表示由C编译程序产生的代码段,或用于以某种方式与C库关联的代码段。
属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。
常用的属性如下:——CODE属性:用于定义代码段,默认为READONLY。
——DA TA属性:用于定义数据段,默认为READWRITE。
——READONLY属性:指定本段为只读,代码段默认为READONLY。
——READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。
——ALIGN属性:使用方式为ALIGN表达式。
stm32启动文件
NMI_Handler PROC EXPORT NMI_Handler B . ENDP HardFault_Handler\ PROC EXPORT HardFault_Handler B . ENDP SysTick_Handler PROC EXPORT SysTick_Handler B . ENDP Default_Handler PROC EXPORT EXPORT EXPORT EXPORT WWDG_IRQHandler PVD_IRQHandler RTC_IRQHandler FLASH_IRQHandler
EXPORT __initial_sp ;栈顶地址,赋予全局属性 EXPORT __heap_base ;堆的起始地址 EXPORT __heap_limit ;堆的末地址 ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR LDR LDR LDR BX ALIGN ENDIF END ;定义全局标号 ;声明ctors
DCD DCD DCD DCD DCD DCD ••••• ••••• DCD DCD
;中断向量表的起始位置 __initial_sp ; 栈顶地址,给 __initial_sp分配4字节32位的地址为0x08000000 Reset_Handler ; Reset Handler 复位中断地址,分配地址为0x08000004 NMI_Handler ; NMI Handler 不可屏蔽中断地址,分配地址为0x08000008 HardFault_Handler ; Hard Fault Handler 硬件失败中断,分配地址为0x0800000C 0 ; Reserved 保留,没有使用到 0 ; Reserved ;地址分配每个中断向量占4个字节 PendSV_Handler SysTick_Handler ; PendSV Handler ; SysTick Handler 系统设备挂起请求 系统时钟定时器
stm32启动文件详解
STM32启动文件详解一、启动文件的作用1.初始化堆栈指针 SP;2.初始化程序计数器指针 PC;3.设置堆、栈的大小;4.设置异常向量表的入口地址;5.配置外部 SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);6.设置 C库的分支入口__main(最终用来调用 main函数);7.在 3.5版的启动文件还调用了在 system_stm32f10x.c文件中的SystemIni()函数配置系统时钟。
二、汇编指令三、启动代码1.stack ----- 栈Stack_Size EQU 0x00000400 ; 栈的大小AREA STACK, NOINIT, READWRITE,ALIGN=3 Stack_Mem SPACE Stack_Size ; 分配栈空间__initial_sp ; 栈的结束地址(栈顶地址) 分配名为STACK,不初始化,可读可写,8(2^3)字节对齐的1KB空间。
栈:局部变量,函数形参等。
栈的大小不能超过内部SRAM大小。
AREA:汇编一个新的代码段或者数据段。
STACK段名,任意命名;NOINIT表示不初始化;READWRITE可读可写;ALIGN=3(2^3= 8字节对齐)。
__initial_sp紧挨了SPACE放置,表示栈的结束地址,栈是从高往低生长,结束地址就是栈顶地址。
2.heap ----- 堆Heap_Size EQU 0x00000200 ; 堆的大小(512Bytes)AREA HEAP, NOINIT, READWRITE,ALIGN=3__heap_base ; 堆的起始地址Heap_Mem SPACE Heap_Size ; 分配堆空间__heap_limit ; 堆的结束地址分配名为HEAP,不初始化,可读可写,8(2^3)字节对齐的512字节空间。
__heap_base堆的起始地址,__heap_limit堆的结束地址。
STM32实现IAP功能的学习笔记--转载
STM32实现IAP功能的学习笔记--转载STM32实现IAP功能的学习笔记最近因项⽬需求要实现STM32的在线升级即IAP功能,先将这⼏天的学习体会和IAP的具体实现总结出来,分享给⼤家,希望对同样实现IAP 的童鞋有所帮助,⽂中最后会上传名为STM32_Update.zip的压缩⽂件⾥⾯包含了STM32_App、STM32_MyBoot_V1.0和升级软件STM32_UpdateSoftware的源码⽂件供⼤家参考。
所有程序都经过测试,可以直接在原⼦哥的上跑,上位机的升级软件⼤家可以直接打开STM32_Update\STM32_UpdateSoftware\Release\STM32_UpdateSoftware.exe来升级,如果需要查看源码请⽤VS2010打开⼯程⽂件。
最终要实现的是:单⽚机每次上电会先运⾏Boot程序,检查标志位如果标志位为FLAG_TO_APP则直接跳转到App程序运⾏,如果标志位为FLAG_TO_BOOT,则运⾏Boot程序准备升级。
在运⾏App程序时,当接收到升级的指令后会在FLASH中的某处空间写下升级的标志位FLAG_TO_BOOT,并且加载Boot程序,Boot程序会接受新的程序⽂件并且存储在相应的FLASH空间⾥,完成升级后会在标志位的空间写下FLAG_TO_APP,并且运⾏新的程序。
帖⼦包含如下⼏个⽅⾯:1. 什么是IAP?2. STM32的启动模式?3. STM32的FLASH分布?4. STM32程序的运⾏过程?5. BootLoader程序的编写(如何实现程序的动态加载)?6. App程序的编写?7. bin⽂件的转换?8. 上位机串⼝升级软件的简介-------------------------------------------------------------------------------------------------1. 什么是IAP?IAP的知识⽹上的各种资料也说的⽐较明⽩,在此简单介绍⼀下。
STM32三种启动模式以及IAP在线升级
一.Duanxx的STM32学习:启动模式,BOOT0和BOOT1详解Reference from:/daunxx/article/details/40148945在画STM32的电路图的时候,关于STM32的启动方式纠结了一下,现有的参考设计都是在STM32的启动选择引脚BOOT0和BOOT1上使用了跳帽,用以人工选择STM32的启动方式,但是在实际应用中这种设计就显得冗余,所以这里顺带研究了一下STM32的启动方式。
STM32一共有三种启动模式,在ST官网上下载的RM0008中,我找到了启动相关的配置说明:对应的中文翻译如下:所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK 的第4个上升沿,BOOT引脚的值将被锁存。
用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
∙Main Flash memory是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
∙System memory从系统存储器启动,这种模式启动的程序功能是由厂家设置的。
一般来说,这种启动方式用的比较少。
系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。
一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。
但是这个下载方式需要以下步骤:Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoaderStep2:最后在BootLoader的帮助下,通过串口下载程序到Flash中Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动可以看到,利用串口下载程序还是比较的麻烦,需要跳帽跳来跳去的,非常的不注重用户体验。
自己整理的STM32代码
ReadData_FRAM( us1, 0x1000, 10,NULL, 0);
Delay1us(10000);
ReadData_FRAM( us1, 0x1000, 10,NULL, 0);
//WriteSendBuf_USART(us0, 10, 3);
TIM_InitStructure.TIM_Period = 3600; //设置自动装载寄存器,4ms
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_InitStructure.TIM_Prescaler = 79; //预分频
stm32的18b20程序includestdiohincludeallhprivatedefinerom操作指令时romdefinereadrom0x33匹配romdefinematchrom0x55romdefineskiprom0xcc搜索romdefinesearchrom0xf0告警搜索definealarmsearch0xecdefinewritescratchpad0x4e时时时时definereadscratchpad0xbedefinecopyscratchpad0x48时时温度defineconverttemperature0x44时时重新definerecalleprom0xb8时时源definereadpowersupply0xb4privatemacrou16ds18b20pin接ds18b20的引脚defineds18b20pindefinedqxgpiododr具体使用那个端口修改此definereaddqgpioreadinputdatabitgpiodds18b20pin也要修改voidusdelayu16usvoidgpiointvoidpassgpioinittypedefgpioinitstructure
STM32启动文件的选择
STM32启动⽂件的选择移植了同事⼀个程序,然后死活不能⽤,发现启动⽂件错了,明天继续调。
真把⼈折腾死了。
stm32给的库⽂件太琐碎了,正如它的芯⽚型号⼀样繁多,例如启动⽂件:⽹上查到的各个⽂件的解释是:startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx startup_stm32f10x_hd.s ⼤容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_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 中容量的STM32F100xxstartup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xx固件库中的Release_Notes_for_STM32F10x_CMSIS.html写到:STM32F10x CMSIS Startup files: startup_stm32f10x_xx.sAdd new startup files for STM32 Low-density Value line devices: startup_stm32f10x_ld_vl.sAdd new startup files for STM32 Medium-density Value line devices: startup_stm32f10x_md_vl.sSystemInit() function is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c fileGNU startup file for Low density devices (startup_stm32f10x_ld.s) is updated to fix compilation errors.那到底啥是⼤容量,⼩容量啊?⼜查user manual才知道也就是说,例如我⽤STM32F103RB,那么选启动⽂件为startup_stm32f10x_md.s。
STM32启动代码详细分析
STM32启动代码详细分析最近需要学习iap的功能,因此离不开stm32的启动代码的分析,以前看了很多遍,都看不懂,读书百遍,其义⾃见,因此我有看了⼀遍,下⾯的⽂章,挺好的,因此转载:在上电复位后,我们都知道会先运⾏启动代码,但是启动代码到底使⼲什么⽤的呢?下⾯⼩弟给⼤家⼀⼀列出来。
1、初始化堆栈指针2、初始化 PC 指针3、初始化中断向量表4、配置系统时钟5、调⽤ C 库函数_main 初始化⽤户堆栈我们根据这以上的⼏个步骤⼀⼀进⾏详细的解析:1、栈的内存分配这段代码的意思是,开辟了⼀个栈,这个栈的⼤⼩是0x00000400也就是1KB的⼤⼩,名字为STACK,不初始化,可读可写,2^3=8字节对齐。
那么问题来了,那这个栈到底使⼲什么的呢?⼩弟相信⼤家在学习C语⾔的时候应该也是知道了,栈区保存的是局部变量,只是当时并没有深⼊研究它的⼤⼩问题。
那在这⾥⼩弟给⼤家详细讲解⼀下栈的作⽤:1、局部变量2、函数调⽤3、函数形参以上的这三种情况的开销都是使⽤我们的栈区的资源的。
所以啊!这⾥⼩弟给个位提个醒,千万不要把栈区当成⽆⽌境⼤⼩的哦!STM32可不⽐我们的电脑,没有那么多的空间可以给⼤伙挥霍,如果我们定义的局部变量过⼤可是会莫名其妙报错的。
温馨提⽰:请不要在写程序时,过度使⽤局部变量,会造成栈的益处,从⽽导致编译报错,如果在特殊情况下真的需要很⼤的栈区空间,只需来这⾥进⾏栈区⼤⼩的修改即可。
那么⼩弟再来给这个程序段⾥的汇编指令做⼀个详细的介绍Stack_Size EQU 0x00000400EQU:宏定义的伪指令,相当于等于,类似与 C 中的 define。
这句话的意思是,定义⼀个宏名Stack_Size这个宏代表0x00000400的意思,⽤我们C语⾔来表⽰就是#define Stack_Size 0x00000400AREA STACK, NOINIT, READWRITE, ALIGN=3AREA:告诉汇编器汇编⼀个新的代码段或者数据段。
关于 STM32 的 IAP 概念和应用笔记
豆皮- STM32开发板入门教程(十七)- IAP 之串口篇(原创)版权所有STMFANS 原创,转载请保留出处/bbs/viewthread.php?tid=1446&extra=page%3D1关于STM32 的IAP 概念和应用笔记STM32的ISP方式和IAP方式下载程序有什么区别都可以通过串口来下载啊,(也可以通过USB来下载,敬请留意IAP 之USB篇。
)ISP方式:需要将BOOT管脚配置成上电从System Memory启动,System Memory中有一段BOOTLOADER来接收串口来的数据,把它们烧写到FLASH中。
IAP方式:是用户自己写一段烧写程序,通过ISP或者仿真器事先烧写到用户FLASH中,使用时通过某种方式触发这段程序,再来从串口接收数据,然后烧到相应的FLASH中,不需要改变BOOT管脚配置。
ISP 就是IAP 的一种特殊的应用。
这里给出两份周立功公司的基于LPC ARM7 IAP 两份教程作为大家的学习资料参考:IAP在应用中编程及其应用PPT.rar(2008-12-11 13:02:18, Size: 307 KB, Downloads: 373)IAP在应用中编程及其应用.pdf(2008-12-11 13:02:18, Size: 544 KB, Downloads: 365)IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。
STM32启动概述
STM32启动代码概述一般嵌入式开发流程就是先建立一个工程,再编写源文件,然后进行编译,把所有的*.s文件和*.c文件编译成一个*.o文件,再对目标文件进行链接和定位,编译成功后会生成一个*.hex文件和调试文件,接下来要进行调试,如果成功的话,就可以将它固化到flash里面去。
启动代码是用来初始化电路以及用来为高级语言写的软件作好运行前准备的一小段汇编语言,是任何处理器上电复位时的程序运行入口点。
比如,刚上电的过程中,PC机会对系统的一个运行频率进行锁定在一个固定的值,这个设计频率的过程就是在汇编源代码中进行的,也就是在启动代码中进行的。
与此同时,设置完后,程序开始运行,注意,程序是在内存中运行的。
这个时候,就需要把一些源文件从flash里面copy到内存中,又要对它们进行初始化读写,这又有频率的设置。
这些都是初始化。
初始化完成后,我们又要设置一些堆栈,要跳到C语言的main函数里面运行。
这就需要堆栈。
对普通的ARM CPU有这样一个要求:在绝对地址为零的地方要放置一个异常向量表,但并不是所有的ARM CPU都留有这个一个空间,这就需要用到映射的功能。
我们可以将其它地方的一些空间映射到绝对地址里面。
当发生异常时,ARM核来读取异常中断表的时候,它会使用映射之后的那个表,这个就可以接着往下执行,否则在绝对地址零的地方找不到任何信息,程序就会死掉。
这些运行的环境全部建立好后,程序就会跳转到我们的main函数里面。
总之,启动代码,就是对最小系统的初始化。
包括晶振,CPU频率等。
启动代码的最小系统是:异常向量表的初始化–存储区分配–初始化堆栈–高级语言入口函数调用– main()函数。
程序的启动过程:以下面这个例子为例,编译完后,DEBUG后,我们可以看到,光标指向绝对地址为零的地方,这里存放的就是一个异常向量表。
它对应在startup.s里的源文件如下:单步运行后,马上跳转到初始化CPU的频率。
即初始化锁相环,将其锁在一个固定的频率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32启动文件的选择及宏定义及芯片型号更改 IAP总结
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
startup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,
STM32F102xx,STM32F103xx
cl:互联型产品,stm32f105/107系列
vl:超值型产品,stm32f100系列
xl:超高密度产品,stm32f101/103系列
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH=64 or 128
hd:高密度产品,FLASH大于128
在KEIL下可以在项目的选项C/C++/PREPROMCESSOR symbols的Define栏里定义,比如STM32F10X_CL
也可以在STM32F10X.H里用宏定义
#if !defined (STM32F10X_LD && !defined (STM32F10X_LD_VL && !defined (STM32F10X_MD && !defined (STM32F10X_MD_VL && !defined
(STM32F10X_HD && !defined (STM32F10X_XL && !defined (STM32F10X_CL
#define STM32F10X_HD
#endif
如果芯片更换,除了做如上所述的更改外,还需以下几步:
第一步 system_stm32f10x.c的系统主频率,依实际情况修改
#if defined (STM32F10X_LD_VL || (defined STM32F10X_MD_VL
#define SYSCLK_FREQ_24MHz 24000000
#else
#define SYSCLK_FREQ_72MHz 72000000
#endif
另外外部时钟在文件:stm32f10x.h 依实际修改
第二步定时器的参数依系统主时钟做适当修改
第三步 flash地址misc.h中的NVIC_VectTab_Flash 0x08000000 要与KEIL选项target的IROM1的地址一致,如果是IAP程序,依ISP程序占用大小,APP的FLASH地址向后延,比如
0X8002000,那么KEIL选项target的IROM1的地址也要就0x8002000,SIZE因为ISP占用了2000,所以就为0x40000-0x2000,即只能填写0X3E000
第四步 ISP程序与APP程序连接----(这一步我还不明白意思,需要验证)
打开 User 选项卡在 Run User Programs Before Build/Rebuild 中,勾选 Run#1,并在
其中填入
D:\Keil\ARM\BIN40\fromelf.exe --bin -o ./obj/Project.bin ./obj/Project.axf 其中,Project.bin 和 Project.axf 要和 Output 选项卡中的 Name of Executable 的名字
IAP我的总结
1 先FLASH_Unlock(;
2 小于或等于128K的STM每页为1k bytes,大于128K的每页为2K BYTES,减去从地址
0x8002000占用的0x2000后,算出页数,比如IAP占用8K,则64K的MD的STM32F系列用for(i=0;i<(64-8;i++ FLASH_ErasePage(0x8002000+0x400*i;循环按页擦除FLASH
3 按从外部串口获取到的数据,FLASH_ProgramWord(address,dat;//注意是按4字节方式写入的 if (*(uint32_t*address!= dat//字编程后校验。