本篇文章包含的内容

  • 一、软件下载注册、驱动安装
    • 1.1 软件(器件支持包)下载
    • 1.2 ST-LINK驱动安装
    • 1.3 USB转串口驱动安装
  • 二、工程的建立
    • 2.1 STM32的开发方式
    • 2.2 新建工程的步骤
    • 2.3 工程文件的架构
    • 2.4 环境的优化处理
    • 2.5 使用寄存器开发实操
    • 2.6 使用库函数配置寄存器实操
  • 三、GPIO 通用输入输出
    • 3.1 GPIO的基本结构
    • 3.2 GPIO位结构及其工作模式
      • 3.2.1 GPIO位结构
      • 3.2.2 GPIO的八种工作模式
    • 3.3 GPIO中的寄存器简介
    • 3.4 GPIO输出 应用实操
      • 3.4.1 GPIO 实现LED闪烁
      • 3.4.2 GPIO 实现流水灯
      • 3.4.3 GPIO 蜂鸣器(无源)输出
    • 3.5 GPIO输入 应用实操
      • 3.5.1 按键控制LED亮灭
      • 3.5.2 光敏传感器控制蜂鸣器

​  本次课程采用单片机型号为STM32F103C8T6。
​  课程链接:江科大自化协 STM32入门教程


一、软件下载注册、驱动安装

1.1 软件(器件支持包)下载

​  由于新型号芯片的不断产生,需要下载器件支持包来更新Keil 5所支持的芯片型号。可以采用离线安装在线安装两种方式。

​  软件注册采用注册机方式解决。

1.2 ST-LINK驱动安装

​  插入ST-LINK到Windows电脑。打开设备管理器,在“其他设备”中“STM32-Link”图标旁会带黄色感叹号。如果没有携带,说明电脑上已经存在ST-Link的驱动。在Keil 5的文件目录中就可以找到驱动安装文件。

​  除此之外,JLink也是一种常见的调试器。在文件目录中同样可以找到对应的驱动安装文件。

1.3 USB转串口驱动安装

​  插入USB转串口模块到Windows电脑。打开设备管理器,在“其他设备”中找到“USB-SERIAL CH340”,并且如果图标旁边有感叹号,说明电脑没有安装驱动。

​  在Windows 11系统中可以在“端口”中找到“USB-SERIAL CH340”。


二、工程的建立

2.1 STM32的开发方式

​  目前STM32的开发方式主要有基于寄存器的方式,基于标准库(库函数)的方式和基于HAL库的方式。

​  基于寄存器的方式是用程序直接配置寄存器,来达到想要的功能。这种方式最底层,最直接,效率会更高一些。但是由于STM32的寄存器复杂,寄存器太多,所以不推荐这种方式。

​  基于库函数的方式是使用ST官方提供的封装好的函数,通过这些函数来间接地配置寄存器。由于ST对寄存器封装的比较好,所以这种方式既能满足对寄存器的配置,对开发人员也比较友好,有利于提高开发效率。本课程采用基于库函数的开发方式

​  基于HAL库的方式可以用图形化界面快速配置STM32, 但是这种方法隐藏了底层逻辑。推荐学习过标准库的开发方式之后,对这一种开发方式进行了解和学习。

