天数:第一天
总内容:6400min
进度(剩余):5900min
跟:野火
今日学习总结:
大纲
一、认识到什么是stm32
二、什么是寄存器
三、寄存器怎么用
四、如何使用寄存器打开GPIO口(时钟,输出模式,输出电平)
五、使用结构体写库
正文
一、认识到什么是stm32
stm32的内核和外设之间的关系:(示意图)
他们之间使用总线连接
就像水库&水管&水龙头
调用水龙头(假设GPIO)就要先唤醒水管(假设APB2)而唤醒水管需要定个出水的水压和(APB2对应GPIO的时钟频率)
根据该图表,找到需要的外设,向(上)寻找:
例如:如果我要使用GPIOB口时:注意到GPIOB,是在APB2总线上的,因此要打开APB2时钟寄存器中的GPIOB的时钟
如下图中的IOPB的寄存器位置,将其打开。
二:什么是寄存器
? ? ? ? 每一个设备的操作地址是连续且统一在一个内存上的
就像一根梦龙,最低端的是巧克力,中间是奶油膏,最上头是果酱,连续且统一在一根冰棍上
将一串连续且已知大小和类型的地址伏寄存在一个名字上,该名字称为寄存器
? ? ? ?映射
存储器映射:
? ? ? ? ? ? ? ? 给一堆存储单元分配地址
寄存器映射
? ? ? ? ? ? ? ? ?寄存器映射指的是把地址,强制转换成一个指针常量,常量定义为一个名字
如:(将GPIOB_BASE的地址,强制转换猴,分给一个[GPIO_TypeDef]类型的结构体,作为结构体指针的值)
#define GPIOB ((GPIO_TypeDef *)GPIOB_BASE)
三:?寄存器怎么用
类似于第一点
通过需求——外设——寄存器——读寄存器编写原则——通过置位和清零的操作对寄存器进行操作。
置位/清零
置位: |=((1)<<(3))//则将0001,按位左移三位,则变成:0100再通过按位或操作,使不改变其他位为前提下,使该位置位1
清零:&=~((1)<<(3))//将0001,按位左移三位,则变成:0100通过按位与的操作,使其他位不改变的前提下,使该位置置0
?
四:如何使用寄存器打开GPIO口(时钟,输出模式,输出电平)
零、(并找到GPIOx的基地址,再通过不同寄存器的偏移值,算出位的地址进行置位/清零)
一、找到GPIOx的对应哪一条总线
二、打开该总线对应的GPIO时钟()
三、通过寄存器CRL/CRH,配置相应的GPIO口设置(模式,速度等)
四、通过寄存器ODR对GPIOx所对应的(电平值)
五:使用结构体写库
因为很多寄存器中的地址是连起来的
所以利用到开辟结构体变量的时候,根据顺序和大小开辟变量的原则
可以按顺序编写成员变量在某个寄存器的结构体类型
在使用的时候根据需求,将某个结构体变量指针指向所需的基地址,则其他地址自动寻到
如
typedef (unsigned int) uint32_t ;
//将32位无符号int定义为unint32_t
typedef struct
{
unint32_t xxx;
unint32_t xxx;
unint32_t xxx;
unint32_t xxx;
}GPIO_ODR;
GPIO_ODR* GPIOB = (GPIO_ODR*)GPIOB_BASE;
//定义出这个结构体的指针,并指向该GPIOB_BASE地址
GPIOB.xxx = xxxxxx
//根据结构体设置
|