开始学习之前,你手上需要准备好以下三样物品:STM32单片机、STM32原理图、STM32的中文参考手册。
需要文件的同学可以在文末处的链接下载
毋庸置疑,作为一个学习单片机的初学者,在拿到板子后要学的第一件事情,那肯定是想尽方法,使用各种骚操作点亮板子上的LED灯,那么现在,就让我们开始吧。
首先我们要知道,STM32是一款外设特别多的单片机,它有一条系统总线,在总线下面挂载两座桥,,桥下面又有一些外设,具体如图:
可以看到,在51学到的I/O口,在32中就挂载在APB2下面,我们要做的就是进入APB2,操作LED对应的GPIO,来点亮我们的LED。
这里可能有人会有疑问,为什么51单片机不需要设置总线,就可以直接操作GPIO,而32需要进入这不知道什么鬼的总线,再进入不知道什么鬼的APB2,才能进行操作?
(因为我也是在学习当中,所以我只能尽我所能地,简单地解释一下,有错误就指出来啊)
原因如下:STM32有一个特点,就是有特别多的引脚,从而可以搭载特别多的外设,外设多的原因,使得它工作耗能多,因此通过将不同的外设划分开来,在需要时再进入对应的区域,这样能减少单片机的耗能,因此在操作前,我们都需要“进入”这样一个操作,我们也称之为 使能时钟。
在了解了STM32的基础架构后,我们就可以开始操作GPIO来点亮我们的灯啦!
我们要做的就是:
第2步到第4步,我们又称之为初始化,在这里就是LED的初始化啦。
现在开始我们的表演。
我的板子上的LED,有两个,分别是LED0–连接PB5,LED1–连接PE5,并且接的是上拉电阻,默认高电平。
问题来了,我们要怎么使能它?
翻开中文参考手册7.3.7小节,找到时钟使能寄存器RCC,再找到APB2外设时钟使能寄存器,如图:
可以看到在低16位里,有GPIO对应的A~E端口使能位,我需要使能GPIOB和GPIOE,也就是位3和位6置1。
对应代码为:
RCC->APB2ENR |= 0x0008; 位3置1
RCC->APB2ENR |= 0x0020; 位6置1
I/O模式?这又是什么东西?之前学51没学过呀?没关系,我们一起来学。
翻开中文参考手册8.1.7和8.1.8小节,我们可以查看GPIO的输入输出配置。
再翻到8.2.1小节,查看对应的配置寄存器,因为我配置的都是Pin5,属于低十六位,所以选择配置低寄存器CRL就可以,如图:
在寄存器中,四个位为一个字节,一个字节为一个引脚。
那么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默认高电平,也就是说我只要给一个低电平,那么就可以点亮它了,那么问题又来了,怎么操作寄存器来给一个低电平呢?
翻开中文参考手册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寄存器就可以了。
至此,我们成功地点亮了手中那小小但意义非凡的灯,学习单片机,最难的就莫过于点亮LED。点亮LED,点亮你我未来(滑稽脸)。
再复习一下怎么点亮LED:
小结一下:
ps:在代码中出现了譬如GPIOE->ODR这样的许多代码,这些具体会在以后的笔记展开。
精英版STM32原理图、STM32中文参考手册下载链接:
STM32中文参考手册及精英版原理图
最后的最后:有错误一定要帮我指出,谢谢 :)
一起加油。