type
slug
status
summary
icon
category
date
tags
password
STM32简介
STM32是ST公司基于ARM Cortex-M内核开发的32位的微控制器。
ST公司,M:Microcontrolller微控制器,MCU单片机。32:32位的单片机。ARM Cortex-M内核
(无线通信:可以给STM32连接上一些2.4G无线模块或者 蓝牙,WIFI模块,使得STM32具备具有无线通信的能力了,物联网借助无线模块通信。)
ARM:ARM公司设计内核,实际由各大半导体厂商完善内核周边电路并生产芯片。
STM32F103C8T6

主频:72MHz,RAM:运行内存,实际的存储介质SRAM;ROM:程序存储器,实际的存储介质为Flash闪存。供电:2.0V~3.6V
命名规则:STM32F103C8T6,STM32F401RET6

片上资源/外设(Peripheral)
通过程序配置外设来完成我们想要的功能。

NVIC:内核中管理中断。eg:配置中断优先级
SysTick:内核中的定时器,为操作系统提供定时服务。STM32可以加入操作系统,如FreeRTOS,UCOS等。加入操作系统就需要SysTick来提供定时来进行任务切换功能。
RCC:对系统时钟进行配置,使能各个模块的时钟。STM32中,其他外设在上电的情况下默认是没有时钟的,没有时钟的情况下,操作外设是无效的。所以在操作外设之前,必须要先使能它的时钟。
GPIO:通用的IO口,可以用GPIO来点灯,读取按键等。
AFIO:复用的IO口,可以完成复用功能端口的重定义,以及中断端口的配置。
EXTI:外部中断。配置好外部中断后,引脚有电平变化时,就可以触发中断,让CPU来处理任务。
TIM:定时器,高级通用低级,完成测频率,生成PWM波形,配置成专用的编码器接口……
USART:同步/异步串口,UART异步串口。
I2C,SPI:通信协议,STM32内置它们的控制器,可以用硬件来输出时序波形。也可以用通用IO口来模拟时序波形。
RTC:实时时钟,在STM32内部完成年月日、时分秒的计时功能。
IWDG/WWDG:看门狗,当单片机因为电磁干扰死机/程序设计不合理出现死循环时,看门狗可以及时复位芯片,保证系统的稳定。
系统结构

ICode:指令总线;DCode:数据总线;System:系统总线。前两个主要连接Flash闪存(内含编写程序,ICode加载指令,DCode加载常量数据和调试数据,System连接到其他部分,eg:SRAM程序运行时的变量数据)
AHB系统总线:挂载主要外设(AHB(Advanced High-performance Bus), 高速总线,用来接高速外设的。比如复位和时钟控制RCC)
APB (Advanced Peripheral Bus) 低速总线,用来接低速外设的。APB2性能>APB1,APB2频率一般和AHB同频
由于AHB和APB的总线协议、总线速度、数据传送格式的差异,需要桥接来完成数据的的存储和转化。
DMA:内核CPU的小秘书,主要工作为搬运数据等简单且反复要干的事情,DMA总线连接到总线矩阵上,拥有和CPU一样的总线控制权,用于访问外设。
引脚定义

红色:电源相关引脚;蓝色:系统相关引脚;绿色:IO口,功能口的引脚;
类型:S:电源;I/O:输入输出
IO口电平 :IO口所能容忍的电压;FT:表示能容忍5V的电压;没有FT代表只能容忍3.3V的电压。(如果需要5V,需要接电平转换电路。)
主功能:上电的默认功能
默认复用功能:IO口上同时连接的外设的功能引脚。配置IO口时可以选择为通用IO口或者复用功能。
重定义功能:如果两个功能同时复用在了一个IO口上,但又确实需要用到这两个功能,那么可以将其中一个复用功能重新映射到其他端口上。

