单片机编程,想象你是CPU,你面对的,是内存,你要操作的对象,就是内存。
Cpu和内存
内存就像是一排一排的按键,每个按键有按下去和弹起来两种状态,按下去相当于1,弹起来相当于0,Cpu,就是操作这些按键的你,同时,也可以读按键的状态。
按键是每8个分成一组,每次操作必须整组操作,一个按键称为1Bit,一组按键称为1Byte。
Cpu分为8位的,16位的,32位的,8位表示它一次只能操作一组按钮,1Byte,16位表示一次可以操作两组按钮,2Byte,Stm32的Cpu是32位的,可以一次性操作4Byte,也就是32Bit。
C语言符号和操作
- *(addr) 寻址
Cpu定位每一组按钮的方式是寻址,就是根据地址找到它,地址是一个整数,也就是这一组按钮的编号。
*(0x20002000) //表示找到位于0x20002000地址的那组按钮
- (unsigned char)、(unsigned short)、(unsigned int)强制类型转换
数据类型,就是对内存的包装,把几组连续的按键包装起来,当成一组不一样的按钮。
强制类型转换,可以理解为这个包装。
(unsigned int)*(0x20002000)
表示先找到位于0x20002000那组按钮,然后把这组按钮连同它后面的三组按钮一起包装,作为一个32Bit的无符号整型。
- = 赋值
相当于动手操作按钮。
(unsigned int)*(0x20002000)=3;
3就是2进制11,把它扩展到32位:
00000000 00000000 00000000 00000011
每一位对应一个按钮,每一组对应一组按钮,相当于前三组按钮都弹起来,后一组的最后两个按下去。
- = 读取
获取按钮的状态。
int a;
a=(unsigned int)*(0x20002000);
先准备一个容器a,找到位于0x20002000的那组按键,把它连同它后面3组按钮一起包装为一个无符号整形,然后获取它的状态,存放到容器a里面。
Stm32内存结构
这是Stm32L476的内存图,先简单介绍三个部分:
- 0x20000000到0x40000000,SRAM1。
就是最常用的内存,做计算,临时储存这些都是在这块区域,而且经常是编译器分配的,不需要自己指定。
int a;
这句会划定一小块内存,包装为一个int类型,它的位置是编译器分配的,不过可以基本确定它位于SRAM范围内。
- 0x40000000到0x60000000,是外设区域。
GPIO、USART、ADC、TIMER这些都是外设,操作外设,其实就是操作外设对应的内存,也就是前面比喻的那些按键。
也就是说,操作外设,就是,读或写,这一段内存区域,具体哪个地址对应哪个外设,可以从寄存器手册查到。
这张图片是串口的一个寄存器,参考手册里会说明每一个Bit的作用。
- 0x60000000以后,是扩展地址。
也就是暂时没有实际的内存,只有个地址,需要芯片外面加东西才有的,可以灵活组合的。比如,可以加一块SDRAM,就成了扩展内存。
寄存器手册的使用
获取寄存器手册可以去官网,搜关键字ST,进官网。
这个手册是用来查找的,不是用来顺着看的,请翻到目录:
找到自己需要操作的外设,对照手册编程。