本教程含有较多专业词汇,大部分时候,不完全理解并不影响继续往下阅读,大家只需要了解大致的概念即可。

什么是单片机?

单片机,就是把中央处理器CPU、存储器、等计算机的功能部件,和定时器、I/0(输入输出接口)、串口等外设集成在一块集成电路芯片上的微型计算机。

单片机的特点:

1.体积小,集成度高,电源功耗低

2.控制功能强,易拓展外设

3.价格便宜,性价比高

STM32是意法半导体(ST)推出一款32位的单片机。STM32具有超低的价格、超多的外设、丰富的型号、优异的实时性、极低的开发成本等优势。

既然大家已经了解单片机了(bushi) ,那我们就一起走进STM32的世界吧!

如下图,是STM32的系统结构原理图,是不是一脸懵,那就别看下面这个先

STM32单片机基础架构 stm32单片机简介_初始化

让我们简化并翻译一下:

STM32单片机基础架构 stm32单片机简介_STM32单片机基础架构_02

各部分功能如下:

  1. CPU:包含运算器,控制器及若干寄存器,是单片机的控制和指挥中心。
  2. ROM(STM32中称为FLASH):用于存放程序和数据,为只读储存器。更改(擦除)和写入程序都较为麻烦,需要遵守FLASH相关的协议。可以认为是计算机的硬盘。
  3. RAM(STM32中称为SRAM):用于存放运算的中间结果、数据暂存及数据缓冲等。可以随机读入或读出,读写速度快,读写方便;但是断电或复位会丢失数据。可以认为是计算机的内存。
  4. 总线矩阵:总线矩阵用于主控总线之间的访问仲裁管理,提高了各部件交流的效率。
  5. 寄存器:虽然图里面没有寄存器,但是后续会经常提到它。寄存器可以看成储存0和1的一个指定名字和功能的地址。如果我们要在某个引脚输出一个低电平,我们只要往相的引脚对应的寄存器写一个1,即可实现.
  6. GPIO:通用型输入输出(接口),意思是你可以随意使用它输出或输入0和1,甚至以115200次每秒的速度翻转或接收0和1。
  7. 注意:上面的所有东西,都集成在了单片机的芯片上,因此说单片机集成度高,是真的很高。

虽然大家大致了解了STM32单片机的结构,但肯定还不清楚自己将要如何操控这个精妙装置。接下来,让我们一起了解一个程序如何实现整个运算过程。

一. 假设一个客户需求

1. x=3   y=x+5 

2. 先计算出y的值,若y大于0则点亮位于GPIO_ PA0(也就是单片机上的A0接口)处的LED

看起来很简单,但这是了解单片机运行原理的一个非常重要的案例:

二. 配置初始化文件

什么?你说你想直接把代码写了跑起来?

单片机还在睡觉呢,或者他脑袋里还想着上一个程序。

你输入单片机的每一个程序,都必须要用很多很多的篇幅告诉它,脑干怎么指挥全身(各种CPU指令)、心脏该怎么跳动(配置时钟树)、血液该怎么流动(定义各种宏以方便数据传输),因为每次输入新程序进去都完全擦除ROM再重写,所以每个程序都必须包含初始化的内容。不然,它当场给你表演一个原地睡觉(卡死)。

配置初始化文件的方法有两种:

1. 基于STM32库函数的开发

STM32库函数的开发,可以避免大家对着数据手册查并操作各种寄存器,而是直接用库的函数来实现各种参数的初始化和功能。

如果你想点亮一个led。你需要准备好一个包含整个单片机初始化的内容的源代码,如下图所示(不用细看,我也也不熟)。

STM32单片机基础架构 stm32单片机简介_STM32单片机基础架构_03

然后再复制粘贴一个GPIO_init(初始化GPIO接口)的函数进去,然后再改成相应的序号。当然,如果你想启动串口、定时器、ADC等其他功能,也需要把相应的初始化代码块一个个塞进去,如下图所示(不用细看,不是重点)。

STM32单片机基础架构 stm32单片机简介_嵌入式硬件_04

(上图:GPIO,PB5和PE5的初始化代码块)

然后再在主函数中输入相应的代码(见下一节),我们的程序才能完成。

使用标准库开发有助于大家更了解底层的代码和寄存器的使用,可以保证基础更加的扎实。但是对新手来说不够友好。

2. 基于STM32Cubemx(下面那个蓝蓝的软件,你们的好帮手)的HAL库开发

如果按照上面的方法,那当我们遇到下面问题的时候,可能就有些棘手:

我们手上有STM32f103c8t6单片机的启动文件,但是此次项目要求我们用STM32f427IIH单片机,且要求你打开CAN1、CAN2、USART1、USART2、TIM23456、和十路的PWM,并按照需求配置参数。那我们可要忙的屁股着火螺旋起飞啰,而且不好检查参数是否正确。

因此,我们需要有更加高效、准确的方法:使用STM32Cubemx配置文件

