1. 前言

STM32目前市面上使用比较广泛,资料多,接下来就介绍如何快速入门STM32,进行基础开发。
这篇文章是STM32F103系列文章的第一篇,主要介绍开发环境的搭建、编程思路、如何查看原理图、配置时钟,配置GPIO口模式等等。

下面文字是来至STM32中文手册,对STM32系列做了详细的介绍:

STM32是一个微控制器产品系列的总称,目前这个系列中已经包含了多个子系列,分别是: STM32小容

量产品、 STM32中容量产品、 STM32大容量产品和STM32互联型产品;按照功能上的划分,又可分为

STM32F101xx、 STM32F102xx和STM32F103xx系列;

● 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、 STM32F102xx和

STM32F103xx微控制器。

● 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、 STM32F102xx

和STM32F103xx微控制器。

● 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx

微控制器。

● 互联型产品是STM32F105xx和STM32F107xx微控制器。

整体来说,STM32F10x系列里所有型号芯片大多数功能模块都是相同,主要是区别还是:引脚数量不一样,FLASH闪存、RAM空间大小不一样,还有就是功能模块的数量不一样。 配置高的芯片,引脚多,功能模块多。
配置低的型号,引脚自然就少,功能模块就少。 但是只要有这个功能模块,所有型号的代码都是一样的编写方式。所以,STM32F10x系列里所有型号代码都是通用的

目前STM32开发方式主要由3种:寄存器、标准库、HAL 库。 其中HAL 库是目前意法半导体主推的开发方式,有 STM32CubeMx软件加持,可以一键生成keil工程,图形化编程非常方便,资源网上也有很多。
当前这个系列文章的STM32开发主要是选择寄存器方式开发,寄存器开发优点是: 代码较少、整体比较精简,运行效率较高。但是学习成本、入门成本、调试难度比HAL 库要难一些,因为使用寄存器开发,需要不断的看芯片手册,了解寄存器每个位的详细功能,需要对芯片寄存器非常熟悉。但是寄存器开发相对比较通用,所有的芯片都支持寄存器开发,了解寄存器开发之后,对优化库函数、HAL库的效率、对其他芯片编程、入门Linux驱动开发、了解硬件等都有一定的帮助。

2. 开发前准备

入门STM32开发,首先需要准备一块开发板,拿到开发板的原理图、下载STM32的中文参考手册,下载一个串口下载软件、准备一台windows电脑安装keil5软件。
开发板淘宝很多,推荐买:搭载STM32F103ZET6芯片的板子,可以买系统板也可以买开发板,系统板的板载资源少,引脚都引出来的,可以自己买模块扩展;开发板板载资源较多,引脚基本也是引出来的,板子的价格比较贵,购买可以参考正点原子、野火等一些厂家的板子。 一般购买板子之后,都有配套的资料包:原理图、手册都有了。
STM32支持st-link、jlink、串口等多种下载方式,其中成本比较低的就是串口下载,不需要购买额外的硬件,生成hex文件之后,通过串口下载到开发板运行,如果hex文件较大,下载速度比较慢。如果资金允许,购买st-link、jlink下载更加快,调试更加方便。
keil软件最新版可以在这里下载:http://www.myir-tech.com/download.asp?nclassid=108&anclassid=71

STM32F103系列开发_点亮LED灯_寄存器

下载后,根据提示,一直点击next即可。软件安装在英文目录下,防止出现一些不必要的麻烦。

3. 点亮LED灯

准备工作就绪之后,下面就入门STM32,点亮LED灯。
拿到开发板先看一下LED原理图,找到LED的硬件接线位置。

STM32F103系列开发_点亮LED灯_寄存器_02关于keil软件如何新建STM32工程的文章之前是写过的,详细步骤看这里: https://blog.csdn.net/xiaolong1126626497/article/details/119879328

点亮LED灯,需要控制STM32的GPIO口输出指定的电平,STM32GPIO口编程步骤分为:

  1. 开时钟
  2. 配置GPIO口模式
  3. 控制GPIO口输出

中文参考手册里的第6章和第8章分别介绍了时钟寄存器和GPIO口配置寄存器,主要看这两章节即可。

STM32F103系列开发_点亮LED灯_寄存器_03STM32F103系列开发_点亮LED灯_寄存器_04

GPIO口模式配置寄存器有两个:CRL和CRH,一个IO口由4个二进制位表示,STM32是32位的MCU,一个寄存器是32位,GPIO口分为GPIOA,GPIOB,GPIOC等很多组,每一组的GPIO口的数量是16个。所以要配置一组GPIO口的模式需要64个二进制位,所以就分成了两个寄存器来表示。 CRL配置07的GPIO口,CRH就配置815的IO口。

如果GPIO口作为普通的输出,一般配置位置推挽输出,如果作为按键这种输入检测硬件,一般配置为上下拉输入。如果需要使用GPIO口内置的功能输出,就配置为复用功能推挽输出。

配置LED灯对应的GPIO口示例代码:

/*
函数功能: LED初始化
硬件连接: PB6 PB7 PB8 PB9
特性: 低电平点亮
*/
void LED_Init(void)
{
//开时钟
RCC->APB2ENR|=1<<3;
//配置GPIO口
GPIOB->CRL&=0x00FFFFFF;
GPIOB->CRL|=0x22000000;
GPIOB->CRH&=0xFFFFFF00;
GPIOB->CRH|=0x00000022;
//上拉
GPIOB->ODR|=1<<6;
GPIOB->ODR|=1<<7;
GPIOB->ODR|=1<<8;
GPIOB->ODR|=1<<9;
}