初见STM32(一):点亮LED之寄存器操作

初见STM32(一):点亮LED之寄存器操作

这是STM32学习笔记的第一篇

在经过学习51的一段时间之后,现在要开始接触更为高级的单片机——STM32。作为拿到板子后的初见学习笔记,这几篇会倾向于从51过渡到32,且会啰嗦一点。

开始学习之前,你手上需要准备好以下三样物品:STM32单片机、STM32原理图、STM32的中文参考手册。
需要文件的同学可以在文末处的链接下载

我使用的板子是STM32F103ZET6正点原子精英版

毋庸置疑,作为一个学习单片机的初学者,在拿到板子后要学的第一件事情,那肯定是想尽方法,使用各种骚操作点亮板子上的LED灯,那么现在,就让我们开始吧。

一、STM32的系统构架

首先我们要知道,STM32是一款外设特别多的单片机,它有一条系统总线,在总线下面挂载两座桥,,桥下面又有一些外设,具体如图:
初见STM32(一):点亮LED之寄存器操作_第1张图片
可以看到,在51学到的I/O口,在32中就挂载在APB2下面,我们要做的就是进入APB2,操作LED对应的GPIO,来点亮我们的LED。

这里可能有人会有疑问,为什么51单片机不需要设置总线,就可以直接操作GPIO,而32需要进入这不知道什么鬼的总线,再进入不知道什么鬼的APB2,才能进行操作?

(因为我也是在学习当中,所以我只能尽我所能地,简单地解释一下,有错误就指出来啊)

原因如下:STM32有一个特点,就是有特别多的引脚,从而可以搭载特别多的外设,外设多的原因,使得它工作耗能多,因此通过将不同的外设划分开来,在需要时再进入对应的区域,这样能减少单片机的耗能,因此在操作前,我们都需要“进入”这样一个操作,我们也称之为 使能时钟

二、GPIO的具体操作

在了解了STM32的基础架构后,我们就可以开始操作GPIO来点亮我们的灯啦!

我们要做的就是:

  1. 查看LED的硬件连接图;
  2. 进入挂载着GPIO的APB2,也就是使能它;
  3. 配置GPIO的模式;
  4. 控制对应端口引脚的电平;
  5. 下载程序调试。

第2步到第4步,我们又称之为初始化,在这里就是LED的初始化啦。

现在开始我们的表演。

  • 第一步:查看原理图

我的板子上的LED,有两个,分别是LED0–连接PB5,LED1–连接PE5,并且接的是上拉电阻,默认高电平。

  • 第二步:使能APB2下对应的GPIO时钟

问题来了,我们要怎么使能它?
翻开中文参考手册7.3.7小节,找到时钟使能寄存器RCC,再找到APB2外设时钟使能寄存器,如图:
初见STM32(一):点亮LED之寄存器操作_第2张图片
可以看到在低16位里,有GPIO对应的A~E端口使能位,我需要使能GPIOB和GPIOE,也就是位3和位6置1。

对应代码为:

RCC->APB2ENR |= 0x0008;31
RCC->APB2ENR |= 0x0020;61
  • 第三步:配置I/O模式

I/O模式?这又是什么东西?之前学51没学过呀?没关系,我们一起来学。

翻开中文参考手册8.1.7和8.1.8小节,我们可以查看GPIO的输入输出配置。
初见STM32(一):点亮LED之寄存器操作_第3张图片初见STM32(一):点亮LED之寄存器操作_第4张图片
再翻到8.2.1小节,查看对应的配置寄存器,因为我配置的都是Pin5,属于低十六位,所以选择配置低寄存器CRL就可以,如图:
初见STM32(一):点亮LED之寄存器操作_第5张图片
在寄存器中,四个位为一个字节,一个字节为一个引脚。

那么Pin5就是第20~23位。

我们简单地设置一下,选择PB5和PE5为通用推挽输出,最大速度50Mhz。
也就是位23、位22为00,位21、位20为11。换算十六进制就是3。

对应代码为:

设置PB5
GPIOB->CRL &= 0xff0fffff;     先清零对应的字节位
GPIOB->CRL |= 0x00300000;    设置通用推挽输出,最大速度50Mhz

设置PE5
GPIOE->CRL &= 0xff0fffff;
GPIOE->CRL |= 0x00300000;

这里会有两个疑问:为什么赋值使用&=还有 |=?为什么要先清零再赋值?

在单片机的程序编写中,赋值会经常使用与运算和或运算,这是因为我们不能直接对寄存器进行按位编写,只能直接给寄存器赋值,为了在赋值的时候,保护其他位的数据,我们会使用与运算和或运算。

而与运算会经常使用在清零当中,通常我们会使用0xff0fffff这样含有0和f的值来与运算,从而达到与运算后,对应位清零,其他位不变的操作。

而或运算经常使用在除了清零以外的赋值当中,通常我们会使用0x00300000这样的值来或运算运算,从而达到或运算后,对应位赋值,其他位不变的操作。

而在赋值之前,我们会先清零,这是因为如果不清零,单片机可能会保存上次遗留下来的值,从而在程序启动时影响到其他位,所以我们会习惯性地进行清零。

  • 第四步:配置电平,点亮LED

因为我的LED默认高电平,也就是说我只要给一个低电平,那么就可以点亮它了,那么问题又来了,怎么操作寄存器来给一个低电平呢?

翻开中文参考手册8.2.4到8.2.6小节,发现有输出数据寄存器ODR、设置/清除寄存器BSRR和清除寄存器BRR。
那就意味着我们有两种装逼点灯的方法,分别是 ①直接操控ODR给予高低电平,或者是 ②BSRR给高电平,BRR给低电平。

两种的对应代码分别如下:

GPIOB->ODR |= 0x0020;			PB5  低电平
GPIOE->ODR |= 0x0020;			PE5  低电平

GPIOB->BRR |= 0x0020;
GPIOE->BRR |= 0x0020;

在手册中,我们可以看到,其中BSRR和BRR最后操作的也是ODR,所以一般直接操控ODR寄存器就可以了。
初见STM32(一):点亮LED之寄存器操作_第6张图片

  • 最后一步:开始装逼下载程序调试
三、小结

至此,我们成功地点亮了手中那小小但意义非凡的灯,学习单片机,最难的就莫过于点亮LED。点亮LED,点亮你我未来(滑稽脸)。

再复习一下怎么点亮LED:

  1. 使能对应GPIO的时钟;
  2. 初始化对应GPIO,配置模式速度;
  3. 给予高or低电平。

小结一下:

  1. 我们虽然学习的只是把灯点亮,但事实上我们已经是在操作GPIO的输入输出了,这意味着你已经学会GPIO的基本操作了;
  2. 通过使用寄存器来点亮LED,我们学会了翻手册查询如何操作寄存器,如何赋值清零。

ps:在代码中出现了譬如GPIOE->ODR这样的许多代码,这些具体会在以后的笔记展开。

精英版STM32原理图、STM32中文参考手册下载链接:
STM32中文参考手册及精英版原理图

最后的最后:有错误一定要帮我指出,谢谢 :)

一起加油。

你可能感兴趣的:(STM32)