写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。点击此处进入学习日记的总目录
一、STM32 特点
1、什么是stm32
新的基于ARM内核的32位MCU
系列,内核为 Cortex-M
内核,是标准的ARM
架构
(1)特点
- 高性能
- 低电压
- 低功耗
- 创新的内核以及外设
- 简单易用
- 自由
- 低风险
(2)优势
- 极高的性能: 主流的
Cortex
内核。 - 丰富合理的外设,合理的功耗,合理的价格。
- 强大的软件支持:丰富的软件包。
- 全面丰富的技术文档。
- 芯片型号种类多,覆盖面广。
- 强大的用户基础:最先成功试水
CM4
芯片的公司,积累了大批的用户群体,为其领先做铺垫。
2、Cortex内核
(1)架构
Cortex-M
:微控制器,频率不是很高,常用于工业与控制,追求的是稳定可靠,寿命长;STM32
作为代表经典系列:ARM7
、ARM9
、ARM 11
Cortex-M4
采用ARMv7-M
E架构
ARMv7
架构定义了三大分工明确的系列:
- “A”系列:面向尖端的基于虚拟内存的操作系统和用户应用
- “R”系列:针对实时系统
- “M”系列:针对微控制器
Cortex-M3
采用ARMv7-M
架构,Cortex-M0
采用ARMv6-M
架构,Cortex-A5/A8
采用ARMv7-A
架构, 传统的ARM7
系列采用的是ARMv4T
架构。
ARMv7-ME
架构是2007年以后才出现的架构,所以最近的板子一般都是采用Cortex
内核。
(2)特点
- 浮点运算能力
- 增强的DSP处理指令
3、Cortex-M4的低功耗设计
4、Cortex-M家族:STM328大系列产品
5、STM32命名规则
STM32与ARM之间的关系
ARM是英国的一家芯片设计公司,其最成功的产品莫过于32位嵌入式CPU核——也就是我们现在介绍的ARM系列,而且最常用的是ARM7和ARM9,ARM公司主要提供IP(Intellectual Property core知识产权的核心)核,就是CPU的内核结构,只包括最核心的部分,而不是完整的处理器。ARM把这个核卖给各大半导体公司,如飞利浦、三星、ATMEL,甚至Intel等许多公司。ARM为了提高对于8位机市场的竞争力,推出了一系列 Cortex-M核,STM32就是将Cortex-M作为内核,通过一些外设等组合封装在一起就成了如今流行的32位嵌入式处理器。
ARMv7架构定义了三个面向不同应用场合的系列:
“A”系列:面向基于虚拟内存的操作系统和用户应用;
“R”系列:针对实时系统;
“M”系列:面向微控制器。
STM32系列产品的分类命名规则
ST:意法半导体,是一个公司的名字。
M:Microelectronics
的缩写,表示微控制器,要注意微控制器和微处理器的区别。
32:32bit的意思,表示这是一个32bit的微控制器。
二、开发环境搭建
1、MDK软件安装
(1)MDK
是什么?
RealView MDK
是Keil
公司开发的,为基于Cortex
、ARM7
、ARM9
等处理器设备提供的一个完整的开发环境。
MDK
=Keil for ARM
, 大家学习51的时候就会用到Keil C51
。
(2)下载
-
MDK
安装包
即下载Keil
软件
官网下载地址:点击进入
(注:因为是非注册版,所以只能编译不超过32K的代码!!超过32K需要注册,请大家购买正版软件使用。)
点赞获取破解版:---- 破解软件下载密码9ju6 ----------安装教程
- 芯片支持包
即下载板子对应芯片支持包(pack
文件)
官网下载地址:点击进入
(3)安装
- 找到
MDK
的exe
文件,右键管理员安装。
- 安装路径不能有空格和中文
- 四个框随便输入,然后
NEXT
等待几分钟
- 安装完成后点击
FINISH
,回到刚才文件目录,双击pack
文件,继续等待几分钟的安装。
(注:不知道为什么第一次安装
pack
文件显示无法创建文件夹,我打开一了下keil
软件又关闭后又可以继续安装了,属实玄学)
(4)注意事项
- 安装路径为英文路径(不要是中文路径)。
- 系统用户名不能为中文。
- 多个版本
MDK
(Keil
)不要安装在同一目录。 -
MDK5
需要加载芯片对应的支持包。
2、USB串口驱动安装
(1)驱动下载
下载链接: 点击进入
(2)双击SETUP.EXE
,点击安装
如果出现安装失败
或者预安装
,将电脑与板子串口连接,当电脑显示有东西插进来了,再次安装,即可成功。
3、ST-LINK安装
(1)双击dpinst_amd64.exe
安装
(2)安装成功
插上STLINK
在设备管理器中可以看到驱动。
(注:若出错,请参考按照
STLINK调试补充教程.pdf
。
由于此
三、ST-LINK下载
1、硬件连接
(1)JTAG/SWD接口
这是开发板板载的20针标准JTAG
调试口,该JTAG
口直接可以和ULINK
、JLINK
(V9
或者以上版本) 或者STLINK
等调试器(仿真器)连接,同时由于STM32
支持SWD
调试,这个JTAG
口也可以用SWD
模式来连接。
用标准的JTAG
调试,需要占用5个IO
口,有些时候,可能造成IO
口不够用,而用SWD
则只需要2个IO
口,大大节约了IO
数量,但他们达到的效果是一样的,所以我们强烈建议仿真器使用SWD
模式。
(2)连接ST-LINK
将ST-LINK
插在JTAG/SWD接口
上,按照STM32笔记二所述方法安装驱动。
2、配置ST-LINK
(1)打开选项
(2)修改仿真器
- 点击
Debug
- 选择
ST-Link Debugger
- 将
Run to main()
选中 - 点击
Settings
(3)修改传输设置
具体设置如图:
(4)修改程序编译设置
- 点击
sector erase
(块擦除) - 右边的
编程
、验证
、复位和执行
都要选上
(5)选择对应板子的工程
(6)配置Flash菜单命令
将Use Debug Driver
(使用调试驱动程序)、Update Target before Debugging
(调试前更新目标)两个选项选中
四、新建寄存器工程模板
1、找到STM32CubeFX固件包(X为板子的型号)
将固件包解压
2、新建工程目录,复制需要的文件到工程目录
-
新建一个文件夹,在文件夹中新建一个
USER
文件夹和一个HEADER
文件夹 -
在
USER
文件夹里新建一个工程 -
按照自己板子的型号来选择创建类型
-
环境选项中选择
Cancel
-
会发现文件夹中出现了一些文件,其中
uvprojx
是打开文件
3、把工程需要的文件添加到工程
- 在固件包中找到图片中的文件
- 将
startup_stm32f767xx.s
放到USER
文件夹中,
将其余h
文件放到HEADER
文件夹中。
4、在MDK中设置头文件存放路径
- 打开文件管理器,并将
启动文件
(startup_stm32f767xx.s
)导入
- 如果文件头像上有钥匙,就将
启动文件
(startup_stm32f767xx.s
)的只读属性取消勾选。
- 将头文件文件夹导入
注:软件不会沿着目录向下寻找,所以所有头文件必须精确到根目录)
5、配置MDK:全局宏定义等
根据不同的板子、不同的工程将不同的预编译全局宏定义标识符
输入
6、编写用户函数
- 在
USER
创建一个txt
,把后缀改成.c
- 将.c文件导入
- 程序需注意的地方
(1)程序末尾必须要有回车
(2)由于程序默认在复位后运行SystemInit()
函数,所以要么将SystemInit()
函数注释掉,要么在main()
函数前加一个空的SystemInit()
函数。
7、添加ALIENTEK系统文件夹SYSTEM
- 在目标文件夹找到
SYSTEM
文件夹,将其拷到USER
和HEADER
所在的文件夹。
- 将其内的c文件依次导入
- 将三个c文件的头文件坐在目录导入
- 编译–成功
8、导入到开发板
详情参考另一篇笔记(STM32笔记)三、ST-LINK下载
五、初学HAL库
1、固件库和寄存器的区别
固件库就是函数的集合(API
),把寄存器操作封装起来。
STM32
寄存器成百上千,一一操作非常不便。通过API
把寄存器操作封装起来,这样大家不需要在记寄存器的每个位,而是直接操作固件库函数。简单方便很多。
固件库不是万能的。要想全面的掌握STM32
,必须对寄存器有一定的了解,尤其是入门学习的时候。只有通过对寄存器有一个基本的了解,才能全面掌握了STM32
各个功能外设的工作原理,才能更好的使用固件库。
对于寄存器,大家不需要去死记硬背寄存器名称以及每个位作用,大家只需要大致的了解大致的配置过程,这样在开发中遇到问题,就可以通过调试直接查看寄存器配置,从而找出问题所在。
2、HAL库包和关键文件介绍
(注:具体的库还需要以后在使用中慢慢熟悉,故本章笔记是一个不断补充的笔记。)
六、新建HAL库工程模板
1、找到STM32CubeFX固件包(X为板子的型号)
将固件包解压
2、新建工程目录,复制需要的文件到工程目录
-
新建一个文件夹,在文件夹中新建一个
USER
文件夹、HALLIB
文件夹(外设库文件夹,放置HAL
库)、CORE
文件夹(启动文件夹,放置内核)、OBJ
文件夹(放置编译中介文件) -
在固件包中找到图片中的文件
-
将
Inc
(外设程序头文件)、Src
(外设程序源文件)文件夹放到HALLIB
文件夹中。 -
将
startup_stm32f767xx.s
(启动文件)放到CORE
文件夹中, -
将
内核头文件
文件放到CORE
文件夹中。 -
将
顶层头文件
、主头文件
、源文件
放到USER
文件夹中。
3、新建工程
-
在
USER
文件夹里新建一个工程 -
按照自己板子的型号来选择创建类型
-
环境选项中选择
Cancel
-
会发现文件夹中出现了一些文件,其中
uvprojx
是打开文件
4、在MDK中设置头文件存放路径
- 打开文件管理器,并将
启动文件
(startup_stm32f767xx.s
)导入
-
如果文件头像上有钥匙,就将
启动文件
(startup_stm32f767xx.s
)的只读属性取消勾选。 -
将其余几个文件夹和其中的
.h
、.c
文件导入,文件类型选择All files
。
其中有几个.c
文件不需要,删除即可。 -
把带钥匙的文件取消
只读
选项。 -
将头文件文件夹导入
注:软件不会沿着目录向下寻找,所以所有头文件必须精确到根目录)
5、配置MDK:全局宏定义等
- 根据不同的板子、不同的工程将不同的
预编译全局宏定义标识符
输入
- 根据不同板子规格修改
外部晶振
- 勾选
生成HEX工程文件
选项
- 设置
编译中间文件
的存放目录
6、编写用户函数
-
将
main.h
中#include "stm32f7xx_nucleo_144.h"
删除 -
将
main.c
函数中的内容删掉即可开始编程 -
程序需注意的地方
(1)程序末尾必须要有回车
7、修改修改相关文件参数适配开发板
- 在
HALLIB
文件夹中打开stm32f7xx_hal.h
下的stm32f7xx_hal_conf.h
找到#define HSE_VALUE
,将后面的晶振改成板子的晶振,我是用的板子晶振是25MHz
,所以把8000000U
改成25000000U
- 在
HALLIB
文件夹中打开stm32f7xx_hal.h
找到HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
,将优先级分组从4
改为2
,即HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
8、添加ALIENTEK系统文件夹SYSTEM
- 在目标文件夹找到
SYSTEM
文件夹,将其拷到USER
和HEADER
所在的文件夹。
- 将其内的c文件依次导入
- 将三个c文件的头文件坐在目录导入
- 编译–成功
9、导入到开发板
详情参考另一篇笔记(STM32笔记)三、ST-LINK下载
七、GPIO基础知识
1、GPIO介绍
GPIO
(全称:General Purpose Input Output
(通用输入输出端口))是一款端口扩展器,可以做输入也可以做输出。GPIO
端口可通过程序配置成输入或者输出。
GPIO
具有低功耗、小封装、低成本、布线简单等优点。
STM32
的引脚中,有部分是做GPIO
使用,部分是电源引脚
/复位引脚
/启动模式引脚
/晶振引脚
/调试下载引脚
。
2、GPIO八种工作模式解释(STM32)
本小节图片引用自【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
在Cortex-M3
里,对于GPIO
的配置种类有8种:
-
GPIO_Mode_AIN
模拟输入 -
GPIO_Mode_IN_FLOAtiNG
浮空输入 -
GPIO_Mode_IPD
下拉输入 -
GPIO_Mode_IPU
上拉输入 -
GPIO_Mode_Out_OD
开漏输出 -
GPIO_Mode_Out_PP
推挽输出 -
GPIO_Mode_AF_OD
复用开漏输出 -
GPIO_Mode_AF_PP
复用推挽输出
1)4种输入模式
(1)浮空输入
GPIO_Mode_IN_FLOATING
- 作用:
当输入一个高电平时,会检测到高电平;
当输入低电平时,会检测到低电平;
当无信号输入时,该端口的电平是不确定的。 - 原理:
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。
当引脚悬空(在无信号输入)的情况下,I/O的电平状态是不确定的,会因为各种各样的情况受到干扰。
- 参考资料:
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
GPIO工作模式
最详细易懂的GPIO解释
(2)上拉输入
GPIO_Mode_IPU
- 作用:
当输入一个高电平时,会检测到高电平;
当输入低电平时,会检测到低电平;
当无信号输入时,会检测到高电平。 - 原理:
上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。
当输入一个高电平时,VDD
不产生影响;
当输入低电平时,上拉电阻压降为VDD
,VDD
不产生影响;
当无信号输入时,由于上拉电阻电流很小,所以降压很低,故会检测到高电平。
- 参考资料:
视频12分50秒
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
GPIO工作模式
最详细易懂的GPIO解释
(3)下拉输入
GPIO_Mode_IPD
- 作用:
当输入一个高电平时,会检测到高电平;
当输入低电平时,会检测到低电平;
当无信号输入时,会检测到低电平。 - 原理:
下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。
当输入一个高电平时,下拉电阻电流很小,VSS
不产生影响;
当输入低电平时,VSS
不产生影响;
当无信号输入时,下拉电阻两端皆为低电平,故会检测到低电平。
- 参考资料:
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
GPIO工作模式
最详细易懂的GPIO解释
(4)模拟输入
GPIO_Mode_AIN
- 作用:
将不会检测到电平信息,会检测到完整的电压变化。 - 原理:
模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到外设模块,比如ADC模块等等。
- 参考资料:
GPIO工作模式
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
最详细易懂的GPIO解释
2)4种输出模式(带上下拉)
(1)开漏输出(带上拉或者下拉)
GPIO_Mode_Out_OD
- 作用:
当设置输出为高电平时,端口输出高低电平由端口外的上拉或下拉决定。
当设置输出为低电平时,端口输出低电平。
当输出低电平以后,端口可以进行输入。 - 原理:
当设置输出为高电平的时候,N-MOS
管处于关闭状态,此时I/O
端口的电平就不会由输出的高低电平决定,而是由I/O
端口外部的上拉或者下拉决定;
当设置输出的值为低电平的时候,N-MOS
管处于开启状态,此时I/O
端口的电平就是低电平。
同时,I/O
端口的电平也可以通过输入电路进行读取;
注意,I/O
端口的电平不一定是输出的电平,电平由上拉电阻控制。
- 参考资料:
GPIO工作模式
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
最详细易懂的GPIO解释
(2)复用开漏输出(带上拉或者下拉)
GPIO_Mode_AF_OD
- 作用:
当外设输出为高电平时,端口输出高低电平由端口外的上拉或下拉决定。
当外设输出为低电平时,端口输出低电平。
当输出低电平以后,端口可以进行输入。 - 原理:
与开漏输出相同,只不过由外设控制高低电平。
- 参考资料:
GPIO工作模式
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
最详细易懂的GPIO解释
(3)推挽式输出(带上拉或者下拉)
GPIO_Mode_Out_PP
- 作用:
当设置输出为高电平时,端口输出高电平。
当设置输出为低电平时,端口输出低电平。
当输出低电平以后,端口可以进行输入。 - 原理:
当设置输出为高电平的时候,P-MOS
管处于开启状态,N-MOS
管处于关闭状态,此时I/O
端口的高电平由P-MOS
管的VDD
决定;
当设置输出的值为低电平的时候,N-MOS
管处于开启状态,P-MOS
管处于关闭状态,此时I/O
端口的电平就是低电平。
- 参考资料:
GPIO工作模式
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
最详细易懂的GPIO解释
(4)复用推挽输出(带上拉或者下拉)
GPIO_Mode_AF_PP
- 作用:
当外设输出为高电平时,端口输出高电平。
当外设输出为低电平时,端口输出低电平。
当输出低电平以后,端口可以进行输入。 - 原理:
与推挽输出相同,只不过由外设控制高低电平。
- 参考资料:
GPIO工作模式
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
最详细易懂的GPIO解释
3)八种工作模式的区别
(1)什么是推挽结构和推挽电路?
推挽结构一般是指两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
(2)开漏输出和推挽输出的区别?
开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA
以内);
推挽输出:可以输出强高、低电平,连接数字器件。
关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:
该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP
三极管截止,而上面NPN
三极管导通,输出电平VS+
;当比较器输出低电平时则恰恰相反,PNP
三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。
(3)在STM32中选用怎样选择I/O模式?
- 浮空输入
_IN_FLOATING
——浮空输入,可以做KEY
识别,RX1
- 带上拉输入
_IPU
——IO
内部上拉电阻输入 - 带下拉输入
_IPD
——IO
内部下拉电阻输入 - 模拟输入
_AIN
——应用ADC模拟输入,或者低功耗下省电 - 开漏输出
_OUT_OD
——IO
输出0接GND
,IO
输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO
口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO
口也就可以由外部电路改变为低电平或不变。可以读IO
输入电平变化,实现C51
\STM32
的IO
双向功能 - 推挽输出
_OUT_PP
——IO
输出0接GND
,IO
输出1接VCC
,读输入值是未知的 - 复用功能的推挽输出
_AF_PP
——片内外设功能(I2C
的SCL
、SDA
) - 复用功能的开漏输出
_AF_OD
——片内外设功能(TX1
、MOSI
、MISO.SCK.SS
)
(4)STM32 设置实例:
- 模拟
I2C
使用开漏输出_OUT_OD
,接上拉电阻,能够正确输出 0 和 1;读值时先GPIO_SetBits
(GPIOB
,GPIO_Pin_0
)拉高,然后可以读IO
的值,使用GPIO_ReadInputDataBit
(GPIOB
,GPIO_Pin_0
); - 如果是无上拉电阻,
IO
默认是高电平; - 需要读取
IO
的值,可以使用带上拉输入_IPU
和浮空输入_IN_FLOATING
和开漏输出_OUT_OD
;
4)IO 端口复用功能配置:
- 对于复用功能输入,端口可以配置成任意输入模式或者复用功能输出模式。
- 对于复用功能输出,端口必须配置成复用功能输出
- 对于双向复用功能,端口必须配置成复用功能输出
-
stm32
的部分 IO 端口的复用功能可以重新映射成另外的复用功能。 -
stm32
具有GPIO 锁定机制
,即锁定GPIO
配置,下次复位前不能再修改。 -
LSE 振荡器
关闭时,OSC32_IN
和OSC32_OUT
可以用作通用IO
PC14
和PC15
。 - 当进入待机模式或者备份域由
Vbat
供电,PC14
,PC15
功能丢失,该两个IO
口线设置为模拟输入功能。 -
OSC_IN
和OSC_OUT
可以重新映射为GPIO
PD0
,PD1
。 - 注意
PD0
,PD1
用于输出地时候仅能用于50MHz
输出模式。 - 注意:
PC13
,PC14
,PC15
只能用于2MHz
的输出模式,最多只能带30pf
的负载,并且同时只能使用一个引脚!!!
5)上电复位后IO口状态
上电复位后,GPIO
默认为输入浮空状态,部分特殊功能引脚为特定状态。
复位后,调试引脚处于复用功能上拉/下拉状态:
-
PA15
:JTDI
处于上拉状态 -
PA14
:JTCK
/SWCLK
处于下拉状态 -
PA13
:JTMS
/SWDAT
处于下拉状态 -
PB4
:NJTRST
处于上拉状态 -
PB3
:JTDO
处于浮空状态
3、开发板芯片的引脚常用参数
注:由于我使用的是
STM32F767
,所以本小节分析STM32F767IGT6
的参数
- 引脚数量:176 / 4个方向
- 主频:180 MHz
- 内核:
ARM Cortex-M7
- Flash:1024 KB
- 封装:
LQFP176
- 通用IO数量:132
- 最低工作电压:1.7 V
- 最高工作电压:3.6 V
- 一共9组IO:
PA
~PI
PA
~PH
每组16个IO(Pa0
~Pa15
),PI只有12个IO(PI0
~PI11
)
共140个IO口。
八、STM32CubeMX创建工程
1、安装
- 打开官网,下载windows最新版。
- 接受许可协议
- 由于笔者已经装好了,安装过程唯一需要注意的也就是英文路径和别装C盘,其余一路
NEXT
就行了。
2、创建工程
-
打开
STM32CubeMX
-
创建新项目
文章来源:https://www.toymoban.com/news/detail-471357.html -
搜索栏可以直接搜索板子型号,也可根据搜索框下的各个参数来限制搜索范围。
参数从上至下依次为文章来源地址https://www.toymoban.com/news/detail-471357.html
- 内核
- 系列
- 线程
- 芯片包
- 其他
- 引脚功能类型
- 点击找到的板子型号(我是用的是
STM32F767
,诸位按照自己板子),点击右上角的Start Project
本系列可能需要暂停,板子我找不到了。。。
我又回来啦!!!接下来是以学习日记的形式,使用的开发板为STM32F103
,回见!
到了这里,关于(学习日记)2023.04.28的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!