stm32之入门知识
一、stm32最小系统
stm32最小系统组成如下(除了stm32芯片外):
1、电源模块,3.3V电源,需要用稳压器件,有时要用感容网络产生stm32所使用的模拟电源。
2、时钟模块,有源或者无源晶振,可以使用最高25MHz的有源晶振或者4-16MHz的无源晶振,常用的是外部8M无源晶振,负载电容可选22pf。
下面分别是低速外部时钟(提供RTC使用)和高速外部时钟。
3、复位电路,RC复位或者独立IC复位,stm32的复位引脚内置有40k的电阻,可以外接0.1uf电容到地实现复位,并且可以增加复位按钮。当然复位电路大家
都习惯用个外部上拉,虽然这不是必须地,但如果能保证复位时间也完全没问题。
4、Boot选择,stm32有boot0和boot1两个引脚,用于配置系统启动方式,可以从片上闪存、系统存储器或者片内SRAM启动。从系统存储器启动可以使用固
化的bootloader实现程序从USART1加载。从片内SRAM启动,这个目前还没研究过,不过很感兴趣。
5、程序下载和调试接口,可以使用jtag接口实现下载调试功能,在空间受限的情况下,也可以使用USART1来加载程序。
二、stm32启动模式
1、BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。
2、BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。ISP
3、BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。
三、开发工具
keil c51 针对51单片机系列。
keil MDK-ARM 针对arm开发(其中V5版本和V4版本有很大的区别,V5版本需要另外安装芯片包)。
下载方式的对比(SWD和JTAG):
1. SWD 模式比 JTAG 在高速模式下面更加可靠。 在大数据量的情况下面 JTAG 下载程序会失败, 但是 SWD 发生的几率会小很多。
基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的, 只要你的仿真器支持。 所以推荐大家使用这个模式。
2. 在大家 GPIO 刚好缺一个的时候, 可以使用 SWD 仿真, 这种模式支持更少的引脚。
3. 在大家板子的体积有限的时候推荐使用 SWD 模式, 它需要的引脚少, 当然需要的 PCB 空间就小啦! 比如你可以选择一个很小的
2.54 间距的 5 芯端子做仿真接口。
四、存储器、寄存器
ARM内核中带有存储器,比如cortex-M4中带有4GB的存储空间。厂家或者用户可以用存储器对Flash、RAM、外设等进行地址分配,称作存储器映射。
给具有特定功能的内存单元取别名,这个别名就是寄存器,这个起别名的过程就是寄存器映射。
寄存器的地址=存储器的基地址+偏移地址
因为操作寄存器的地址很麻烦,所以对寄存器进行了C语言封装,方便开发。
五、编程开发
一般用的较多的是C语言和汇编语言(其他语言就不说了),有些初学者认为,C语言十分方便,完全可以取代汇编,其实不然。他们各有各的优点:
- C语言: 开发相对简单,适用于大型工程
- 汇编语言: 适用于小型工程或者一些特殊场合(要求性能、存储量、军事)。
所以一般来说,C语言嵌入式汇编的方式是一种比较好的编程方法。
六、STM32注意事项
在设计过程中,我们会遇到各种型号的封装,这就要求我们会看懂各个型号的意思,以STM32F103ZET6为例,ST代表意法半导体,其中ARM有三个
系列,分别是A、R、M,所以M表示的是这款芯片是M系列的,F是芯片的子系列,然后103代表是增强型系列(101是基本型),Z是引脚数,(Z-144脚、
E-100脚...),然后接下来的字母代表Flash容量(E-512K、D-348K、C-256K.....),字母“T”代表LQFP封装,字母“6”代表(-40~85摄氏度)。具体的
标准如下图所示:
我们在编程开始前,都需要向工程中加入启动文件,不同型号配置的stm芯片,启动文件也不一样,就拿stm32F10x为例,如下图所示:
- startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices
- startup_stm32f10x_ld.s: for STM32 Low density devices
- startup_stm32f10x_md_vl.s: for STM32 Medium density Value line devices
- startup_stm32f10x_md.s: for STM32 Medium density devices
- startup_stm32f10x_hd.s: for STM32 High density devices
- startup_stm32f10x_xl.s: for STM32 XL density devices
- startup_stm32f10x_cl.s: for STM32 Connectivity line devices
cl:互联型产品,stm32f105/107系列
vl:超值型产品,stm32f100系列
xl:超高密度产品,stm32f101/103系列
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH=64 or 128
hd:高密度产品,FLASH大于128
除了利用这些配置相应的启动文件外,还要在下载程序配置中进行选择芯片,如图所示:
此外,在项目中使用stm32标准外设库(STM32F10x Standard Peripherals Library)的时候,我们会在项目的选项中预定义两个宏定
义:USE_STDPERIPH_DRIVER, STM32F10X_MD,如下图:
这两个宏的作用是什么呢?
1、 USE_STDPERIPH_DRIVER : to use or not the peripheral’s drivers in application code (i.e. code will be based on direct access to
peripheral’s registers rather than drivers API) , this option is controlled by the #define USE_STDPERIPH_DRIVER
即这个定义控制了是否在应用中启用外设驱动。我们使用标准外设库本来就为了方便控制外设,所以要添加这个定义,以启用外设驱动。
2、STM32F10X_MD:在上面已经提到,有多种类别,每种类别都有所区别,例如sram或者flash或者外设数量不一样,所以stm32标准外设库
必须根据你使用的处理器来做相应的预处理。如图所示:
’