资讯详情

STM32新手入门教程

文章目录

        • STM32简介
        • STM的选型
        • 编写程序
          • **Keil安装**
        • 烧写程序
          • 1. USB转串口烧写
          • 2. ST-Link烧写
        • ST-Link仿真
        • 点亮LED灯
          • GPIO简介
          • GPIO配置
          • GPIO电平输出
          • 程序编写
        • 闪烁LED灯
          • 程序编写
          • 实验结果

STM32简介

小马哥STM32四轴学习平台–DragonFly四轴STM32单片机软件入门级飞控算法课程

单片微型计算机简称单片机(MCU(MicrbControl Unit)),在我们自己的个人计算机中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片安装在主板上,构成我们PC主板,然后组装成电脑,而单片机只是把所有这些都集中在一个芯片上。单片机单片机,如51个单片机和16个单片机MSP430、32位的如STM32.通常我们说的是多少,通常指内核(CPU)数据宽度一次处理。也就是说,内核一次处理的位数越多,单片机的计算速度越快,性能越强。

STM32是意法半导体(ST)推出一款的单片机。STM32具有价格超低、外设超多、型号丰富、实时性优异、开发成本极低等优点。STM32产品线多样化,性价比高,使用方便方式,迅速在众多32位单片机中脱颖而出。

STM32芯片内部可粗略分为两部分: 。如果算机类比,内核和片上外设就像计算机一样CPU与主板、内存、显卡、硬盘有关。 ARM公司只设计核心而不生产芯片,并将核心技术授权给半导体制造商,如ST、TI、Atme1、NXP等待制造商。这些制造商都是基于这个核心设计自己的电影外设。SRAM、ROM、FLASH、USART、GPIO等待,然后集成到硅片上,这是我们现在使用的芯片。 芯片内部架构见图:

image-20201123192912952

芯片的内核和外设是由两家公司设计的,那么他们应该如何联系在一起进行合作和高效的工作呢?答案是总线。学习计算机组成原理的学生应该知道,计算机、控制器、存储器、输入设备和输出设备的五个组成部分之间的通信是通过总线。我们还说,单片机是一台集成在硅片上的计算机,所以它的内部连接关系也依赖于总线。 STM内部有11条总线:

众所周知,在嵌入式开发中,如51和Arduino,我们可以通过将程序烧成芯片来控制它。那么,我们写的程序如何控制我们的单片机工作,或者程序控制什么呢? 那是寄存器。事实上,无论我们使用仓库开发还是寄存器开发,我们本质上都在控制寄存器上每个位置的通断,这些寄存器都有其特定的功能。换句话说,每个外设(如GPI0、USART、I2C、SPI.…)都对应着寄存器来控制他。

所以

STM的选型

STM32是ST所有产品的总称,ST有两大家族STM8和STM32。STM8主要针对低成本低、主频要求低、操作速度要求低的低端市场。STM32主要用于对主频要求高、运算速度快、实时性好的中高端市场。STM32有很多产品可以分为主流MCU、高性能MCU、低功耗MCU。其中主流MCU如STM32F一系列,高性能MCU如STM32F4、STM32F7系列,低功耗MCU如STM32L0系列。此外,根据闪存容量、外设数量和包装尺寸,每个系列产品将分为多种类型,价格差异很大。

STM32型号说明:以STM32F103RBT以该型号的芯片为例,该型号由7个部分组成,其命名规则如下:

1 STM32 STM32代表ARM Cortex-M内核的32位微控制器
2 F F代表芯片子系列。
3 103 103代表增强系列。
4 R R其中T代表36脚,,R代表64脚,V代表100脚,,I代表176脚。
5 B B这个项目代表内嵌Flash其中6代表32K字节Flash,,B代表128K字节Flash,C代表256K字节Flash,D代表384K字节Flash,,G代表1M字节Flash。
6 T T这个代表包装,其中H代表BGA封装,,U代表VFQFPN封装。
7 6 6代表工作温度范围,其中,7代表-40——105℃。

我手里有一个开发板

用的是,芯片说明如下:

之后买了最小的系统板,搭载

编写程序

先下载keil软件(官网下载MDK5安装包):

注意:

所以

如果要设置C51和STM在32个开发环境中,一般需要准备以下文件:

资源链接: 百度网盘密码:d1cs

可参考此安装:STM32开发环境建设(Keil)

和MDK5.安装破解和安装stm32与C51支持包(附安装包)

其中pack文件是STM32芯片包可安装keil后下载(KEIL公司软件包托管网站)双击安装,也可以去keil的pack Installer安装。

安装路径的选择包括MDK核心组件()安装路径及外包()一般只选择安装路径 的安装路径, 路径将自动设置为 路径下的ARM/PACK

安装完成后,会自动弹出 如果没有,可以打开安装好的界面 在工具栏上找到软件 然后图标:

