STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出
本篇文章包含的内容
- 一、软件下载注册、驱动安装
- 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 新建工程的步骤
- 建立工程文件夹,在Keil中新建工程(工程文件名称为Project,存放在一个文件夹下,对该工程文件的说明写在文件夹上),选择芯片型号(本次课程选用STM32F103C8T6,故选择STM32F103C8);
- 工程文件夹里建立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_vl
,md_vl
,hd_vl
的文件,表中其他型号同理。
回到STM32F10x文件夹,将
stm32f10x.h
、system_stm32f10x.c
、system_stm32f10x.h
复制到Start文件夹中,并导入到工程组Start中(stm32f10x.h
就是STM32外设寄存器描述文件,它的作用就同51单片机的头文件REGX52.H
一样,是用来描述STM32有哪些寄存器和它对应的地址的)。
配置内核寄存器的描述文件
- 打开CM3 →\rightarrow→ CoreSupport,
core_cm3.h
、core_cm3.c
就是内核的寄存器描述文件(其中还包含了一些内核的配置函数),同样将它们复制到Start文件夹中,并导入到工程组Start中。
- 打开CM3 →\rightarrow→ CoreSupport,
配置User文件夹
- 在Keil工程文件中新建User文件夹,添加
main.c
文件(注意:添加main.c文件时的路径要选择User文件夹,否则默认放在文件夹外),这时对main.c
文件进行编译检查,如果没有报错和警告说明工程建立成功。 至此,基于寄存器开发的工程就建立完成了。 - 在在“固件库”文件夹中打开Project →\rightarrow→ STM32F10x_StdPeriph_Template,其中
stm32f10x_conf.h
是用来配置库函数头文件的包含关系的,其中还包含用来参数检查的函数定义,是所有库函数都需要的。此外stm32f10x_it.h
,stm32f10x_it.c
是用来存放中断函数的。将这三个文件复制下来,粘贴到工程的User文件夹中
- 在Keil工程文件中新建User文件夹,添加
配置库函数Library文件夹
- 在工程文件夹中新建Library文件夹。
- 在“固件库”文件夹中打开Libraries →\rightarrow→ STM32F10x_StdPeriph_Driver(STM32标准外设驱动)→\rightarrow→ src,其中的文件就是库函数的源文件,其中
misc.c
是内核的库函数,其他都是内核外的外设库函数。将其中所有文件复制到Library文件夹中。 - 在Libraries →\rightarrow→STM32F10x_StdPeriph_Driver(STM32标准外设驱动)→\rightarrow→ inc 中是库函数的头文件,将其中所有文件复制到Library文件夹中。
注意事项
需要用的文件一定要复制到工程的文件夹里面,不要添加工程文件夹外面的文件,否则外面的文件一旦挪动位置,工程里就找不到文件了。所以我们要将用的文件复制到工程中,以保证工程的独立性。
- 工程里对应建立Start,Library,User等同名称的分组(Group),然后将文件夹内的文件添加到对应的分组里;
- 点击工程选项(魔术棒)、C/C++、在Include Path内声明所有包含头文件的文件夹(Start,Library,User);
- 点击工程选项、C/C++、在Define内定义USE_STDPERIPH_DRIVER(宏定义,意为使用标准外设驱动)这是库函数的条件编译,使用库函数开发就必须要定义;
- 该宏定义在头文件
stm32f10x.h
中(8296行)
#ifdef USE_STDPERIPH_DRIVER#include "stm32f10x_conf.h"
#endif
其他工程在这个位置还声明了 STM32F10X_MD的字符串,但是Keil5在新建工程之后会自动声明该字符串,不需要再额外声明。
- 点击工程选项、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/.h
,stm32f10x_adc.c/.h
…文件:库函数stm32f10x_conf.h
文件:库函数配置文件- 该文件用来配置头文件的包含关系,它include了所有的库函数头文件,同时在
stm32f10x.h
中又include了stm32f10x_conf.h
。所以,在使用这些库函数时,只需要包含stm32f10x.h
这一个头文件,就相当于包含了所有的头文件
- 该文件用来配置头文件的包含关系,它include了所有的库函数头文件,同时在
2.4 环境的优化处理
- 为防止出现中文乱码在设置
STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出相关推荐
- STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...
- STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)
本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...
- STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)
本篇文章包含的内容 一.ADC 模数转换器 1.1 ADC简介 1.2 逐次逼近型ADC工作原理 1.3 STM32中的ADC基本结构 1.4 STM32中ADC的输入通道 1.5 STM32中的AD ...
- STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)
本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...
- 《STM32学习笔记》2——开发环境的建立
接上文,文中的图片知识,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.接口定义 1 芯片引脚整体简介 2 各部分引脚介绍 二.开发板简介 三.IS ...
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- STM32学习笔记——MDK新建项目
STM32学习笔记 KIEL新建项目过程 文章目录 STM32学习笔记 前言 一.keil新建库函数版本项目 二.注意事项 1.文件分类 2.MDK配置 总结 前言 此处使用寄存器版,进行学习.后期看 ...
- stm32单片机c语言入门 pdf,STM32学习笔记(初学者快速入门).pdf
STM32 学习笔记 从51 开始,单片机玩了很长时间了,有51,PIC,AVR 等等,早就想跟潮 流玩玩ARM ,但一直没有开始,原因不知道玩了ARM 可以做什么(对我自 己而言).如果为学习而学习 ...
- STM32学习笔记 | 引起电源和系统异常复位的原因
关注+星标公众号,不错过精彩内容 每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种. STM32的复位功能非常强大,可通过软件.硬件和一些事件触发系统复位,而且通 ...
最新文章
- uva 544(kruskal 变形)
- sutton 强化学习 中文版pdf_互联网数据驱动力简书-《数据推动力-创造数据文化》免费pdf分享...
- 面试中遇到过的闭包~
- 一个字符串中到底能有多少个字符? 我竟然算错了!
- 国开大学计算机应用基础作业二,国家开放大学《计算机应用基础》形考作业二答案解析 (2)...
- 华为云严选上新啦!高效准确的数据同步方案来了
- docker之快速部署gogs git
- css-flex 常见面试题
- 设计模式---外观模式(C++实现)
- 数字信号处理——IIR滤波器设计
- python唯美壁纸_Python爬虫教程爬取5K分辨率超清唯美壁纸源码
- 傻,是不值得同情和原谅的事情
- 【信源编码技术】实验1-浊音清音爆破音的时域及频域特性分析
- 微信小程序图书借阅系统+后台管理系统
- 批量下载bilibili视频
- 鼠标精灵对码软件_暗影精灵6游戏主机评测
- 【蓝桥杯2022】- 数的拆分
- xssgame第九关至第十关
- java 跨 module 引入包不成功问题
- DELPHI-Delphi常用类型及定义单元
热门文章
- 虫师Selenium2+Python_2、测试环境搭建
- Vue:滚动页面到指定位置实现避坑笔记
- Linux中fstat、stat和lstat的用法与区别
- win10计算机启动慢,win10启动缓慢如何解决_两种解决win10启动缓慢的方法
- C++----字符集详解(一看就懂系列)
- ♥二:TypeScript---变量声明
- 一些名词解释记录--计算机网络实验
- android 腾讯广告接入,cocos2dx 3.x android studio 添加广点通广告
- 经典分频器——奇数分频(3分频,5分频,任意分频)
- 基于Python+django的航班查询与推荐-计算机毕业设计
- STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)