前言 博主是个大二菜鸡,在自学单片机的路上摸爬滚打算是有点眉目了,自认为目前流行的单片机教程都不够通俗易懂,对于外行爱好者不够友好,所以打算用尽可能简单的语言把自己学到的分享出来,但单片机毕竟不是玩具,必要的概念不能回避.水平有限,不敢妄称教程,也不定期更新,只希望可以多一个人因为这个系列而感受到编程的快乐.如果有不恰当的地方欢迎指正,博主会尽快改正.
ROM:主要的存储空间,容量大,掉电不丢失,但读写速度相较于RAM更慢,有最小擦除限制 单片机的ROM是flash,flash是ROM的一种形态,flash只能整页擦除,这个一页可能占到flash总容量的全部,就是说单片机的flash内容不可以随意修改
RAM:所有程序全部暂存在ROM里运行,芯片运行时会把程序从ROM中复制到RAM中运行,速度极快,但内容掉电丢失,所以只要一掉电电子设备就会从头开始运行,单片机也是如此
对电脑而言,ROM就是硬盘,容量256G/512G/1024G RAM就是内存,8G/16G/32G 电脑在运行时也会把所有要用的文件都装载在RAM中执行,所有的系统/软件全都是在内存里运行,他们平时保存在ROM里,运行过程中产生的数据也会保存进ROM
对手机而言,8+128/12+128/12+256,前面的就是RAM大小,后面的就是ROM大小
RAM决定了你可以运行多少程序,ROM决定了你可以下载保存多少程序
单片机的RAM和ROM相比手机电脑当然要差得多 我们一般不用考虑ROM和RAM大小,正常情况下都是够用的,常见的三款STM32里容量最小的stm32f103c8有64KB的ROM,容量最大的stm32f103ze有512KB的ROM,而一个循迹小车的代码编译后一般不超过10KB
单片机是遵循写入的程序进行工作的芯片
目前任何普通可编程芯片的基本原理都是,芯片内部有很多寄存器,大部分寄存器可以写入也可以读取,给特定的寄存器写入0或1单片机就会做特定的事情,这些寄存器在单片机内部是依次排列的,他们都有对应的地址,要写入某个寄存器就给他所在的地址写入值,单片机的RAM和ROM的数据也全都依照地址排列
地址从0x0到0xffffffff会划分成很多个区块,每个区块有不同的功能,例如stm32的ROM地址是0x20000000到0x3fffffff共536,870,911个Byte(也就是B),KB就是1024B,那么stm32的理论最大ROM是536MB,像stm2f103c8的ROM只有64KB,那么0x20000000+64*1024后面的地址就无效 这些都是stm32的规则,其他芯片的ROM地址可能会不一样,flash的地址排列也只是举个例子,我们只要对底层原理有个概念就可以
就是说我们只要对着这样一个超级庞大的地址表,去查找我们要的功能在哪个地址,然后修改对应地址的值,就可以控制单片机,这是最底层的地址位操作
位操作过于反人类了,一个单片机有上万个寄存器,我们随便做点事情都要操作其中上百个 所以单片机厂商给所有的寄存器都起了名字,然后他们写一个底层文件把寄存器的名字和地址对应起来,我们的代码就可以从0x4001000 |= 3 变成 GPIOA -> ODR |= 3 (随便举个例子) 形如后者的我们称之为寄存器操作,变得更加简单直观了,而且移植性也更好,对于不同的芯片只要更换底层的寄存器定义文件,逻辑部分代码就可以直接移植
如果操作寄存器还不够简单,单片机厂家还给我们封装了库,如果基于库开发 设置PA1为高电平就可以从GPIOA -> IDR |= 1变成GPIO_SetBits(GPIOA,GPIO_Pin_1) 这样代码就更加直观了,我们现在最常用的也是这种操作,称为库函数
|