写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。
点击此处进入学习日记的总目录
STM32
特点stm32
新的基于ARM内核的32位MCU
系列,内核为 Cortex-M
内核,是标准的ARM
架构
Cortex
内核。CM4
芯片的公司,积累了大批的用户群体,为其领先做铺垫。Cortex
内核Cortex-M
:微控制器,频率不是很高,常用于工业与控制,追求的是稳定可靠,寿命长;STM32
作为代表经典系列:ARM7
、ARM9
、ARM 11
Cortex-M4
采用ARMv7-M
E架构
ARMv7
架构定义了三大分工明确的系列:
Cortex-M3
采用ARMv7-M
架构,Cortex-M0
采用ARMv6-M
架构,Cortex-A5/A8
采用ARMv7-A
架构, 传统的ARM7
系列采用的是ARMv4T
架构。
ARMv7-ME
架构是2007年以后才出现的架构,所以最近的板子一般都是采用Cortex
内核。
Cortex-M4
的低功耗设计Cortex-M
家族:STM32
8大系列产品STM32
命名规则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”系列:面向微控制器。
ST:意法半导体,是一个公司的名字。
M:Microelectronics
的缩写,表示微控制器,要注意微控制器和微处理器的区别。
MDK
软件安装MDK
是什么?RealView MDK
是Keil
公司开发的,为基于Cortex
、ARM7
、ARM9
等处理器设备提供的一个完整的开发环境。
MDK
=Keil for ARM
, 大家学习51的时候就会用到Keil C51
。
MDK
安装包Keil
软件(注:因为是非注册版,所以只能编译不超过32K的代码!!超过32K需要注册,请大家购买正版软件使用。)
点赞获取破解版:---- 破解软件下载密码9ju6 ----------安装教程
pack
文件)(注:不知道为什么第一次安装
pack
文件显示无法创建文件夹,我打开一了下keil
软件又关闭后又可以继续安装了,属实玄学)
MDK
(Keil
)不要安装在同一目录。MDK5
需要加载芯片对应的支持包。下载链接: 点击进入
SETUP.EXE
,点击安装
如果出现安装失败
或者预安装
,将电脑与板子串口连接,当电脑显示有东西插进来了,再次安装,即可成功。
ST-LINK
安装dpinst_amd64.exe
安装(注:若出错,请参考按照
STLINK调试补充教程.pdf
。
由于此
JTAG/SWD接口
这是开发板板载的20针标准JTAG
调试口,该JTAG
口直接可以和ULINK
、JLINK
(V9
或者以上版本) 或者STLINK
等调试器(仿真器)连接,同时由于STM32
支持SWD
调试,这个JTAG
口也可以用SWD
模式来连接。
用标准的JTAG
调试,需要占用5个IO
口,有些时候,可能造成IO
口不够用,而用SWD
则只需要2个IO
口,大大节约了IO
数量,但他们达到的效果是一样的,所以我们强烈建议仿真器使用SWD
模式。
ST-LINK
将ST-LINK
插在JTAG/SWD接口
上,按照STM32笔记二所述方法安装驱动。
ST-LINK
sector erase
(块擦除)编程
、验证
、复位和执行
都要选上将Use Debug Driver
(使用调试驱动程序)、Update Target before Debugging
(调试前更新目标)两个选项选中
STM32CubeFX
固件包(X
为板子的型号)启动文件
(startup_stm32f767xx.s
)导入启动文件
(startup_stm32f767xx.s
)的只读属性取消勾选。注:软件不会沿着目录向下寻找,所以所有头文件必须精确到根目录)
根据不同的板子、不同的工程将不同的预编译全局宏定义标识符
输入
USER
创建一个txt
,把后缀改成.c
SystemInit()
函数,所以要么将SystemInit()
函数注释掉,要么在main()
函数前加一个空的SystemInit()
函数。ALIENTEK
系统文件夹SYSTEM
详情参考另一篇笔记(STM32笔记)三、ST-LINK下载
固件库就是函数的集合(API
),把寄存器操作封装起来。
STM32
寄存器成百上千,一一操作非常不便。通过API
把寄存器操作封装起来,这样大家不需要在记寄存器的每个位,而是直接操作固件库函数。简单方便很多。
固件库不是万能的。要想全面的掌握STM32
,必须对寄存器有一定的了解,尤其是入门学习的时候。只有通过对寄存器有一个基本的了解,才能全面掌握了STM32
各个功能外设的工作原理,才能更好的使用固件库。
对于寄存器,大家不需要去死记硬背寄存器名称以及每个位作用,大家只需要大致的了解大致的配置过程,这样在开发中遇到问题,就可以通过调试直接查看寄存器配置,从而找出问题所在。
(注:具体的库还需要以后在使用中慢慢熟悉,故本章笔记是一个不断补充的笔记。)
STM32CubeFX
固件包(X
为板子的型号)注:软件不会沿着目录向下寻找,所以所有头文件必须精确到根目录)
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);
ALIENTEK
系统文件夹SYSTEM
详情参考另一篇笔记(STM32笔记)三、ST-LINK下载
GPIO
基础知识GPIO
介绍GPIO
(全称:General Purpose Input Output
(通用输入输出端口))是一款端口扩展器,可以做输入也可以做输出。GPIO
端口可通过程序配置成输入或者输出。
GPIO
具有低功耗、小封装、低成本、布线简单等优点。
STM32
的引脚中,有部分是做GPIO
使用,部分是电源引脚
/复位引脚
/启动模式引脚
/晶振引脚
/调试下载引脚
。
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
复用推挽输出GPIO_Mode_IN_FLOATING
GPIO_Mode_IPU
VDD
不产生影响;VDD
,VDD
不产生影响;GPIO_Mode_IPD
VSS
不产生影响;VSS
不产生影响;GPIO_Mode_AIN
GPIO_Mode_Out_OD
N-MOS
管处于关闭状态,此时I/O
端口的电平就不会由输出的高低电平决定,而是由I/O
端口外部的上拉或者下拉决定;N-MOS
管处于开启状态,此时I/O
端口的电平就是低电平。I/O
端口的电平也可以通过输入电路进行读取;I/O
端口的电平不一定是输出的电平,电平由上拉电阻控制。GPIO_Mode_AF_OD
GPIO_Mode_Out_PP
P-MOS
管处于开启状态,N-MOS
管处于关闭状态,此时I/O
端口的高电平由P-MOS
管的VDD
决定;N-MOS
管处于开启状态,P-MOS
管处于关闭状态,此时I/O
端口的电平就是低电平。GPIO_Mode_AF_PP
推挽结构一般是指两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA
以内);
推挽输出:可以输出强高、低电平,连接数字器件。
关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:
该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP
三极管截止,而上面NPN
三极管导通,输出电平VS+
;当比较器输出低电平时则恰恰相反,PNP
三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。
_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
)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
;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
的负载,并且同时只能使用一个引脚!!!上电复位后,GPIO
默认为输入浮空状态,部分特殊功能引脚为特定状态。
复位后,调试引脚处于复用功能上拉/下拉状态:
PA15
:JTDI
处于上拉状态PA14
:JTCK
/SWCLK
处于下拉状态PA13
:JTMS
/SWDAT
处于下拉状态PB4
:NJTRST
处于上拉状态PB3
:JTDO
处于浮空状态注:由于我使用的是
STM32F767
,所以本小节分析STM32F767IGT6
的参数
ARM Cortex-M7
LQFP176
PA
~ PI
PA
~ PH
每组16个IO(Pa0
~ Pa15
),PI只有12个IO(PI0
~ PI11
)