打开STM32Cubemx,并经过操作,可以看到如下界面:

你可以直接生成相应芯片(此时为F427iih)的初始化和配置文件,非常的舒服。

接下来,直接用图形化界面即可设置好各种参数(可以跟着详细的文档做,一套做下来就能用了)

STM32单片机基础架构 stm32单片机简介_STM32单片机基础架构_05

(上图:左边为希望使用的功能,中间为功能的参数配置,右边为图形化的功能展示)

当然,我也是从萌新走过来的,第一次看到上图也很害怕,感觉自己根本驾驭不了这个恐怖的机器。

下图是做出遥控小车的STM32f103c8t6和引脚图(仅供参考)。是不是感觉不算特别复杂?

STM32单片机基础架构 stm32单片机简介_stm32_06

什么?看起来还复杂。那我们只能通过我们自己的努力,慢慢熟悉这个软件。我也尽我的力把教程写的有趣一点,让大家愿意跟着一步一步走,收获更多的知识。

跑题了,当我们按下这个按钮

STM32单片机基础架构 stm32单片机简介_STM32单片机基础架构_07

 我们就直接得到了一份结构规范的启动和初始化代码。(如下)

STM32单片机基础架构 stm32单片机简介_stm32_08

点几下鼠标,我们给单片机写的脑干、血液、心脏的程序就全部完成啦!

因此可以看出,STM32CubeMx是一个很便捷的图形化配置软件,可以快速配置、维护、修改工程。后续所有教程都将基于STM32Cubemx的开发。

三. 写代码

直接上干货

需求如下:

x=3   y=x+5

计算出y的值,若大于0则点亮位于GPIO_ PA0(也就是单片机上的A0接口)处的LED

代码是这个(基于HAL库编程)要写在主函数的无限循环中(为什么是无限循环呢,我们可以假设一个智能家居设备,即使你没按下按钮,他也会一直运行着,一直判断你是否按下按钮,或者监测一些其他的数据)

uint8_t x=3;      
uint8_t y=0;

while(1)
{
y=x+5;
if(y>0)
  GPIO_Writepin(GPIOA,GPIO_PIN_0,0);
}

代码很好读懂,定义x,y两个unsigned int类型的变量(HAL库有对数据类型单独进行宏定义,感兴趣的可以右击uint8_t并进入definition)

 然后做加法,然后判断,若y>0,输出低电平,电流从LED的正极流进PA0,LED点亮。

四. 编译代码

STM32是机器,他只听得懂机器语言(汇编语言),因此我们需要把我们上面写的给人看的代码变成汇编语言,大概是下面的效果(别细看 不考)

STM32单片机基础架构 stm32单片机简介_stm32_09

因此我们写完代码,要点一下编译按钮。

STM32单片机基础架构 stm32单片机简介_STM32单片机基础架构_10

此时的内容不只是程序,而更应该称为 指令。

五. 烧录代码

我们用专门的烧录器将代码直接烧写至单片机的FLASH内,即完成了代码的烧录。注:一般烧录后需要按一下复位的按钮单片机才会开始运行。

Keil这个软件等于说自带烧录的环境,只需要按照教程选好型号即可将编译好的代码烧录进单片机。

六. 代码如何变成现实(略微介绍一下微机原理,感兴趣可以看)

汇编语言的代码烧写至FLASH内。

复位单片机!

单片机开始运行!

PC(程序计数器)从零开始累加,执行以下循环

  1. 它数到n,FLASH里的n号指令被取出,拿去CPU执行。
  2. 指令会涉及到一个地址,某个数字住在内存的一个房间里,房间的号码叫做地址。这一步只会将地址送去地址寄存器,并解出住在那的数字。
  3. 那个数字被拿去CPU,进行计算,计算结果将以变量放在某处

这三步,每步的时间,在STM32f103c8t6单片机中,大约为一至两个机器周期,也就是10——40纳秒。

在第n=114514时,CPU收到指令,将一个1塞进一个叫GPIOA->BRR寄存器的某一位中

随着一个1塞进了那个位置,寄存器的电路所连接的一个三极管轰然导通,电流如泉涌一般沿着三极管导向了GND(可以理解为负极),如此,那个名为PA0的引脚变为了低电平,LED也随之点亮。

STM32单片机基础架构 stm32单片机简介_初始化_11

七. 总结

这就是我们如何点亮一个led的全过程,写的挺粗糙的。希望这篇教程能起到抛砖引玉的效果,让大家能通过此教程了解到单片机工作的原理,并有兴趣更进一步的深入学习,在之后的学习中事半功倍。

其他的教程,由于CSDN插入图片较为麻烦,因此我直接将生成的PDF文档放入免费的资源中,可以进入我的主页查找。

如下,包含IO、PWM控制舵机、电路搭建、电机控制的教程,代码和演示视频,都置于其中。


祝大家学业有成。