ARM和系统移植为驱动开发学习做准备工作
C语言基础及STM32需要的硬件知识,学习流程、思想和解决问题的方法即可
知道驱动的基本框架以及基本开发要求
接口技术
GPIO:通用的输入输出接口(输入:上拉、下拉、浮空、模拟;输出:推挽/开漏)
本质:操作寄存器。使能:配置模式(输出)、输出类型(推挽)、输出速度(默认)、输出数据(相应位写1)。
串口通信协议:UART、IIC、SPI、CAN
电气协议:TTL、RS232、RS485
无线通信:WiFi、蓝牙、NB-IOT、Lora、zigbee
ADC:模数转换(需要得到外界真实数据)
PWM:脉冲宽度调制(用定时器调节平均功率)
MCU与MPU的区别
【三分钟了解什么是CPU_SOC_MPU和MCU】 三分钟了解什么是CPU_SOC_MPU和MCU_哔哩哔哩_bilibili
STM32G030(M0+) S5P6818(A53)
微控制单元(Microcontroller Unit;MCU) ,又称单片微型计算机或者单片机,是把中央处理器的频率与规格做适当缩减,并将内存、计数器(Timer)、USB、A/D转换、UART、、DMA等周边接口整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。
微处理器单元 (Microprocessor Unit;MPU)。就是把很多 CPU 集成在一起并行处理数据的芯片。通俗来说,MCU 集成了 RAM,ROM 等设备;MPU 则不集成这些设备,是高度集成的通用结构的中央处理器矩阵,也可以认为是去除了集成外设的 MCU。
传统来说,MPU更多采用Arm Cortex-A系列核心,具备丰富的外设接口,MCU则大多采用Arm Cortex-M系列核心,也比MPU更便宜,更容易安装和使用。主要区分是MMU。
更简单粗暴地划分二者的方式是运行Linux就是MPU,基于实时操作系统(RTOS)就是MCU。MCU的目的是永远运行一个相当简单的控制循环,或者直到它中断或停止。
随着技术和应用的发展,某些公司开始逐渐越界,界限开始模糊。
CPU运行原理
根据下载的程序运行,程序是指令和数据的有序集合
指令的解析
一条指令(机器码)的执行通常分为三个阶段:
1)取指:控制器将PC寄存器中的值发送给内存,内存将对应地址中的指令(机器码)传送回CPU的指令寄存器IR中
2)译码:指令译码器对IR中的指令进行识别,将指令(机器码)解析(翻译)成具体的运算操作(+/-/*...)
3)执行:控制器控制运算器中对应的运算单元进行运算,运算结果写入寄存器
注意:PC每取地址一次,自加一次。PC的值自动增加使PC指向内存中的下一条指令
思考:
1.运算器不同,处理指令不同。不同的处理器上如何运行同一个c语言程序?
2.假设指令集有乘法指令,结果并没有乘法运算器,怎么办?
可以转换为加法指令
指令流水线
指令的执行是按照流水线
取指--》取指器 根据PC值取指令
译码--》译码器
执行--》执行器
以上三个器件,都是单周期的器件,三个器件的工作是独立
指令1 指令2 指令3 指令4 指令5
1 取指
2 译码 取指
3 执行 译码 取指
4 执行 译码 取指
5 执行 译码 取指
6 执行 译码
7 执行
PC永远指向当前取指指令的地址,一旦取到指令,pc后移4byte,保存下一条指令地址。
指令流水线机制的引入确实能够大大的提升指令执行的速度,但在实际执行程序的过程中很多情况下流水线时是无法形成的,比如芯片刚上电的前两个周期、执行跳转指令后的两个周期等。
所以指令流水线的引入以及优化只能使平均指令周期不断的接近1而不可能真正的达到1,且流水线级数越多芯片设计的复杂,程度就越高,芯片的功耗就越高。
指令集架构
ARM的命名有指令集架构、 处理器架构、 处理器型号三类命名规则
架构指支持的汇编指令集(架构不同,汇编指令集不同)
ARM体系结构:ARMv8-A ---> Cortex-A53 --> S5P6818 主频:1.4GHZ
内核:Cortex-A9,A53,A73,A75
ARM公司授权芯片的公司,芯片产家在内核的基础上,增加了一些外设,发布一款芯片,这些芯片可以统称为SoC
SoC:System of Chip(片上系统);例如:S5P6818,骁龙(高通),麒麟(海思)
s5p6818(8核)
ARM的工作模式(A系列)
- 用户模式(User ):非特权模式,用户程序的工作模式,运行在操作系统的用户态。它没有权限去操作其他硬件资源,只能执行处理用户自己的数据,并且不能切换到其他模式。要访问硬件资源或切换到其他模式,只能通过软中断或产生异常。
- 快速中断模式(FIQ ):当一个高优先级(fast) 中断产生时将会进入这种模式。它主要用于高速数据处理及通道处理。
- 中断模式(IRQ):当一个低优先级(normal) 中断产生时将会进入这种模式。硬件产生中断信号后,处理器会自动进入这种模式。
- 管理模式/SVC(Supervisor):当复位或软中断指令执行时将会进入这种模式,当用户模式下的用户程序请求使用硬件资源时,通过软件中断可以进入该模式。
- 中止模式(Abort) :用于支持虚拟内存或存储器保护。当用户程序访问非法地址或没有权限读取的内存地址时,会进入该模式。
- 未定义模式(Undef):当执行未定义指令时ARM会进入这种模式
- 系统模式(System):特权模式之一,提供给操作系统内核使用。可以访问更多的寄存器和特权指令,用于执行特权级别的操作和管理系统资源。
- 监控模式(Monitor) : 是为了安全而扩展出的用于执行安全监控代码的模式。也是一种特权模式(Cortex-A特有模式)
工作模式的理解
不同的模式拥有不同的权限
不同的模式执行的代码不同
不同的模式拥有不同的功能
特定的模式拥有特定的权限,执行特定的代码,完成特定的功能
ARM寄存器
工作模式的切换是依据寄存器去实现的。
ARM7,9,11 有37个寄存器
30 个通用寄存器
1 个用作 PC( program counter)
1个用作CPSR(current program status register)
5个用作SPSR(saved program status registers)
Cortex-A多出3个寄存器,即有40个寄存器
Monitor 模式r13_mon , r14_mon, spsr_mon
R0-R15, CPSR,SPSR 这些寄存器是由ARM公司提供,每个寄存器都是32位的。
这些寄存器没有地址,只有一个唯一的编号,通过这些编号,就可以访问对应的地址空间。R0-R15,cpsr,spsr就是对应的编号,每个编号都对应的32位二进制
专用寄存器
R13(SP,Stack Pointer)
栈指针,用于存储当前模式下的栈顶地址
R14(LR,Link Register)
链接寄存器:函数调用时,保存返回地址(下一条地址的指令的地址)
R15(PC,Program Counter)
程序计数器:用于存储当前取址指令的地址(下一条指令的地址)
CPSR寄存器
CPSR(Current Program Status Register),程序状态寄存器
存储当前程序运行状态
NZCV这几位叫条件位,后边八位叫控制位(C表示)
Bit[4:0]
[10000]User [10001]FIQ [10010]IRQ [10011]SVC
[10111]Abort [11011]Undef [11111]System [10110]Monitor
Bit[5]
[0]ARM状态 [1]Thumb状态
Bit[6]
[0]开启FIQ [1]禁止FIQ
Bit[7]
[0]开启IRQ [1]禁止IRQ
Bit[28]
> 当运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0
> 当运算器中进行减法运算且产生符号位借位时该位自动置0,否则为1
Bit[29]
> 当运算器中进行加法运算且产生进位时该位自动置1,否则为0
> 当运算器中进行减法运算且产生借位时该位自动置0,否则为1
Bit[30]
当运算器中产生了0的结果该位自动置1,否则为0
Bit[31]
当运算器中产生了负数的结果该位自动置1,否则为0
SPSR寄存器
SPSR:保存程序状态的寄存器(saved program status register)
用于保存CPSR(通用寄存器,在切换模式的时候用)
ARM的异常处理
异常
处理器在正常执行过程中可能遇到一些不正常的事件发生,这时处理器就要将当前程序暂停下来转而去执行这个异常事件,异常事件处理完之后返回被异常打断的地方继续执行。
ARM异常源
概念:导致异常产生的事件称为异常源
ARM异常源 |
|
FIQ |
快速中断请求引脚有效 |
IRQ |
外部中断请求引脚有效 |
Reset |
复位电平有效 |
Software Interrupt |
执行swi指令 |
Data Abort |
数据终止 |