1号引脚VBAT:备用电池供电的引脚,可接入3V电池,系统电源断电时,备用电池可以给内部的RTC时钟和备份寄存器提供电源。
2号引脚PC13-TAMPER-RTC:IO口/侵入检测/RTC:IO口可以根据程序输出或读取高低电平。侵入检测:保证数据安全;RTC引脚:输出RTC校准时钟等。
3号4号引脚PC14-OSC32_IN/OSC32_OUT:IO口/接32.768KHz的RTC晶振。
5号6号引脚OSC_IN/OSC_OUT:接系统的主晶振,8MHz。芯片内部的锁相环电路可以对8MHz的频率进行倍频。最后产生72MHz作为系统的主时钟。(OSC:晶振)
7号引脚NRST:系统复位引脚,N为低电平复位。
8号9号引脚VSSA/VDDA:内部模拟部分的电源。VSS负极接GND;VDD正极,接3.3V
10号~19号引脚,21号22号引脚,25~33号,41~43号,45,46号:IO口,PA0兼具WKUP功能,可以用于唤醒处于待机模式的STM32。
20号引脚PB2:IO口/BOOT1引脚,BOOT引脚配置启动模式。(44号BOOT0)
21号22号引脚VSS_1,VDD_1(_2/_3):系统的主电源口。STM32采用分区供电的方式,使用时VSS接GND;VDD接3.3V即可。

34号,37~40号:IO口或者调试端口。默认的主功能为调试功能,调试功能就是用来调试程序和下载程序的。STM32F103支持两种调试方式:第一种为SWD,需要两根线SWDIO和SWCLK。第二种为JTAG需要五根线:JTMS\JTCK\JTDI\JTDO\NJTRST。
(STLINK来下载调试程序,为SWD方式。只需要占用PA13和PA14这两个IO口。此时的PA15,PB2,PB4可以切换为普通的IO口来使用但需要程序进行配置)
启动配置

作用:指定程序开始运行的位置。
一般情况下,程序都是在Flash程序存储器开始执行。0为接地,1为3.3V正的意思。
BOOT0接0,BOOT1接X(0/1),启动模式是主闪存存储器,即正常执行Flash闪存里面的程序。
BOOT0接1,BOOT1接0,启动模式是系统存储器,即用来做串口下载程序。(调试端口用来下载程序)
BOOT0接1,BOOT1接1,启动模式是内置SRAM,即进行程序调试。
上电复位之后,SYSCLK(系统时钟信号,用于同步系统内部的操作。)第4个上升沿(指的是在系统时钟信号的第四次从低电平变为高电平的时刻。)锁存(在电子学中,锁存是一种存储数据的技术,这里指的是在特定的时钟沿,BOOT引脚的值被“捕获”并用于决定启动模式。)
STM32最小系统电路

单片机只有一个芯片是无法工作的。使其工作的最基本电路为最小系统电路。
STM32工作→电源部分和最小系统部分的电路连接好。

STM32及供电:三个分区供电(VSS,VDD_123)和一个模拟电压(VSSA,VDDA)均VSS连接GND,VDD连接3.3V。3.3V和GND之间一般会连接一个滤波电容,保证供电电压的稳定,设计电路时应该注意。VBAT接备用电池,eg纽扣电池正极接VBAT负极接地为RTC和备用寄存器服务,也可不接悬空。

晶振电路:8MHz的主时钟晶振,内部所向环倍频得到72MHz的主频。两个引脚根据网络编号,分别连接到STM32的5、6号引脚,20pf的电容作为起振电容,另一端接地。
RTC功能:32.768KHz的晶振,晶振电路如图,接在3,4号引脚。(OSC32:即32.768KHz晶振,2的15次方,内部的RTC电路经过2的15次方分频,就可以生成1s的时间信号。)

