ARM/计算机体系结构
1、STM32
参考:CSDN
stm32f1系列是Cortex-M3内核 、72MHZ、SRAM最大64K字节、512KB ROM;
stm32f4系列是基于Cortex-M4内核、168MHZ、SRAM有192K字节;
1.STM32启动步骤
- STM32启动流程
-
设置堆栈指针SP指向_initial_sp
-
设置PC指针指向Reset_Handler
-
设置中断向量表
-
配置系统时钟
-
配置外部SRAM/SDRAM
-
跳转的C库执行main
2.STM32时钟
2、ARM 汇编指令
gcc/gun/g++
gcc是一款linux Gun计划当中的一款编译工具,用于编译C语言文件。
其显著特点就是可以交叉编译
在C语言源文件到可执行文件的过程经历:预处理->编译->汇编->链接 。
3、体系机结构
- ARM架构
- X86架构
1、冯.哈结构
冯诺依曼结构主要用于通用计算机领域,需要对存储器中的代码和数据频繁的进行修改,统一编址有利于节约资源。
哈佛结构主要用于嵌入式计算机,程序固化在硬件中,有较高的可靠性、运算速度和较大的吞吐。
ARM7系列采用冯·诺依曼体系结构,而ARM9~ARM11采用哈佛体系机构。
- “冯·诺依曼”体系结构
20世纪30年代中期,德国科学家冯诺依曼大胆的提出,抛弃十进制,采用二进制作为数字计算机的数制基础。同时,他还说预先编制计算程序,然后由计算机来按照人们事前制定的计算顺序来执行数值计算工作。
冯诺依曼理论的要点是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。 其主要内容是:
◎ 计算机由控制器、运算器、存储器、输入设备、输出设备五大部分组成。
◎ 程序和数据以二进制代码形式不加区别地存放在存储器中,存放位置由地址确定。
◎ 控制器根据存放在存储器中地指令序列(程序)进行工作,并由一个程序计数器控制指令地执行。控制器具有判断能力,能根据计算结果选择不同的工作流程。
- “哈佛”体系结构
数字信号处理一般需要较大的运算量和较高的运算速度,为了提高数据吞吐量,在数字信号处理器中大多采用哈佛结构。
哈佛结构特点如下:
◎ 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存,以便实现并行处理;
◎ 具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;
- 两种结构区别
在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯.诺曼结构与哈佛结构处理方式的差别。
举一个最简单的对存储器进行读写操作的指令,指令1至指令3均为存、取数指令,对冯.诺曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。
如果采用哈佛结构处理以上同样的3条存取数指令,如下图所示,由于取指令和存取数据分别经由不同的存储空间和不同的总线,使得各条指令可以重叠执行,这样,也就克服了数据流传输的瓶颈,提高了运算速度。
2、大.小端
ARM 和现代通用计算机一般是小端
STM32 C51采用大端
0. 什么是大小端?
参考CSDN
对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。
假如现有一32位int型数0x12345678,那么其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78,在CPU内存中有两种存放方式:(假设从地址0x4000开始存放)
总结:
-
数组:a{1, 2, 3, 4, 5, 6, 7, 8} //从左到右地址依次增大
-
若将上述数组转换成整数:
1.在小端序中:87654321 //从左到右地址依次减小
小端左边放高位元素
2.在大端序中:12345678 //从左到右地址依次减小
大端左边放低位元素 -
大端是高字节存放到内存的低地址
-
小端是高字节存放到内存的高地址
1. 联合体测试机器的大小端
#include<stdio.h>
union var{
char c[4];
int i;
};
int main(){
union var data;
data.c[0] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~
data.c[1] = 0x03;//写成16进制为了方便直接打印内存中的值对比
data.c[2] = 0x02;
data.c[3] = 0x11;
//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
//而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。
printf("%x\n",data.i);
----------结果:----------------------
11020304
证明我的32位**linux是小端**(little-endian)
- 法2:
判断当前机器的大小端存储
#include <stdio.h>
#include <stdlib.h>
int check_sys()
{
union{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
int main()
{
int ret = check_sys();
if (ret == 1) //原来的整型从低地址开始向小端左边流入
{
printf("小端\n");
}
else //原来的整型从高地址开始向大端左边流入
{
printf("大端\n");
}
return 0;
}
2. 自创大小端序检测器
#include <stdio.h>
//手撸大小端序检测器
int main(){
char a[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
int *p = (int*)a;
printf("%x\n",*++p);
return 0;
}
输出:8070605(小端序)
3. 整型强转字符型法
例如:
整型int a = 1,即 0x 00 00 00 01
小端序为:00 00 00 01(地址从左到右依次降低)
大端序为:01 00 00 00
(char)&a对于小端可以理解为取最低地址的字节
因此小端序返回1,大端序返回0。
#include <stdio.h>
#include <stdlib.h>
int check_sys()
{
int a = 1;
return *(char*)&a;//返回1表示小端,返回0表示大端
}
/*
int main()
{
if (check_sys() == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
system("pause");
return 0;
}*/
4.结论:
- 网络字节序是大端
- linux是小端序
- windowns是小端序(用C在线工具和力扣在线工具测得)
CPU / MPU / MCU / SOC / SOPC
CPU的运作原理:分为四个阶段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。
CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码,并执行指令。
所谓的计算机的可编程性主要是指对CPU的编程。
- 1.CPU(Central Processing Unit),是一台计算机的运算核心和控制核心。
- 2.MPU (Micro Processor Unit),叫微处理器(不是微控制器),通常代表一个功能强大的CPU
- 3.MCU(Micro Control Unit),叫微控制器,将计算机的CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的芯片(51 avr)。
- 4.SOC(System on Chip),指的是片上系统,MCU只是芯片级的芯片,而SOC是系统级的芯片,可以运行操作系统
- 5.SOPC(System On a Programmable Chip)可编程片上系统(FPGA就是其中一种)
3、指令流水线
- 1. 什么是ARM流水线技术?参考知乎
流水线技术通 过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一
ARM7处理器核使用了典型三级流水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构。
- 2. 计算
- 流水线执行时长及周期
流水线周期为执行时间最长的一段
流水线计算公式为:
1条指令执行时间+(指令条数—1)流水线周期
理论公式:(t1+t2+……tk)△t
实践公式(k+n—1)△t(k表示分的部分数,n表示条数)
例:若指令流水线把一条指令分为取值、分析和执行,且三部分的时间分别是取值2ns,分析2ns,执行1ns。那么,流水线周期是多少?100条指令全部执行完需要多少时间?
流水线周期为:2ns
100条需耗时:
理论值:先算一条指令耗时:2ns+2ns+1ns=5ns
5ns+(100—1)x2ns=203ns
实际值:(3+99)x2ns=204ns //这里有疑问,感觉理论值更实际些
- 流水线吞吐率计算
流水线吞吐率(TP)是指在单位时间内流水线所完成的任务数量或输出的结果数量。
计算流水线吞吐率的最基本的公式如下:
流水线最大吞吐率:
4、单片机ROM/RAM/FLASH
ROM/RAM/FLASH作用
(1)ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中;RAM是随机存储器,CPU既可以从里面读出数据,又可以往里面写入数据,掉电后数据不保存,这是条永恒的真理,始终记挂在心。
1. 什么是Nand Flash
Flash主要分两种,Nand Flash和nor flash。
关于Nand Flash和Nor Flash的区别:
Nor的成本相对高,容量相对小,比如常见的只有128KB,256KB,1MB,2MB等等,优点是读写数据时候,不容易出错。所以在应用领域方面,Nor Flash比较适合应用于存储少量的代码。
Nand flash成本相对低,说白了就是便宜,缺点是使用中数据读写容易出错,所以一般都需要有对应的软件或者硬件的数据校验算法,统称为ECC。但优点是,相对来说容量比较大,现在常见的Nand Flash都是1GB,2GB,更大的8GB的都有了,相对来说,价格便宜,因此适合用来存储大量的数据。其在嵌入式系统中的作用,相当于PC上的硬盘,用于存储大量数据。
所以,一个常见的应用组合就是,用小容量的Nor Flash存储启动代码,比如uboot,用大容量的Nand Flash做整个系统和用户数据的存储。
4、硬件/通信 接口
1.基础知识
-
串行并行
串行:一次一位,串行口传输方式为数据排成一行、一位一位送出接收也一样;
并行:一位(比特)时间内可传输一个字符,并行口传输8位数据一次送出.;
-
同步异步
同步:同步通信要求接收端时钟频率和发送端时钟(外界时钟)频率一致,发送端发送连续的比特流,传输速度比异步传输快;
异步:异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节; -
串行通信方式:
0.概述
UART:(Universal Asynchronous Receiver Transmitter:通用异步收发器/异步串行通信口),是一种通用的串行数据总线,用于异步通信,支持全双工。它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。
IIC总线协议:I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
SPI总线协议:SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议。
RS232接口缺陷:
(1)接口的信号电平值较高( +/-12V),易损坏接口电路的芯片。
(2)传输速率较低,在异步传输时,波特率为20Kbps。
(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。
RS485是对RS232的改进,特点包括:
①接口电平低,不易损坏芯片。RS485的电气特性:逻辑“1”以两线间的电压差为+(2 ~ 6)V表示,逻辑“0”以两线间的电压差为-(2~6)V表示。接口信号电平比RS232降低了,不易损坏接口电路的芯片。
②传输速率高。10米时,RS485的数据最高传输速率可达35Mbps,在1200m时,传输速度可达100Kbps。
③抗干扰能力强。RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
④传输距离远,支持节点多。RS485总线最长可以传输1200m以上(速率≤100Kbps)一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。
————————————————
原文链接:https://blog.csdn.net/fengge2018/article/details/107592487
1. UART(硬件接口)
0. 基础知识
- 串口和UART区别?
首先串口、COM口、UART口一般指的是硬件接口。
而TTL、RS-232、RS-485则是逻辑电平0和1的不同表示标准,它们区别如下:
1)和RS232相比,由于RS485采用了差分传输的方式,因此抗干扰能力强很多。TTL抗干扰能力最差。
2)像STM32这类单片机的USART口,出来的电平都是TTL电平,想要和电脑通讯需要电平转换芯片。
- 一般用TTL转USB给单片机下载程序
- 两个设备之间采用RS232通讯
参考:小肥侠123
-
USART与UART的区别?
USART(universal synchronous asynchronous receiver and transmitte): 通用同步异步收发器
USART是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。UART(universal asynchronous receiver and transmitter): 通用异步收发器
异步串行通信口(UART)就是我们在嵌入式中常说的串口,它还是一种通用的数据通信议。
区别:
USART是指单片机的一个端口模块,可以根据需要配置成同步模式(SPI,I2C),也可以将其配置为异步模式,后者就是UART。所以说UART姑且可以称之为一个与SPI,I2C对等的“协议”,而USART则不是一个协议,而是更应该理解为一个实体。(摘自知乎-Sean回答)
相比于同步通讯,UART不需要统一的时钟线,接线更加方便。但是,为了正常的对信号进行解码,使用UART通讯的双方必须事先约定好波特率,即单位事件内传输码元的个数。
————————————————
版权声明:本文为CSDN博主「JYU_hsy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40774605/article/details/88398709
1.RS232(电平标准)
- 通信方式:RS232采用不平衡传输,即单端通信;
- 传输距离:适合本地设备之间通信,<20m
- 设备数量:一对一通信
2. RS485(电平标准)
- 通信方式:RS485采用了(平衡传输)差分传输的方式,因此抗干扰能力强很多;
- 传输距离:几十米到上千米;
- 设备数量:128个收发器
2. CAN
STM32常用CAN收发器;TJA1050或者82C250。
理想情况下,可以 达 128 个,当然,使用特定的 芯片,可以达到 256 等等,这是由它自身的驱动能力决定的。
在 CAN 总线的起止端有一个 120Ω的终端电阻,是用来来做阻抗匹配,以减少回波反射。
-
传输数据
每次发送数据前,节点都会监听总线的状态,如果总线状态为空闲时,它就会立即向总线上发送自己的数据,这个数据里不仅有数据,还有本身的ID信息或者其他的控制指令,应称为数据包(数据帧),也叫做报文。当报文被传输到其它节点时,只要这些节点按格式去解读,就能还原出原始数据。报文: 在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在数据的尾段加上 CRC 校验标签、应答标签和传输结束标签。类似这样的数据包就被称为 CAN 的数据帧。为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧,帧也称为报文。
- 五种帧类型:
- 数据帧是在 CAN 通讯中最主要、最复杂的报文,它以一个显性位(逻辑 0)开始,以 7 个连续的隐性位(逻辑 1)结束。在它们之间,
分为仲裁段、
控制段、
数据段、
CRC 段
ACK 段,
以标准数据帧为例。
- 五种帧类型: