STM32的基础

1.ST型号的名字解析

STM32:就是32位的微控制器单片机。可以很容易地控制I/o口的电平的高低。

ST推出有5大类,16个系列,1000多个型号的Cortex 内核微控制器。

大类系列
主流MCUG0,G4,F0,F1,F3
高性能MCUF2,F4,F7,H7
低功耗MCUL0,L1,L4,L4+,L5
无线MCUWB
微处理器MPUMP1(用在linux上)

     

                                                                                         

                                    

以一款型号命名举例:

 2.指令集

关于指令集架构与内核的对应:

 指令集架构都是用的ARM公司精简指令集(RISC)与之对应的是英特尔公司复杂指令集

指令集分为:

ARM:        32位,效率高 (在多核上)

Thumb:   16位,有限存储空间可以存放更多代码 

Thumb-2:兼有16 位和 32 位指令,ARMv6T2 和 ARMv7M体系。

STM32是属于Thumb-2指令集的MCU,其基于ARMv7架构。

 

 如图上图注意:M3包含M0并且在M0基础加入Thumb2指令集。M4包含M3在其基础上包含了DSP(数字信号处理),浮点运算。

3.不同的场合推出不同的Corter内核系

其次ST根据不同的场合推出不同的Corter内核系列。

1. Corter-A系列:开放式操作系统的高性能处理器

 2. Corter-M系列:面向具有确定性的微控制器应用的成本敏感型解决方案

3. Cortex-R 系列:面向实时应用的卓越性能。

 

3.Corter-M系列内核介绍:

1.内核内部详细介绍:

1.取指单元:从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。

2.解码器:CPU根据存储器提取到的指令来决定其执行行为。

3.寄存器组:包括通用寄存器组和特殊功能寄存器。通用寄存器用来保存指令执行过程中临时存放的寄存器操作数和中间(或最终)的操作结果。

4.算术逻辑运算单元:能实现多组算术运算和逻辑运算的组合逻辑电路,简称ALU。是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算,如加减乘(不包括整数除法)。

5.存储器接口:存储器总线用于传输指令或数据。

6.中断控制:嵌套向量中断控制器 NVIC

7.流水线:3级流水线:取指,解码和执行

8.调试系统

下面在针对寄存器组于流水线具体进行介绍:

1.寄存器组:

 

R0‐R12都是32位通用寄存器,用于数据操作。

R13作为堆栈指针SP。SP有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。 主堆栈指针( MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程) 进程堆栈指针( PSP):由用户的应用程序代码使用。 堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。

R14:连接寄存器,当呼叫一个子程序时,由R14存储返回地址

R15:程序计数寄存器。指向当前的程序地址。如果修改它的值,就能改变程序的执行流。

2.流水线:

 

什么是三级流水线:就是取值,解码,执行

指令N执行取指时接着解码。同时指令N+1就会取指的操作。当指令N执行时。指令N+1就会解码指令N+2就会取指。这样大大提高效率。

执行一条分支指令或直接修改PC而发生跳转时, ARM内核有可能会清空流水线,而需要重新读取指令。 即使产生了一个中断,一条处于“执行”阶段的指令也将会完成。流水线里其他指令将会被放弃,而处理器将从向量表的适当入口开始填充流水线。 不论是执行16位指令还是32位指令,读取PC时,会返回当前指令地址+4的值。

 内核都是ARM公司设计的。而MCU厂商购买了 ARM公司内核架构基础上加入总线,基本外设,时钟,存储器,I/o。从而设计出各种各样的MCU芯片。

4.总线:内核与外设是怎么进行数据交互的。

查看对应的手册:

 

 

如下就是如上完整的实物:

32位的内核:4G空间     32位CPU每次可以处理32个字位,即32bits=4Bytes。每一个字节都有一个地址,其中包含了8个字位。32位CPU有32根地址线,地址线决定了寻址范围的能力。每一根线都决定0和1两个地址,那么两根线就会决定00,01,10,11这四个地址,依次类推,32根线总共会决定出2^32(4G)次方个位置。每一个位置都是1Byte,这是内存的基本单位,所以32位操作系统配32位CPU,理论上可以寻找4GB的地址。

5.地址存储映射(很重要)查找对应的数据手册。

 各种外设挂载在总线的时钟图:

 

6. 位带操作:

Cortex-M4在SRAM区片上外设区都开有一个1MB的“位带区”32MB的“位带别名区”位带别名区的每个字(只有LSB有效)对应位带区的一个比特位。

 如下:对位带别名区每个字的操作最终都变换成对位带区对应比特位的操作。

 操作0x22000000地址相当于操作0x20000000的bit0。因为内核有硬件支持这种功能。

对位带别名区的访问操作,将原有的“读-改-写”做成一个硬件级别支持的原子操作,不能被中断打断。

映射地址计算:

bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4) bit_band_base : 位带别名区的起始地址

byte_offset :包含目标比特位的字节在位带区的偏移值(字节数)

bit_number : 目标比特位在字节中的位置(0~7)

举列子:

举列子1:得到把数组中每个元素的每一位。从而去控制PA1的输出电平、

 举例2:把32位字节的某一位设置为1

7.STM32的启动方式:

复位后从0x04取复位代码的起始地址。以及从地址0x00取堆栈指针。开始执行复位程序。

起始地址的值赋值给PC指针从起始地址开始执行。

 当从FSMC启动时需要重新设置SYSCFG寄存器最低两位为10.

8.寄存器:

简单说就是一个存储单元。寄存器一般都由触发器组成。而触发器由各种门组成。而各种门由各种电子元件组成。

1.寄存器应用分类:

● 电路内部使用的寄存器 内部寄存器不能被外部电路或软件访问,只是为内部电路的实现存储功能或满足电路的时序要求,比如ALU中的累加器ACC、以及CPU中的通用寄存器R0~R12

● 充当内外部接口的寄存器 接口寄存器可以同时被内部电路和外部电路或软件访问,CPU中的寄存器就是其中一种,作为软硬件的接口,为广泛的通用编程用户所熟知,比如控制端口A输出高电平的GPIOA_BSRR。

举例:

把GPIOA_OSPEEDR寄存器的第0和第1位都设置为1。

9.库函数代码的封装结构解析

库函数编程使用了大量的宏定义,并辅以众多结构体,对大量的寄存器操作代码进行严谨封装,使得代码可读性非常高。

 I/o挂载在AHB1时钟时的各起始地址:

 

 

 每个GPIO的寄存器有结构体表示并且顺序按地址的前后。MODER是第一个结构体成员。

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值