2.2 新建工程的步骤

  1. 建立工程文件夹,在Keil中新建工程(工程文件名称为Project,存放在一个文件夹下,对该工程文件的说明写在文件夹上),选择芯片型号(本次课程选用STM32F103C8T6,故选择STM32F103C8);
  2. 工程文件夹里建立Start,Library,User等文件夹,复制固件库中的文件到工程文件夹;
  • 配置STM32的启动文件(STM32的程序从启动文件开始执行)

    • 打开“固件库”文件夹,打开Libraries →\rightarrow→ CMSIS →\rightarrow→ CM3 →\rightarrow→ DeviceSupport →\rightarrow→ ST →\rightarrow→ STM32F10x →\rightarrow→ startup →\rightarrow→ arm,将文件夹中的文件复制到新建的Start文件夹中。

    • 将启动文件导入到Keil的工程中时,启动文件只能导入一个。课程所用型号需要选择startup_stm32f10x_md.s文件。

      启动文件的选择

        选择启动文件时,需要考量芯片的两个指标:Flash容量、型号。
        根据上表,如果使用STM32F100的型号,就选择启动文件后缀为vl的启动文件,根据Flash容量选择后缀为ld_vlmd_vlhd_vl的文件,表中其他型号同理。

    • 回到STM32F10x文件夹,将stm32f10x.hsystem_stm32f10x.csystem_stm32f10x.h复制到Start文件夹中,并导入到工程组Start中stm32f10x.h就是STM32外设寄存器描述文件,它的作用就同51单片机的头文件REGX52.H一样,是用来描述STM32有哪些寄存器和它对应的地址的)。

  • 配置内核寄存器的描述文件

    • 打开CM3 →\rightarrow→ CoreSupport,core_cm3.hcore_cm3.c就是内核的寄存器描述文件(其中还包含了一些内核的配置函数),同样将它们复制到Start文件夹中,并导入到工程组Start中
  • 配置User文件夹

    • 在Keil工程文件中新建User文件夹,添加main.c文件(注意:添加main.c文件时的路径要选择User文件夹,否则默认放在文件夹外),这时对main.c文件进行编译检查,如果没有报错和警告说明工程建立成功。 至此,基于寄存器开发的工程就建立完成了。
    • 在在“固件库”文件夹中打开Project →\rightarrow→ STM32F10x_StdPeriph_Template,其中stm32f10x_conf.h是用来配置库函数头文件的包含关系的,其中还包含用来参数检查的函数定义,是所有库函数都需要的。此外stm32f10x_it.hstm32f10x_it.c是用来存放中断函数的。将这三个文件复制下来,粘贴到工程的User文件夹中
  • 配置库函数Library文件夹

    • 在工程文件夹中新建Library文件夹。
    • 在“固件库”文件夹中打开Libraries →\rightarrow→ STM32F10x_StdPeriph_Driver(STM32标准外设驱动)→\rightarrow→ src,其中的文件就是库函数的源文件,其中misc.c是内核的库函数,其他都是内核外的外设库函数。将其中所有文件复制到Library文件夹中。
    • 在Libraries →\rightarrow→STM32F10x_StdPeriph_Driver(STM32标准外设驱动)→\rightarrow→ inc 中是库函数的头文件,将其中所有文件复制到Library文件夹中。