复位电路:为单片机提供复位信号。
NRST接在7号引脚,为低电平复位。上电瞬间电容没电,电源向电容充电,电容呈现短路状态,NRST引脚产生低电平。电容逐渐充满电,电容为断路,NRST会被R1上拉为高电平。低电平提供复位信号,电容充电速度很快,因此我们认为单片机在上电瞬间就复位了。
并联K1按键,提供手动复位的功能。按下按键,NRST接地(电容放电),手动提供低电平复位信号。松开后NRST从低电平复位状态转变为高电平工作状态。

BOOT启动配置电路:BOOT引脚接地/接电源→启动模式。

STLINK方式:3.3V,GND,SWDIO和SWCLK都引线引出。
核心板原理图:

复位电路,BOOT启动配置电路。
两个测试LED,一个接VCC3V3和GND,电源指示灯;一个接VCC3V3和PC13:IO口测试灯。
下载电路:加入滤波电容,达到稳定供电的目的。
稳压芯片:将5V的电降到3.3V,实现给STM32供电。左边为USB的5V电源,右边为输出的3.3V
Header:引脚排针,芯片引脚引出,方便接线
中间为:STM32F103C8T6的芯片,右上和左下为四个STM32供电的滤波电容。
USB接口:接PA11和PA12(STM32F103的USB引脚可以进行USB通信,也可以提供5V供电。)

STM32F103C8T6芯片,左侧两个跳线帽配置BOOT引脚,下面为复位按键,再左USB接口。
右侧金属外壳:8MHz主时钟晶振,黑色为32.768KHzRTC晶振,两个LED(上面为PWR电源指示灯,下面为PC13口的测试灯),SWD的调试接口(下载程序),上下两排为用于接线的排针。背后3.3V稳压芯片。
STM32F401RET6
64引脚,512K闪存,LQFP封装

外设总览

引脚定义



寄存器的地址边界



一些重要的原理图

Nucleo—F401RE操作手册
四张原理图:
第一张图为总览:接下来介绍的三个部分分别是MCU,ST_LINK,Connectors

第二张图为STM32F401RET6总览:
(两块芯片都是401,两块是因为64个引脚数量多连接复杂,所以需要画两块)

第三张图为STLINK

第四张图为Connectors

新建工程
工程的作用—>文件夹名(便于修改)
工程名(不方便修改)
STM32启动文件:
D:\Desktop\江协\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
C+V—>工程的启动文件夹Start

第一个是寄存器文件描述,后两个system为配置72MHz时钟—>Start

内核的启动文件—>Start
回到Keil,将刚刚复制的文件添加到工程里(修改为同名文件夹)
文件图标上的小钥匙—>表示这个为只读文件
工程选项里面添加上头文件路径,使得软件能够找到.h文件。
魔术棒—>C/C++—>Include Paths—>添加start文件夹的路径,即将头文件路径加入。
!!!!注意ASM中的include paths也应该加入路径!!

User:放main文件
Build:编译并建立工程
文件的最后一行必须要是空行(单独一行),不然会报错。
扳手工具:改字体,编码格式Encoding改为UTF8。
连接STLINK和F103:
3.3V,GND,SWDIO,SWCLK和3.3V,GND,DIO,DCLK连接
现象:电源灯常量,另一个连接在PC13口上的灯默认为闪烁状态,此为芯片里面的测试程序。
配置调试程序:Debug—>STLINKdebugger,设置里FLASH:选上Reset And Run:这样一来下载程序之后就会立马复位并执行,如果没有勾选,每次下载程序之后,还需要按一下板子上的复位按钮才能执行程序。
注意:Debug设置为ST-Link Debugger,setting中应该设置如下。关于erase full chip是为了解决无法连接到Cotex-M4的错误。


配置寄存器点灯(F103)
PC13
使能GPIOC时钟
二进制数据—>十六进制数据,4个一分组

配置PC13口的模式

CNF:通用推挽输出模式—>00
MODE:最大输出模式11
0011:换算成16进制为3
00300000
端口输出:1为高电平,0为低电平。灯为低电平点亮,所以当ODR全为0就是亮。
0x00000000亮,0x00002000灭