因为我们用的STM32型号为 ),所以展开STM系列产品的菜单栏,找到芯片设备,点击左边Packs中的三个组件, 会自动从网上下载最新版本的组件,下载进度在 底部状态栏显示。(由于我已经通过双击安装好了,所以是Up to date)

直接用Keil5新建工程(只能用Keil5快速新建工程)。

Project-> New,之后选择自己的开发板芯片:

确定之后又跳到运行环境的界面:

必选CMSIS的还有Device的

如果要连接外设必须勾选外设的时钟,一般再勾选上、和串口。

点击OK确定创建项目。项目创建完成后就是这样的:

可以看到已经包含了我们选择的库文件。如果还需要什么可以再点击图上的按钮再次打开运行环境配置页面。

之后可以右键点击左侧的资源管理器,管理一下项目目录,比如自定义名字。

然后添加文件:

之后就可以在main文件中写代码了。

写完可以编译一下,如果输出正确就表示环境配置没问题。

这里默认是不会创建Hex文件的,所以还需要进入设置里面去设置一下。

点击魔法棒:

进入设置界面

之后再编译就可以在Objects文件夹下面看到Hex文件。

烧写程序

1. USB转串口烧写

参考这个:如何使用串口来给STM32下载程序

不过具体还得看官方的开发板说明书。

2. ST-Link烧写

用stlink下载比USB转TTL稍快一些,而且ST-Link可以进行仿真,对于大型程序的调试非常有用。

安装使用可以参考这个:STM32 ST-LINK Utility介绍、下载、安装、使用方法

STLink 上 LED 指示灯用于提示当前的工作状态,具体情况如下:

  • LED 闪烁:STLink 已经连接至计算机。
  • LED 保持:计算机已经成功与 STLink 建立通信连接。
  • LED 交替闪烁:数据正在传输。
  • LED 保持:最后一次通信是成功的。
  • LED 为橘:最后一次通信失败。

下载程序说白了就是3步:

1.连接芯片:

或直接点击连接快捷按钮:

2.打开程序

打开hex文件可以从菜单栏()打开,也可以直接讲hex文件到FLASH区域:

3.下载程序

点击“”(可以Taraget -> Program,也可以直接点击下载快捷按钮,如下图):

弹出信息确认窗口,如hex文件路径、验证方式等,确认信息无误后点击“Start”开始下载程序。

出现“”,说明下载成功。

ST-Link仿真

ST-LINK是专门针对STM8和STM32系列芯片的仿真器。使用ST-Link调试器,可以直接在Keil环境下进行下载,而且还可以进行在线调试

参考自:STM32 Keil中关于stlink的调试 下载设置

首先进入设置界面。找到Debug ,选择stlink调试器,点击setting:

选择模式为SW模式,点击确定:

点击Utilities选项卡,先取消use debug driver ,然后再选择选择ST-Link Debugger,点击Settings:

首先先是要打勾,然后根据芯片flash的大小添加(Add)相应的信息,最后点击确定即可:

仿真的过程如下:

首先是重新编译整个项目:

点击仿真按钮:

进入仿真页面(以后面讲解的闪烁LED的程序为例):

具体的调试方法这里就不说了。毕竟也是新手,目前还用不到调试功能,只是出于好奇研究了一下相关配置。

想深入研究可以参考Keil系列教程09_调试仿真。

点亮LED灯

GPIO简介

参考自:【STM32开发】STM32 GPIO配置

GPI0是通用输入输出端口的简称,从名字上也可看出GPIO最基本的功能就输入和输出。它也是芯片内部与外部电路连接的唯一的接口,换句话说只要我们使用片上外设几乎都会与GPIO打交道。 GPI0基本功能是输入和输出,但是STM32本身就是一个很复杂的系统,内部外设繁多,那么GPIO的基本功能是肯定满足不了这么多外设的需求,芯片厂商为了解决此问题,将GPI0分为八种模式(输入4种+输出4种)。八种模式分别为:

  1. 输入浮空 GPIO_Mode_IN_FLOATING

  2. 输入上拉 GPIO_Mode_IPU

  3. 输入下拉 GPIO_Mode_IPD

  4. 模拟输入 GPIO_Mode_AIN

  5. 具有上拉或下拉功能的开漏输出 GPIO_Mode_Out_OD

  6. 具有上拉或下拉功能的推挽输出 GPIO_Mode_Out_PP

  7. 具有上拉或下拉功能的复用功能推挽 GPIO_Mode_AF_PP

  8. 具有上拉或下拉功能的复用功能开漏 GPIO_Mode_AF_OD

我的STM32开发板板载两个LED小灯,电路图如下:

GPIO配置

