序言
学习STM32已经半年有余了,虽谈不上有多少经验,倒也开发过两个小玩意,积攒了一些心得。这里写出来,算是为一个多月不碰单片机的自己提供一些复习的契机,也是为了抛砖引玉,广泛接受大家的意见,纠正自己的一些错误和不良习惯。
又到电赛大年,你或许已经跃跃欲试,学好STM32,必定能让我们的竞赛道路更加顺利。
本文主要面向的读者是那些想要学习STM32,有一些C编程基础和/或单片机开发基础的朋友(比如电信科协只学过一些Arduino的后辈们),当然,也包括那些迫不及待想要指出我的问题甚至是想线下指着我的鼻子批判的巨佬。
撒,让我们开始吧!
STM32是什么
STM32:意法半导体公司出品的一系列使用Cortex-M系列ARM处理器的32位微控制器(MCU),有F1, F4, F7, L1, H7等常用的产品线,它们有不同的硬件配置和不太一样的编程细节。笔记中以F4为主F1为辅讲解。
关于硬件选购的问题
我们常听到“开发板”、“最小系统”等等概念,并常常把它们和单片机混为一谈,其实真正的STM32单片机是黑色封装的芯片,不包含外围电路,但需要配合各种外围电路发挥功能。最重要的是电源、启动线,复位线和复位开关,和两个时钟输入(HSE和LSE)晶振,开发过程中还需要诸如JTAG和SWDIO通信接口,用于程序的刷入和调试。将含有这些功能的电路和MCU芯片放在一块电路板上的东西叫做最小系统板,一些商家为了方便初学者,除了加工这些电路外,还在板子上搭载了各种板上外设,比如屏幕LED摄像头传感器等等,初学者可以直接编程使用这些外设,减少了硬件连接的麻烦,这种板子叫做“开发板”(常常价格不菲QWQ)。
学习时,可以单独使用开发板学习,也可以用最小系统板配合各种模块和面包板学习,效果基本一样,且使用最小系统配合模块能更大程度地提升你的硬件连接和英文阅读能力并且能锻炼不畏挫折的宝贵品质(
在电子竞赛中,我们常常用最小系统板配合各种模块进行设计,这样能很大程度上增加灵活性,节省成本,并且减小PCB设计的压力(让我交一块大几百的开发板做的作品,说实话我会心疼)。在真正的产品开发中,我们常使用裸芯片,焊接在自己设计的PCB上,配合自己设计的外围电路实现特定的功能,这样能更灵活地达到性能、成本、功耗等的平衡。
你需要仔细体会的概念——STM32的基本结构
.一切微控制器都包含CPU,存储器和外设以及通讯用的总线,STM32也不例外:它的制造过程,你可以理解为ST公司在从ARM家的CortexM处理器外围增加了自己家的总线和外设们。
CPU
即CortexM,ARM架构,32位寻址能力,F1和F4的主要区别,就在于这块ARM的微处理器型号,F1是M3,F4是M4,明显F4可以有更强的性能,且两者所能达到的最高工作频率也有区别。
存储器
包含SRAM和FLASH,如果你了解C语言的存储结构,可以这样理解:SRAM类似于内存,分配C程序的栈空间堆空间,FLASH类似于硬盘,存储C程序的代码段和各种其他数据。不同型号的FLASH大小不同,据此可以将产品分成“大容量”“中容量”“小容量”等类型。
总线
这里指MCU内部的总线,包括CPU与存储器连接的总线,到外设的总线等等。不同的总线有不同的时钟频率,这些频率由晶振等产生后系统时钟经过倍频和分频得到,它们是总线通信的“舵手”,决定了总线上各种器件的工作速度。这些在时钟那块会详细介绍;各种总线错综复杂地连接,形成所谓的“总线矩阵”,总线上的通信由CPU(和DMA控制器)控制。具体可以去读参考手册,不过你应该读不明白。
外设
外设:这里指MCU内部集成了的外设,它们通过各种总线与CPU连接(除去CORTEX自带的NVIC和Systick等总线以外大多数在APB和AHB总线上挂载),工作频率取决于总线频率(且必须有总线时钟信号输入才能工作)。按我的理解,这些外设大概可以分成:
- 系统相关,主要包括:GPIO:基本的输入输出控制器,用于控制、读取引脚的电平和配置引脚的其他功能 ;RCC:复位和时钟控制,主要用于设置复位和配置系统和各个总线的时钟频率(超10G警告#滑稽#);EXTI:检测GPIO上的 电平变化并给出中断(最常用于按键检测和交互) ;NVIC和Systick:这是两个CortexM系列CPU自带的(其他外设都是ST公司开发的而不是ARM开发的)外设,一个用于配置中断,一个用于产生基本的系统定时功能,常常在实时操作系统中使用;看门狗:本质可能是定时器,用于检测系统的超时,测量值溢出等异常状态,提高系统的可靠性
- 通信外设:包括你已经知道了一些的I2C,SPI,USART和你可能不清楚的SDIO,FSMC,DCMI,I2S等等,这些外设用于连接其他的控制器、计算机、模块、传感器、屏幕、存储器等等,常用于STM32与外界的通信和交互、存储的扩展等工作。
- 模拟相关外设:主要是ADC,模拟-数字转换器,将模拟量(电压信号)转换为数字值,说白了就是能把数据写进变量的电压探头;DAC,数字-模拟转换器,有些设备没有(用的也不多),可以将数字量(电压数据)变成模拟量(实际的电压值),说白了就是指定电压的生成器。这些常用于自动控制、通信和信号处理等,也必须熟练掌握。
- 定时器:包含基本、通用、高级、SYSTICK等,本质是计数器,每经过设定的时钟周期,其计数就递增或递减,进而通过监测计数的变化实现定时功能。通用和高级定时器还会有输出PWM波,测量方波频率和占空比等功能,常用于自动控制尤其是电机控制等领域;RTC定时器是特殊的定时器,它可以记录以秒为单位的时间,且由小小的纽扣电池供电,在MCU断电后继续工作,因此可以用来实现钟表的功能。
就这么多,总结下来,对STM32的开发就是根据需求设计好整个系统的功能后,设计好硬件电路,利用STM32的程序控制各种外设来与其他硬件通信、控制其他硬件或模块,进而实现特定功能的过程。你可能知道冯诺依曼计算机五元结构,STM32,乃至一切单片机都包含了控制器运算器(CPU)、存储器和一部分的输入设备和输出设备(外设)。
看晕了不要紧,这些东西都是长期开发经验的总结,日后的学习过程中,你对它们的理解会进一步加深的,现在知道个大概就够了。
拾遗
STM32的程序开发使用C语言(也可以用C++,不过我觉得你也用不好),学习STM32,一定要对计算机基础、基本的电路知识(高中水平加基尔霍夫和节点电压法和二极管三极管场效应管的定性原理就够)和C语言的所有基本知识,尤其是基本的顺序选择循环结构和运算,以及重要的指针、函数和结构体烂熟于心。(一个刚刚学过C的人学习STM32,可以更大程度地加深对C语言各种特性的认识,提高编程水平和编程的规范程度,进一步磨炼编程功底,因为单片机编程涉及的大量底层和位操作,正是C语言的优势所在)