架构与CPU
架构
8位单片机为什么RAM和ROM可以地址重叠复用?
8位单片机采用哈佛结构,数据和代码有两套地址空间,可以相同,访问操作时用MOV/MOVX区分
32位单片机(STM32)采用改进型哈佛,数据和代码隔离但可交互,统一了地址空间
0x00000000~0x1FFFFFFF: Flash(代码) 0x20000000~0x3FFFFFFF: RAM(数据)
0x40000000~0x5FFFFFFF: 外设低位处理器能处理高位数据吗?
8位单片机的8位是数据总线,是ALU单元运算一次的数据位数,也可以处理32,64位的数据,分多次很慢。32同理。
低位处理器能访问低位地址吗?
8位单片机的地址总线是16位,可以寻址64KB,所以可以访问处理0xFFFF这种地址,32同理
初见——ARM
指令集是一套规则,CPU处理数据的流程,方式等的规则
ARM是一套指令集架构,也是一家公司,专卖指令授权,不产芯片。
ST,Soc,Apple,三星等芯片公司购买指令授权,生产芯片,处理器
ARMV7,V8等是常用版本。操作系统寄存器方式不同,V7指令要通过CP15协处理器,麻烦;V8直接通过指令操作VBAR等
CPU交互方式

IO复用为下面的SPI,I2C等
并行总线(本质)
首先明确一点,与CPU直接相连的是(并行总线):数据线,地址线,控制总线(片选)。就像公共圆形轨道,CPU在核心

增加一个外设,就要从公共总线上拉挂相同数目的地址线和数据线;CS线,还要额外的两根读写线等控制总线
这种是最基本的方式,在ARM-CotexM架构下将3捆线绑在一起,叫做AHB和APB总线。
挂在总线上,CPU会分配地址,因此可以直接访问地址来控制
可以看见,每增加一个外设,都要加一堆线重新设计电路,表现为PCB板子上线路爆炸,从而引出了IO引脚复用
串行协议
这些片外外设不挂在总线上,而是通过引脚复用,用对应的协议来实现交互
对于LCD屏幕等片外外设(自身有寄存器),通过I2C协议实现CPU间接对寄存器的操作,LCD寄存器是单独的地址空间,通过iic函数来写入或读取
MCU只需要杜邦线接入几个引脚就行了,方便
引脚读取到数据之后还是交给总线
STM32的CPU(轮询外设)
在嵌入式系统(如 STM32)中,主函数通常会包含一个 while(1) 无限循环,原因是嵌入式系统的设计理念与传统桌面系统有所不同。主函数中的无限循环是嵌入式程序结构的一部分,以下是一些原因:
1. 嵌入式系统没有操作系统(或使用简化的操作系统)
- 在很多嵌入式系统中,尤其是没有操作系统或使用轻量级操作系统的情况下,CPU 一直在执行一个主循环,处理各种任务。这种设计方式被称为 单任务 或 轮询式。在这种结构下,主函数中的无限循环保持程序持续运行,并不断执行任务。
例如,代码可能会定期检查外设状态或执行某些控制操作,而这些任务需要不断地被轮询和执行。
int main(void) {
// 初始化硬件和外设
while(1) {
// 执行主控制逻辑或轮询外设
if (some_condition) {
// 处理外设或执行某些任务
}
}
}2. 系统的长期运行
- 嵌入式系统通常需要长时间稳定运行。例如,在一个控制系统中,设备可能需要一直运行,直到被断电或重启。
- 无限循环保证了程序在系统启动后不会自动退出,始终保持系统的活跃状态,执行各种必要的任务,如数据采集、通信、状态监测等。
3. 处理外设和事件
- 嵌入式系统中的外设(如传感器、显示器、通信接口等)通常需要不断被监控和控制。主函数中的
while(1)无限循环确保 CPU 不断地检查和响应这些外设。 - 在没有操作系统的情况下,主循环用于处理定时任务、轮询外设和执行其他控制逻辑。
while(1) {
// 轮询外设
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
uint8_t data = USART_ReceiveData(USART1);
// 处理接收到的数据
}
}4. 实现定时器和延时控制
- 在没有操作系统的情况下,程序通过主循环控制定时器和延时。这通常依赖计时器中断或者软件延时来执行周期性任务。
- 无限循环可以确保这些定时任务得到持续执行,并且控制程序能够按照设定的时序进行。
总结:
在嵌入式系统的代码中,while(1) 无限循环是为了确保程序能够持续运行,并且不断处理外设、响应事件以及执行控制任务。它是嵌入式系统中的一种常见结构,特别是在没有操作系统的情况下。通过这个循环,系统可以持续监控外设、执行定时任务和处理中断,而不会主动退出或停止运行。
中断机制(非轮询方式)
- 中断是一种机制,允许外部事件(如硬件设备、系统错误或用户输入)打断正在执行的程序。中断请求会导致 CPU 暂停当前执行的任务,转而处理中断服务程序(Interrupt Service Routine,ISR)。
- 开启外设中断后,CPU 并不会一直“轮询”硬件设备,而是依赖硬件中断来高效响应设备的需求。例如,当外部设备(如硬盘、网络卡等)准备好数据时,它会发送中断信号给 CPU,通知 CPU 进行处理。CPU 会在完成当前任务后,优先处理这些中断请求。
- 这种方式避免了轮询带来的无效资源浪费,提高了系统效率。
竞争与冒险

比如都先输入1,结果是0;B变为1,B有两个路线,一个经过与门到异或门,一个直接到,信号传播几乎是光速,尽管宏观看是同时,微观因为经过与门有差异,所以由0->1->0.有多余的信号产生,为了避免,使用边沿触发器

只有时钟信号到了才接受数据到寄存器里,等同于从原来的一直接受信号到现在的每隔很长时间才瞬间接受一次,避免了接收到不稳定的信号