由于STM32的GPIO工作模式有8种,所以在GPIO输出之前要先对要操作的GPIO进行配置:

  • 定义GPIO的初始化结构体类型

  • 使能GPIO的时钟

  • 配置GPIO的引脚

  • 配置GPIO口的输出类型为推挽

  • 配置GPIO口的输出速度

  • 初始化GPIO(初始化相应的寄存器)

GPIO_InitTypeDef GPIO_InitStructure;  // 定义结构体变量
//打开PB口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//打开PE口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
//PB5,PE5引脚设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//设置输出速率50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//推挽输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//初始化外设GPIOx寄存器
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Init(GPIOE, &GPIO_InitStructure);

解释:

GPIO_InitTypeDef GPIO_InitStructure;

此结构体的定义是在stm32f10x_gpio.h文件中,其中包括3个成员。

typedef struct
{ 
        
  uint16_t GPIO_Pin;       
  GPIOSpeed_TypeDef GPIO_Speed;  
  GPIOMode_TypeDef GPIO_Mode;   
}GPIO_InitTypeDef;

(1)uint16_t GPIO_Pin;来指定GPIO的哪个或哪些引脚,取值参见stm32f10x_gpio.h头文件的宏定义。

(2)GPIOSpeed_TypeDef GPIO_Speed;GPIO的速度配置,此项的取值参见stm32f10x_gpio.h头文件GPIOSpeed_TypeDef枚举的定义,其中对应3个速度:10MHz、2MHz、50MHz;

(3)GPIOMode_TypeDef GPIO_Mode;为GPIO的工作模式配置,其取值参见stm32f10x_gpio头文件GPIOMode_TypeDef枚举的定义,即GPIO的8种工作模式。

ARM与C51单片机不同的是,不用外设的时候,如IO口、ADC、定时器等等,都是禁止时钟的,以达到节能的目的,只有要用到的外设,才开启它的时钟。

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

此函数是在stm32f10x_rcc.c文件中定义的。其中第一个参数指要打开哪一组GPIO的时钟,取值参见stm32f10x_rcc.h文件中的宏定义,第二个参数为打开或关闭使能,取值参见stm32f10x.h文件中的定义,其中ENABLE代表开启使能,DISABLE代表关闭使能。

这里包括引脚、速度和工作模式,取值可参考第一部分。

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef*  GPIO_InitStruct);

函数配置GPIO,此函数是在stm32f10x_gpio.c文件中定义的,其中第一个参数代表要配置哪组GPIO,取值参见stm32f10x.h文件中的定义,第二个参数是第1步定义的GPIO的初始化类型结构体。

GPIO电平输出

官方让GPIO输出高低电平的函数:

GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

函数就是置位GPIO,即让相应的GPIO输出高电平;

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

函数是让GPIO复位的,即让相应的GPIO输出低电平。

程序编写
# include "stm32f10x.h"

#define LED3_OFF GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define LED3_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5)

void LED_Init(void)
{ 
        
    GPIO_InitTypeDef GPIO_InitStructure;  // 定义结构体变量
    //打开PB口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    //PB5引脚设置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    //端口速度
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //端口模式,此为输出推挽模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    //初始化对应的端口
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}
int main()
{ 
        
    LED_Init();
    while(1)
    { 
        
        LED3_ON;
    }
}

闪烁LED灯

这个实验室做的两个led流水灯。

程序编写

首先新建一个文件夹MY

在该文件夹下新建一个led.h头文件:

#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

#define LED2_OFF GPIO_SetBits(GPIOE,GPIO_Pin_5)
#define LED2_ON GPIO_ResetBits(GPIOE,GPIO_Pin_5)
#define LED2_REV GPIO_WriteBit(GPIOE, GPIO_Pin_5,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5))))

#define LED3_OFF GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define LED3_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define LED3_REV GPIO_WriteBit(GPIOB, GPIO_Pin_5,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5))))

void LED_Init(void);

#endif

之后新建一个led.c文件:

#include "led.h"

void LED_Init(void)
{ 
        
    GPIO_InitTypeDef GPIO_InitStructure;  // 定义结构体变量
    //打开PB口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    //打开PE口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    //PB5,PE5引脚设置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    //端口速度
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //端口模式,此为输出推挽模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    //初始化对应的端口
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}

最后编写main文件:

# include "stm32f10x.h"
# include "led.h"

int main()
{ 
        
    uint32_t i; 
    LED_Init(); //初始化LED

    LED2_ON;
    LED3_OFF;
    for(i=0; i<0xffffff; i++); //for循环不精确延时
    while(1)
    { 
        
        for(i=0; i<0xfffff; i++); //for循环不精确延时
        LED2_REV;//LED2取反
        LED3_REV;//LED3取反
    }
}

结构目录如图:

.h文件默认是不显示的。编译通过后,在左侧的.C文件上会出现一个“+”号,点开就是该C文件使用到的h文件。

实验结果

标签: 32h连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台