STM32-深⼊浅出(新⼿必看)
STM32学前班教程之⼀:为什么是它
经过⼏天的学习,基本掌握了STM32的调试环境和⼀些基本知识。想拿出来与⼤家共享,笨教程本着最⼤限度简化删减STM32⼊门的过程的思想,会把我的整个⼊门前的⼯作推荐给⼤家。就算是给⽹上的众多教程、笔记的⼀种补充吧,所以叫学前班教程。其中涉及产品⼀律隐去来源和品牌,以防⼴告之嫌。全部汉字内容为个⼈笔记。所有相关参考资料也全部列出。:lol
教程会分⼏篇,因为太长啦。今天先来说说为什么是它——我选择STM32的原因。
我对未来的规划是以功能性为主的,在功能和⾯积之间做以平衡是我的⾸要选择,⽽把运算放在第⼆位,这根我的专业有关系。⾥⾯的运算其实并不复杂,在⼊门阶段想尽量减少所接触的
东西。
不过说实话,对DSP的外设并和开发环境不满意,这是为什么STM32⼀出就转向的原因。下⾯是我⾃⼰做过的两块DSP28的全功能最⼩系统板,在做这两块板⼦的过程中发现要想尽⼒缩⼩DSP的⾯积实在不容易(⽬前只能达到50mm×45mm,这还是没有其他器件的情况下),尤其是双电源的供电⽅式和1.9V的电源让⼈很头疼。
后来因为⼀个项⽬,接触了LPC2148并做了⼀块板⼦,发现⼩型的ARM7在外设够⽤的情况下其实很不错,于是开始搜集相关芯⽚资料,也同时对⼩⾯积的A VR和51都进⾏了⼤致的⽐较,这个时候发现了CortexM3的STM32,⽐2148拥有更丰富和灵活的外设,性能⼏乎是2148两倍(按照MIPS值计算)。正好2148我还没上⼿,就直接转了这款STM32F103。
与2811相⽐较(核⼼1.8V供电情况下),135MHz×1MIPS。现在⽤STM32F103,
72MHz×1.25MIPS,性能是DSP的66%,STM32F103R型(64管脚)芯⽚⾯积只有2811的51%,STM32F103C型(48管脚)⾯积是2811的25%,最⼤功耗是DSP的20%,单⽚价格是DSP 的30%。且有更多的串⼝,CAP和PWM,这是有⽤的。⾼端型号有SDIO,理论上⽐SPI速
度快。
由以上⽐较,准备将未来的拥有操作系统的⾼端应⽤交给DSP的新型浮点型单⽚机28335,
⽽将所有紧凑型⼩型、微型应⽤交给STM32。
STM32学前班教程:怎么开发
sw笨笨的STM32学前班教程之⼆:怎么开发⽬前⼿头的⼊门阶段使⽤的开发器概述
该产品为简易STM32调试器和DEMO板⼀体化的调试学习设备,价格在⼀百多块。
2、硬件配置
仿真部分:USB⼝,reset,指⽰灯,JTAG
DEMO部分:4按键(IO),4LED(IO),⼀个串⼝,启动⽅式跳线,所有引脚的焊盘(可⾃
⾏焊接插针进⾏扩展)
DEMO芯⽚:STM32F103C8T6(程序空间64K)
参数和扩展:
注:学习的⽬标芯⽚是STM32F103CBT6(7×7mm,128K flash,16K RAM)以及
STM32F103RET6(10×10mm,512K flash,64K RAM)。
STM32-SK的硬件连接⽅法(⽤板载调试器调试板载DEMO):
JP3、JP5 须全部短接
USB通过电缆连接⾄PC的USB
串⼝连接⾄PC的串⼝或者通过USB转串⼝电缆连接(⼒特Z-TEC,USB2.0与RS232转接电
缆)
WindowsXP⾃动安装驱动
安装完成后如果DEMO板⾥⾯有程序就会⾃动运⾏了。这是ST-Link-II的通⽤连接⽅法
以上是学习阶段⽐较⽅便的仿真器,进⼊⼯程阶段后准备换J-Link V7的仿真器进⾏开发。⽬前
⽐较满意的产品:JLink v7+USB转串⼝:
购买后所需的改造:打开壳体,将USB的+5V供电跟JTAG20针的第⼆脚Vsupply飞线,提供⽬标板5V500mA的供电。看中的特点:集成串⼝,拥有20针JTAG可以改造Vspply为供电
接⼝,⼩巧好带,便宜。
常见的⽤于STM32单⽚机的仿真器分类
a) Ulink2:之前常⽤的仿真器。Keil公司产品,之前专⽤于ARM7,现扩展到CortexM3,调试接⼝⽀持JTAG和SWD,连接到PC主机的USB。现在这种调试器已经⽤的越来越少了。
b) ST-Link-II:ST公司的仿真接⼝,⽀持IAR EWARM,USB 1.1全速,USB电源供电,⾃适应⽬标系统JTAG电平3.3V-5V,可向⽬标系统提供不⼤于5V/200mA电源。这种调试器不多见,但是许多调试器与⽬标板⼀体设计的学习板上常见。
c) J-Link V6/V7:SEGGER公司产品,调试接⼝⽀持JTAG和SWV(V7速度是V6的12倍),USB 2.0接⼝,通过USB供电,下载速度达到720k byte/s,与IAR WEARM⽆缝集成,宽⽬标板电压范围:1.2V-3.3V(V7⽀持5V),多核调试,给⽬标板提供3.3V50mA电源。这种调试器现在出现的越来越多,兼容性⽐较好(主要是指能够与IAR WEARM⽆缝集成这点),国内
⼭寨货和各种变种也很多。
6、⽬标板主要分为⼀体化设计(与调试器、供电整合)和单独设计两类,详细产品⽐较见⾖⽪
的《如何选择STM32开发板》。
STM32学前班教程之三:让PC
⼯作
开发软件的选择
1、软件与版本的选择
需求:⽀持STLink2或未来的Jlink V7调试接⼝(因为STM32-SK使⽤这个接⼝),能够到去除软件限制的⽅法,最好具有中⽂版帮助和界⾯,最好带有纯软件仿真
选择:RealView MDK 3.23RPC或者IAR EWARM 4.42A(5版本观望⼀下)。
2、 RealView MDK 3.23RPC(中国版)安装与去除限制
第⼀步:执⾏安装程序完成基本安装,最后选项选择加⼊虚拟硬件,便于纯软件调试。
第⼆步:执⾏软件,点击File-->Licence Manager,复制CID的数据到破解器的CID,其他选
项如下图,然后点击Generate。
第三步:复制LIC0的数据到软件的LIC框⾥⾯,点击Add LIC。注意添加序列号后Licence Manager会算出这个号对应的有效期,如果到期会显⽰为红⾊,需要重新点击破解软件
的Generate,再算⼀个填进去就⾏了。
第四步:将ST-LINKII-KEIL Driver所需的⽂件(两个DLL)拷贝到\Keil\ARM\BIN下,替换
原有⽂件。
第五步:打开Keil安装⽬录下的TOOLS.INI⽂件,在[ARM]、[ARMADS]、[KARM]项⽬下添加TDRV7=BIN\ST-LINKII-KEIL.dll("ST LinkII Debugger")⾏,并保存修改。
第六步:打开MDK,在项⽬的options设置的Debug选项中选择ST LINKII Debugger,同时
在Utilities的选项中选择ST LINKII Debugger。
完成以上步骤,就完成了ST-LINKII的相关配置,可以作为调试器开始使⽤。注意:⽬前ST-LINKII不⽀持Flash菜单中的
Download和Erase命令,程序在使⽤Start/Stop Debug Session
时⾃动载⼊flash中供调试。
3、 IAR EWARM 4.42A安装与破解
第⼀步:开始/运⾏…/CMD显⽰DOS界⾯,执⾏>>ID.TXT得到本机ID码,复制这个ID码,再执
⾏ ID码>>Lic422A.TXT,得到⼀组注册码。
第⼆步:使⽤(30天限制版,其他版本⽆法使⽤第⼀步中的注册码),执⾏安装程序完成基本安装,过程中需要添⼊第⼀步⾥⾯算出来的注册码,可以取消时间限制,但是那⼀组当中只有⼀个有效,需要实验。
4、链接硬件调试程序
RealView MDK:到⼀个STM32-SK的基础程序,最好是只关于IO的且与当前板⼦程序不同,这样在板上就可以看到结果,点击Project/open project。例如GPIO、TIMER(另两个例程是关于串⼝的,需要连接串⼝才能够看到运⾏结果)。
使⽤“Open Project”打开,然后设置Option⾥⾯的linker和Utilities⾥⾯的项⽬为
“ST LinkII Debuger”。
编译程序,再使⽤“Start/Stop Debug Session”来写⼊程序。
IAR EWARM:与以上相同,到⼀个符合条件的例程。打开⼀个eww⼯程⽂件,右键选取Option,在Debuger⾥⾯选
择“Third-Party Driver”,在“Third-Party Driver”⾥⾯添上
“$PROJ_DIR$\..\ddl\STM32Driver.dll”。
使⽤“Make”或“Rebuild All”来编译程序,点“Debug”就烧写进Flash。使⽤调试栏⾥⾯的“go”等
等运⾏程序。
注:由于⽬前版本MDK与我⼿头的ST-LINK-II编程器不兼容,所以后⾯的所有⼯作均改⽤
IAR。
STM32学前班教程之四:打好基础建⽴
模板
1、新建⽬录Project_IAR4,按照⾃⼰的顺序重新组织dll(驱动);inc、src函数库;settings,
其他所有⽂件全部放这个新建的⽬录下。
2、双击打开Project.eww,继续更改内部设置。
3、需更改的内容列表:
位置和项⽬⽬标说明
Project\Edir confignations 新建基于STM3210B的配置编译⽬标和过程⽂件存放Project\Option\General Option\Target ST STM32F10x 选择芯⽚类型
Project\Option\ C/C++ Compiler\Preprocessor\Additional include directories $PROJ_DIR$\ $PROJ_DIR$\inc 头⽂件相对位置,需要包括“map/lib/type”的位置
Project\Option\ C/C++ Compiler\Preprocessor\Defined symbols 空空⽩是在Flash⾥⾯调试程
序,VECT_TAB_RAM是在RAM⾥调试程序
Project\Option\ C/C++ Compiler\Optimizations\Size 最终编译⼀般选择High
调试可选None None,Low,Medium,High是不同的代码优化等级
Project\Option\ Linker\Output 去掉Overrride default 输出格式使⽤默认
Project\Option\ Linker\Extra Output 打开General Extra Output去掉Overrride default ⼚家要
Project\Option\ Linker\Config 打开Overrride default
$PROJ_DIR$\l 使⽤Flash调试程序,如果需要使⽤RAM调试则改为
l
Project\Option\ Debugger\Setup\Driver Third-Party Driver 使⽤第三⽅驱动连接单⽚机Project\Option\ Debugger\ Download Use flash loader 下载到flash所需的设置
Project\Option\ Debugger\ Third-Party Driver\ Third-Party Driver\IAR debugger driver $PROJ
stm32怎么使用printf
_DIR$\ddl\STM32Driver.dll 驱动⽂件路径
注1:所有跟路径相关的设置需要根据实际情况编写,相对路径的编写——“$PROJ_DIR$”代表
eww⽂件所在⽂件夹,“..”代表向上⼀层。
注2:其他设置使⽤库函数⾥⾯的⼯程⽂件的默认选项即可,初学不⽤了解太多。
4、需要重新删除并重新添加Project下“FWLib”和“User”的所有⽂件,为了删减外设模块⽅便需要在“USER”额外添
加“stm32f10x_conf.h”(不添加也可以,需要展开main.c到它)。然后
执⾏Project\Rebuid All,通过则设置完毕。
5、完成以上步骤,第⼀个⾃⼰习惯的程序库就建⽴完毕了,以后可以从“stm32f10x_conf.h”中删减各种库⽂件,
从“stm32f10x_it.c”编辑中断,从“main.c”编写得到⾃⼰的程序。最后需要将这个库打包封存,每次解压缩并修改主⽬录名称即可。
6、我的程序库特点:
a) 默认兼容ST-LINK-II,IAR EWARM 4.42A,Flash调试,其他有可能需要更改设置
b) 为操作⽅便减少了⽬录的层次
c) 为学习⽅便使⽤⽹友版2.0.2固件,主要是库函数中c代码的注释。
后⾯随着学习深⼊将在我的模板⾥⾯加⼊如下内容:
d) 加⼊必⽤的flash(读取优化),lib(debug),nvic(中断位置判断、开中断模板),rcc(时钟管理模板,开启外设时钟模板),gpio(管脚定义模板)的初始化代码,所有模板代码⽤到的时候只要去掉前⾯的注释“//”,根据需求填⼊相应值就可以了。
e) 因为⾃⼰记性不好,所以main函数中的代码做到每⾏注释,便于⾃⼰以后使⽤。
f) 集成Print_U函数简单串⼝收发函数代码,便于调试,改变使⽤Printf函数的调试习惯。
g) 集成使⽤systick的精确延时函数delay。
h) 集成时钟故障处理代码。
i) 集成电压监控代码。
j) 集成⽚上温度检测代码。
k) 逐步加⼊所有外设的初始化模块
⼀、编写程序所需的步骤
1、解压缩,改⽬录名称,和eww⽂件名,以便跟其他程序区分。
2、更改设置:在“stm32f10x_conf.h”关闭不⽤的外设(在其声明函数前⾯加注释符号“//”)。并
根据外部晶振速度更改其中“HSE_Value”的数值,其单位是Hz。
3、完成各种头⽂件的包含(#include "xxx.h";),公共变量的声明(static 数据类型变量名称;),
⼦程序声明(void 函数名称(参数);)……C语⾔必须的前置⼯作。
4、改写我的程序库⾥⾯所预设的模板,再进⾏其他模块的初始化⼦程序代码的编写,并在程序
代码的开始部分调⽤。注意:必须记住所有外设的使⽤需要考虑4个问题:
a) 开时钟RCC(在RCC初始化中);
b) ⾃⾝初始化;
c) 相关管脚配置(在GPIO初始化中);
d) 是否使⽤中断(在NVIC初始化中)
5、编写main.c中的主要代码和各种⼦函数。
6、在“stm32f10x_it.c”填写各种中断所需的执⾏代码,如果⽤不到中断的简单程序则不⽤编写此
⽂件。
7、编译⽣成“bin”的⽅法:Project\Option\ Linker\Output\Format,⾥⾯选择“Other”,在下⾯
的“Output”选“raw-binary”⽣成bin。
8、编译⽣成“hex”的⽅法:Project\Option\ Linker\Output\Format,⾥⾯选择“Other”,在下⾯的“Output”选“intel-extended”,⽣成a79直接改名成为hex或者选中上⾯的“Output Flie”在
“Overrride default”项⽬⾥⾯改扩展名为hex。
使⽤软件界⾯的Debug烧写并按钮调试程序。注意,ST-Link-II是直接将程序烧写进Flash进
⾏调试,⽽不是使⽤RAM的⽅式。
STM32学前班教程之五:给等待⼊门的⼈
⼀点点建议
⼊门必须阅读的相关⽂档
1、⼏个重要官⽅⽂档的功能:
a) Datasheet——芯⽚基本数据,功能参数封装管脚定义和性能规范。
b) 固件函数库⽤户⼿册——函数库功能,库函数的定义、功能和⽤法。
c)参考⼿册——各种功能的具体描述,使⽤⽅法,原理,相关寄存器。
d) STM32F10xxx硬件开发:使⽤⼊门——相关基础硬件设计
e) STM32F10XXX的使⽤限制:芯⽚内部未解决的硬件设计bug,开发需要注意绕开。
f) ⼀本简单的C语⾔书,相信我,不⽤太复杂。
2、其他的有⽤⽂档,对初学帮助很⼤
a) 如何使⽤STM32的软件库在IAR的EWARM下进⾏应⽤开发——IAR基础设置。
b) 轻松进⼊STM32+Cortex-M3世界.ppt——开发板和最⼩系统设计需求。
c) 如何选择STM32开发板.pdf——各种开发板介绍和功能⽐较。
d) MXCHIP的系列视频教程——全部芯⽚基础及其外设的教程,使⽤函数库编程的话就不⽤看
每个视频后半段的关于寄存器的介绍了。
e) STM32_Technical_Slide(常见问题)——⼀些优化设计⽅案。
3、关于参考书,买了两本但是基本对学习没什么帮助,如果凑齐以上资料,建议慎重买书,不
如留着那n个⼏⼗块钱,攒到⼀起买开发板。
我⾃⼰的学习过程
1、⼀共24个库,不可能都学,都学也没⽤。按照我的⼯作需求必须学的有16个,这16个也