编译下载

如果这样写,那么会将其他端口的位也变为0,可能会导致影响到其他端口的原有配置,如果需要做到只配置PC13而不影响其他位,&=与|=
库函数点灯(F103)
新建库函数工程
工程文件夹—>Library(存放库函数)
D:\Desktop\江协\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver

src:第一个为内核的库函数,其他为内核外的外设库函数,全选cv—>Library
inc:库函数的头文件,全选cv—>Library
Target1 建组Library-,全选add
D:\Desktop\江协\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template

头文件包含关系,两个中断函数—>工程的User文件下,keil中User组里加入
宏定义,头文件右键打开文件

定义改字符串,下面的conf头文件才有效
魔术棒C/C++,这样才能包含标准外设库
!注意也要在Asm中包含这些路径!


箱子:

仅需要改动User的文件,将Library文件向上挪动
库函数点灯
使能时钟

两个参数,选择外设和选择状态
右键光标定位跳转到函数定义,上方为函数简介和函数说明

简介:这个函数是用来使能或者失能APB2的外设时钟
第一个参数可以是下面这些值

第二个参数:

cv,注意分号和英文逗号。
函数内部本质还是配置寄存器RCC->APB2ENR

|=和&=的使用不会影响到寄存器的其他位的
配置端口模式
GPIO_Init()

第一个参数为选用哪个GPIO口,第二个参数为GPIO口的结构体
PC13的LED:GPIOC
配置结构体

定义结构体,.引出所有成员变量,

右键跳转Mode,注释里面的值,选中Ctrl+F搜索定义

枚举,选择OUT_PP,复制,即通用推挽输出
光标位于PIN位跳转,弹框原因:多个PIN定义,双击来到Member
宏定义,选中PIN13,cv



所有结构体的参数初始化完成之后,配置GPIO初始化函数的第二个参数:一个指向结构体的指针—>所以我们需要传递结构体的地址。&(&取地址符+结构体名)
固定的GPIO配置流程
定义结构体,初始化所有成员变量,GPIO初始化函数传入所需配置的GPIO口和结构体地址。

设置端口高低电平点灯
GPIO_SetBits():指定端口设置为高电平
GPIO_ResetBits():指定端口设置为低电平


注意事项(了解即可)
启动文件的分类和型号(直接全选cv即可)

新建工程步骤

第四步解决.h文件找不到的问题

第五步使用库函数的条件编译


启动文件是用汇编写的,定义了中断向量表和中断服务函数,复位中断:整个程序的入口。STM32上电复位按下复位按钮,程序进入复位中断函数执行,调用SystemInit()和main(),main函数的最后一定是一个死循环。
只需要#include "stm32f10x.h”就相当于包含了所有库函数头文件的原因


修改寄存器值直接驱动电机
在 STM32 微控制器中,通过操作寄存器完成电机驱动:
是因为这是硬件与软件交互的基础方式。寄存器是 MCU 内部的特定存储单元,直接映射到硬件功能上,通过操作寄存器可以控制硬件的行为。
寄存器是什么
寄存器是微控制器内部的小型存储器,用于存储特定信息(通常是状态或控制信息)。
每个外设模块(如 RCC、GPIO、TIM 等)都通过寄存器暴露功能接口。
- 寄存器分类:
- 控制寄存器:设置硬件的工作模式(如启用/禁用外设、配置时钟源等)。
- 状态寄存器:存储硬件当前的状态信息(如中断标志位)。
- 数据寄存器:用于存储传输中的数据。
操作寄存器的优点
- 高效直接:
- 寄存器操作是直接与硬件交互,速度快且资源消耗低。
- 没有中间抽象层,硬件响应时间最短。
- 标准化接口:
- STM32 的所有外设都通过寄存器暴露功能,统一操作方式便于开发和调试。
- 深入了解硬件:
- 操作寄存器需要阅读数据手册,能更好地理解硬件工作原理。
- 在调试或需要非常精细的控制时,直接操作寄存器更加可靠。
代码思路

