STM32是什么样的
丝印:明显的STM32F103ZET6
下面的是产地、批号等
可以在左下角看到一个小圆点,从此开始按逆时针顺序就是1~144的脚位。
芯片里面有什么
这个图是真的复杂,看不懂,学完之后再来会会它。
ICode总线
ICode中的I表示Instruction,即指令,我们写好的程序编译之后都是一条条指令存放在FLASH中,内核要读取这些指令来执行程序就必须通过ICode总线,它几乎每时每刻都需要被使用,它是专门用来取指令的。
Dcode总线
DCode中的D表示Data,即数据,这条总线是用来取数据的。我们在写程序的时候,数据有常量和变量两种,变量就是固定不变的,用C语言中的const关键字修饰,是放到内部的FLASH当中的,变量是可变的,不管是全局变量还是局部变量都放在内部的SRAM。因为数据可以被DCode总线和DMA总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
系统总线
系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的
存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或者用户分配,给存储器分配地址的过程就称为存储器映射
给存储器分配地址的过程叫存储器映射,再分配一个地址叫重映射。
寄存器映射
给有特定功能的内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
Q:如何让GPIO的16个端口全部输出高电平?
1、在STM32中文参考手册中找到2.3存储器映像,在这里找到GPIOB的初始地址0x40010c00。
2、在STM32中文参考手册中找到8.2.4端口输出数据寄存器(GPIOx_ODR)
它的地址偏移是0xc0所以GPIOB_ODR的初始地址就是0x40010c0c
3、*(unsigned int*)(0x40010c0c)=0xffff
解释:
(unsigned int*)(0x40010c0c)
将(0x40010c0c)强制转换为一个unsigned int的指针;
*(unsigned int*)(0x40010c0c)
是取得这个指针指向的位置的值;
*(unsigned int*)(0x40010c0c)=0xffff
则是将这个指针指向的值赋值0xffff,即16位全是高位。
变1:
#define GPIOB_ODR (unsigned int*)(0x40010c0c)
*GPIOB_ODR =0xffff;
变2:
#define GPIOB_ODR *(unsigned int*)(0x40010c0c)
GPIOB_ODR =0xffff;
变3:
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOB_ODR *(unsignedint*)(GPIOB_BASE+0x0C)
// PB0输出输出低电平
GPIOB_ODR &= ~(1<<0);
// PB0输出输出高电平
GPIOB_ODR |= (1<<0);
变4: