STM32F103系列芯片原理学习以及LED灯的点亮

一、STM32F103系列芯片的地址映射和寄存器映射原理

1、寄存器

寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
其实,寄存器就是存放东西的东西。存放数据的寄存器是最好理解的,如果你需要读取一个数据,直接到这个寄存器所在的地方来问问他,数据是多少就行了。问寄存器这个动作,叫做访问寄存器。不同的数据会存放在不同的寄存器,例如引脚PA2与PB8的高低电平数据(1或0)肯定放在不同的寄存器里,那么怎么区分不同的寄存器呢?通过地址,不同的寄存器有不同的地址。
指令、地址寄存器与数据寄存器类似,里边存放的都是0和1,毕竟单片机也只认识机器码,机器码都是0或1,只是特别的规定下,数据寄存器里面存放的0和1表示数据,指令寄存器里存放的表示指令。

2、寄存器映射

在存储器的区域单元中,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

3、地址映射

为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。

二、GPIO端口的初始化设置

1、什么是GPIO

GPIO(general porpose intput output):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。
STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如型号为 STM32F103VET6 型号芯片有 GPIOA、GPIOB、GPIOC至 GPIOE共 5组 GPIO,芯片一共 100个引脚,其中 GPIO就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能。
最基本的输出功能是由 STM32 控制引脚输出高、低电平,实现开关控制,如把 GPIO引脚接入到 LED灯,那就可以控制 LED灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断。
最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过电平高低区分按键是否被按下。

2、GPIO端口初始化步骤

使能GPIOx口的时钟。
指明GPIOx口的哪一位,这一位的速度大小以及模式。
调用GPIOx初始化函数进行初始化。
调用GPIO-SetBits函数,进行相应位的置位。

3、GPIO的工作模式

GPIO的八种工作模式:输入输出是相对于CPU,四种输入、四种输出模式以及四种输出最大速度。
输入:外部数据输入到开发板
输出:开发板的数据输出到外部设备
1、GPIO_Mode_AIN模拟输入(将IO口作为模拟输入接口。输入的可能是变化的值,接受外部的模拟信息输入)
2、GPIO_Mode_IN_FLOATING 浮空输入(复位上电的时候,引脚不确定电平的高低)
3、GPIO_Mode_IPD 下拉输入(将IO口作为通用输入接口,只能输入0或1,强制下拉,一般是为了输入强低电平)
4、GPIO_Mode_IPU 上拉输入(将IO口作为通用输入接口,只能输入0或1,强制上位,一般是为了输入强高电平)
5、GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)(要得到高电平状态需要上拉电阻才行,可以作为电流型驱动)
6、GPIO_Mode_AF_OD 开漏复用输出(带上拉或者下拉) 复用功能,不只是单纯的作为输入输出,可以作为其他功能的引脚:串口、12C、SPI、要得到高电平状态需要上拉电阻才行
7、GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)IO输出0接GND,IO输出1接VCC,读输入值是未知的,输出0就一定是0.输出1就一定是1
8、GPIO_Mode_AF_PP 推挽复用输出(带上拉或者下拉)复用功能,不只是单纯的作为输入输出,可以作为其他功能的引脚:串口、12C、SPI。输出0就一定是0,输出1就一定是1
GPIO四种最大输出速度:2MHZ、25MHZ、50MHZ、100MHZ

三、点亮LED流水灯

1、打开GPIO口的时钟

时钟控制名字叫做RCC,属于AHB总线。GPIOB属于APB2。
时钟的地址
在这里插入图片描述
GPIO的地址:GPIO是属于APB2的
在这里插入图片描述
外设时钟使能寄存器,设偏移量为0x18,起始地址0x4002 1000,该寄存器地址为0x4002 1018
在这里插入图片描述
打开三个IO口的时钟需要将三个位都置1:

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

// 打开时钟
RCC_APB2ENR |= (1<<3);  // 打开 GPIOB 时钟
RCC_APB2ENR |= (1<<4);  // 打开 GPIOC 时钟
RCC_APB2ENR |= (1<<2);  // 打开 GPIOA 时钟


2、初始化GPIO口

GPIO的CRL、CRH、CNF和MODE的关系:
STM32的CRL控制着每个IO端口的位占用CRL的4个位,高两位为CNF、低两位为MODE,CRH的作用和CRL完全一样,只是CRL控制的书是低8位输出口,而CRH控制的是高8位输出口。

① 端口配置低寄存器(GPIOx_CRL) (x=A…E)

结合下图来说明,低位寄存器是用来配置GPIO0到GPIO7的,A~E共5组GPIO,相对应的可以知道高位寄存器则用来配置A ~ E组寄存器的GPIO8到GPIO15;可以发现,每一个GPIO引脚由4个比特位控制,其中第2位是MODE,用来配置该GPIO是输入还是输出模式,如果是输出,对应引脚输出的最大速度;其中的高2位是CNF,用来配置引脚输入/输出时的具体功能模式,不同应用需求对应不同的模式设置。
在这里插入图片描述
② 端口配置高寄存器(GPIOx_CRH) (x=A…E)

同上面的低位配置寄存器一样,只不过高位配置寄存器是用来配置GPIO8~GPIO15的;要知道,一般配置一个GPIO的输入输出模式时,先配置MODE,确定引脚是用来输入还是输出,其次再配置CNF来设置具体的工作模式
在这里插入图片描述
这里使用推挽输出,并设置最大速度为10MHz,则将控制A0的四个位设置为0001:
在这里插入图片描述

#define GPIOA_CRL (*(unsigned int *)0x40010800)

// 最后四位变为0001
GPIOA_CRL |= (1<<0);  // 最后一位变1
GPIOA_CRL &= ~(0xE<<0);  // 倒数2、3、4位变0


补充

1.总线基地址
在这里插入图片描述
2、外设基地址
在这里插入图片描述
3、外设寄存器地址
在这里插入图片描述
对于GPIOB的B9、GPIOC的C15、GPIOA的A4,设置如下:

#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值