知识点
启用GPIOA和TIM2时钟
RCC->AHB1ENR |= (1 << 0);
//使能 GPIOA 外设的时钟,只有时钟信号被使能后,GPIOA 的寄存器才可以被正确访问和操作。
//RCC (Reset and Clock Control):RCC 是 STM32 的时钟管理模块,用于控制所有外设的时钟开关。各个外设的时钟通过 RCC 的寄存器来配置。
//GPIO 外设挂载在AHB1总线,(AHB1ENR)AHB1外设时钟使能寄存器,每一位对应一个AHB1上的外设,置 1 代表使能该外设的时钟。

//GPIOA 时钟使能对应 AHB1ENR 的第 0 位。置 1 代表使能GPIOA时钟。

位移运算
位移运算符是 C 语言中的一种二进制操作符:
左移运算符 (
<<
): 将一个数的二进制位向左移动指定的位数。右移运算符 (
>>
): 将一个数的二进制位向右移动指定的位数。Value<<n:被操作数左移n位


按位或操作(
|
):两个操作数对应位有一个是1,结果就是1;只有两个位都是0,结果才是0;
当需要在寄存器的某些位上设置为 1,但不改变其他位的值时,使用按位或。
// 将第0位置为1

按位与操作(
&
):两个操作数对应位都为1,结果为1,只要有一个是0,结果就是0;
当需要在寄存器中将某些位清零,使用按位与。
按位与和取反结合使用:通过对目标位取反,再与原值按位与,就可清除特定位,同时保护其他位。

// 将第10位和11位(对应PA5)清零, &= ~(11 << (5 * 2));—>(0b)11=0x3
// 写入10复用模式 |= (0x2 << (5*2));
Q:为什么需要保护其他位?
A:在硬件寄存器中,多个位可能控制不同的功能。例如,
MODER
寄存器的每两位决定一个 GPIO 引脚的模式。如果直接将目标位清零,而不小心影响了其他位,可能导致:临近引脚的配置被意外更改。不相关的外设功能被误触发。因此,安全的位操作是:仅修改目标位,而不影响其他位。
//构造掩码
什么是掩码:掩码是一个二进制数,它的每一位对应寄存器中的某一位:
- 掩码中值为 1 的位: 表示目标位(我们关心的位)。
- 掩码中值为 0 的位: 表示非目标位(我们希望忽略的位)。
- 改为二进制码和掩码的优劣
为什么需要掩码:掩码可以确保只操纵目标位,避免对非目标位造成干扰,从而达到安全操作寄存器的功能。
一些汇编



+4,32位。。。。
p137





配置寄存器点灯(F401)
由原理图可知,LD3为电源指示灯,LD2为连接在PA5上的小灯
接入USB5V时,电源指示灯常量,小灯闪烁。


使能GPIOA时钟,由时钟树图可知,GPIOA挂载在AHB1总线上
配置PA5为通用输出模式:01

输出高电平小灯亮,输出低电平小灯熄灭


库函数点灯(F401)
使能GPIOA时钟
配置PA5
输出高电平


注意事项
使能时钟,RCC模块
配置PA5:
配置完模式后,还有一步输出高低电平
点亮小灯:
F103:低电平点亮,高电平熄灭
F401:高电平点亮,低电平熄灭
Q1:LD小灯亮灭为什么会有这种不一样?
小灯的亮灭取决于电压(电势差)
由原理图可知,F103小灯一端为3.3V,所以需要引脚输出一个低电平才能产生电压差使得小灯闪亮。

而F401的小灯一端为GND,所以需要引脚输出一个高电平,才能产生电压差使得小灯闪亮。

- 作者:🐟🐟
- 链接:https://www.imyuyu.top//article/Quadcopter1-1-1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。