注意事项
  需要用的文件一定要复制到工程的文件夹里面,不要添加工程文件夹外面的文件,否则外面的文件一旦挪动位置,工程里就找不到文件了。所以我们要将用的文件复制到工程中,以保证工程的独立性。

  1. 工程里对应建立Start,Library,User等同名称的分组(Group),然后将文件夹内的文件添加到对应的分组里;
  2. 点击工程选项(魔术棒)、C/C++、在Include Path内声明所有包含头文件的文件夹(Start,Library,User);
  3. 点击工程选项、C/C++、在Define内定义USE_STDPERIPH_DRIVER(宏定义,意为使用标准外设驱动这是库函数的条件编译,使用库函数开发就必须要定义
  • 该宏定义在头文件stm32f10x.h中(8296行)
#ifdef USE_STDPERIPH_DRIVER#include "stm32f10x_conf.h"
#endif

  其他工程在这个位置还声明了 STM32F10X_MD的字符串,但是Keil5在新建工程之后会自动声明该字符串,不需要再额外声明。

  1. 点击工程选项、Debug中下拉列表选择对应的调试器(本次课程使用ST-Link进行调试,故选择ST-Link Debugger),点击Settings,在Flash Download里勾选Reset and Run,勾选上这一项之后,下载的程序会立马复位并执行,省去了在开发板上手动按下复位的步骤。

2.3 工程文件的架构

​  工程的建立非常灵活,学会建立工程后可以依照自己的风格建立工程。

​  根据上图,我们可以了解STM32的工程架构(总结)如下所示:
​  首先是主动执行的文件:

  • startup_xx.s 启动文件

    • 启动文件是程序执行最基本的文件,由汇编语言编写。启动文件内定义了中断向量表,中断服务函数等。
    • 在中断服务函数中有一个复位中断,是整个程序的入口。 复位中断中调用StstemInit函数和main函数。StstemInit函数定义在system_xx.c/.h文件中,这个函数的作用是设置微控制器的启动,初始化嵌入式闪存接口,锁相环,更新系统内核的时钟变量。这个函数仅在复位后需要调用。
    • 在启动文件中还定义了STM32所有的其他中断函数。这些中断函数的定义,存放在stm32f10x_it.c/.h中。在这两个文件最后还可以定义用户自己写的中断函数。当然,写在别的地方也可以。
  • system_xx.c/.h 文件:定义SystemInit函数
  • main.c文件:定义main函数
  • stm32f10x_it.c/.h文件:定义中断函数
  • 其他用户文件:封装一些模块函数供主函数和中断函数调用

​  下面是被动执行的文件,相当于STM32的资源:

  • stm32f10x.h文件:外设寄存器描述

    • 该文件中都是寄存器和每一位寄存器的名字、地址信息等
  • core_cm3.c/.h文件:内核寄存器描述
  • misc.c/.hstm32f10x_adc.c/.h…文件:库函数
  • stm32f10x_conf.h文件:库函数配置文件
    • 该文件用来配置头文件的包含关系,它include了所有的库函数头文件,同时在stm32f10x.h中又include了stm32f10x_conf.h。所以,在使用这些库函数时,只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的头文件

2.4 环境的优化处理

  1. 为防止出现中文乱码在设置

    STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出相关推荐

    1. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

      本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

    2. STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

      本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...

    3. STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)

      本篇文章包含的内容 一.ADC 模数转换器 1.1 ADC简介 1.2 逐次逼近型ADC工作原理 1.3 STM32中的ADC基本结构 1.4 STM32中ADC的输入通道 1.5 STM32中的AD ...

    4. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

      本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

    5. 《STM32学习笔记》2——开发环境的建立

      接上文,文中的图片知识,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.接口定义 1 芯片引脚整体简介 2 各部分引脚介绍 二.开发板简介 三.IS ...

    6. stm32学习笔记----双串口同时打开时的printf()问题

      stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

    7. STM32学习笔记——MDK新建项目

      STM32学习笔记 KIEL新建项目过程 文章目录 STM32学习笔记 前言 一.keil新建库函数版本项目 二.注意事项 1.文件分类 2.MDK配置 总结 前言 此处使用寄存器版,进行学习.后期看 ...

    8. stm32单片机c语言入门 pdf,STM32学习笔记(初学者快速入门).pdf

      STM32 学习笔记 从51 开始,单片机玩了很长时间了,有51,PIC,AVR 等等,早就想跟潮 流玩玩ARM ,但一直没有开始,原因不知道玩了ARM 可以做什么(对我自 己而言).如果为学习而学习 ...

    9. STM32学习笔记 | 引起电源和系统异常复位的原因

      关注+星标公众号,不错过精彩内容 每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种. STM32的复位功能非常强大,可通过软件.硬件和一些事件触发系统复位,而且通 ...

    最新文章

    1. uva 544(kruskal 变形)
    2. sutton 强化学习 中文版pdf_互联网数据驱动力简书-《数据推动力-创造数据文化》免费pdf分享...
    3. 面试中遇到过的闭包~
    4. 一个字符串中到底能有多少个字符? 我竟然算错了!
    5. 国开大学计算机应用基础作业二,国家开放大学《计算机应用基础》形考作业二答案解析 (2)...
    6. 华为云严选上新啦!高效准确的数据同步方案来了
    7. docker之快速部署gogs git
    8. css-flex 常见面试题
    9. 设计模式---外观模式(C++实现)
    10. 数字信号处理——IIR滤波器设计
    11. python唯美壁纸_Python爬虫教程爬取5K分辨率超清唯美壁纸源码
    12. 傻,是不值得同情和原谅的事情
    13. 【信源编码技术】实验1-浊音清音爆破音的时域及频域特性分析
    14. 微信小程序图书借阅系统+后台管理系统
    15. 批量下载bilibili视频
    16. 鼠标精灵对码软件_暗影精灵6游戏主机评测
    17. 【蓝桥杯2022】- 数的拆分
    18. xssgame第九关至第十关
    19. java 跨 module 引入包不成功问题
    20. DELPHI-Delphi常用类型及定义单元

    热门文章

    1. 虫师Selenium2+Python_2、测试环境搭建
    2. Vue:滚动页面到指定位置实现避坑笔记
    3. Linux中fstat、stat和lstat的用法与区别
    4. win10计算机启动慢,win10启动缓慢如何解决_两种解决win10启动缓慢的方法
    5. C++----字符集详解(一看就懂系列)
    6. ♥二:TypeScript---变量声明
    7. 一些名词解释记录--计算机网络实验
    8. android 腾讯广告接入,cocos2dx 3.x android studio 添加广点通广告
    9. 经典分频器——奇数分频(3分频,5分频,任意分频)
    10. 基于Python+django的航班查询与推荐-计算机毕业设计