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

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

片上资源/外设(Peripheral)

通过程序配置外设来完成我们想要的功能。
notion image
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:看门狗,当单片机因为电磁干扰死机/程序设计不合理出现死循环时,看门狗可以及时复位芯片,保证系统的稳定。

系统结构

notion image
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一样的总线控制权,用于访问外设。

引脚定义

notion image
红色:电源相关引脚;蓝色:系统相关引脚;绿色:IO口,功能口的引脚;
类型:S:电源;I/O:输入输出
IO口电平 :IO口所能容忍的电压;FT:表示能容忍5V的电压;没有FT代表只能容忍3.3V的电压。(如果需要5V,需要接电平转换电路。)
主功能:上电的默认功能
默认复用功能:IO口上同时连接的外设的功能引脚。配置IO口时可以选择为通用IO口或者复用功能。
重定义功能:如果两个功能同时复用在了一个IO口上,但又确实需要用到这两个功能,那么可以将其中一个复用功能重新映射到其他端口上。
notion image
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即可。
notion image
34号,37~40号:IO口或者调试端口。默认的主功能为调试功能,调试功能就是用来调试程序和下载程序的。STM32F103支持两种调试方式:第一种为SWD,需要两根线SWDIO和SWCLK。第二种为JTAG需要五根线:JTMS\JTCK\JTDI\JTDO\NJTRST。
STLINK来下载调试程序,为SWD方式。只需要占用PA13和PA14这两个IO口。此时的PA15,PB2,PB4可以切换为普通的IO口来使用但需要程序进行配置)

启动配置

notion image
作用:指定程序开始运行的位置。
一般情况下,程序都是在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最小系统电路

notion image
单片机只有一个芯片是无法工作的。使其工作的最基本电路为最小系统电路。
STM32工作→电源部分和最小系统部分的电路连接好。
notion image
STM32及供电:三个分区供电(VSS,VDD_123)和一个模拟电压(VSSA,VDDA)均VSS连接GND,VDD连接3.3V。3.3V和GND之间一般会连接一个滤波电容,保证供电电压的稳定,设计电路时应该注意。VBAT接备用电池,eg纽扣电池正极接VBAT负极接地为RTC和备用寄存器服务,也可不接悬空。
notion image
 
晶振电路:8MHz的主时钟晶振,内部所向环倍频得到72MHz的主频。两个引脚根据网络编号,分别连接到STM32的5、6号引脚,20pf的电容作为起振电容,另一端接地。
RTC功能:32.768KHz的晶振,晶振电路如图,接在3,4号引脚。(OSC32:即32.768KHz晶振,2的15次方,内部的RTC电路经过2的15次方分频,就可以生成1s的时间信号。)
notion image
复位电路:为单片机提供复位信号。
NRST接在7号引脚,为低电平复位。上电瞬间电容没电,电源向电容充电,电容呈现短路状态,NRST引脚产生低电平。电容逐渐充满电,电容为断路,NRST会被R1上拉为高电平。低电平提供复位信号,电容充电速度很快,因此我们认为单片机在上电瞬间就复位了。
并联K1按键,提供手动复位的功能。按下按键,NRST接地(电容放电),手动提供低电平复位信号。松开后NRST从低电平复位状态转变为高电平工作状态。
notion image
BOOT启动配置电路:BOOT引脚接地/接电源→启动模式。
notion image
STLINK方式:3.3V,GND,SWDIO和SWCLK都引线引出。
核心板原理图:
notion image
复位电路,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供电。)
notion image
STM32F103C8T6芯片,左侧两个跳线帽配置BOOT引脚,下面为复位按键,再左USB接口。
右侧金属外壳:8MHz主时钟晶振,黑色为32.768KHzRTC晶振,两个LED(上面为PWR电源指示灯,下面为PC13口的测试灯),SWD的调试接口(下载程序),上下两排为用于接线的排针。背后3.3V稳压芯片。
 
 
 
 

STM32F401RET6

64引脚,512K闪存,LQFP封装
notion image

外设总览

notion image

引脚定义

notion image
notion image
notion image

寄存器的地址边界

notion image
notion image
notion image

一些重要的原理图

notion image
Nucleo—F401RE操作手册
四张原理图:
第一张图为总览:接下来介绍的三个部分分别是MCU,ST_LINK,Connectors
notion image
第二张图为STM32F401RET6总览:
(两块芯片都是401,两块是因为64个引脚数量多连接复杂,所以需要画两块)
notion image
第三张图为STLINK
notion image
第四张图为Connectors
notion image

新建工程

工程的作用—>文件夹名(便于修改)
工程名(不方便修改)
STM32启动文件:
D:\Desktop\江协\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
C+V—>工程的启动文件夹Start
notion image
第一个是寄存器文件描述,后两个system为配置72MHz时钟—>Start
notion image
内核的启动文件—>Start
回到Keil,将刚刚复制的文件添加到工程里(修改为同名文件夹)
文件图标上的小钥匙—>表示这个为只读文件
工程选项里面添加上头文件路径,使得软件能够找到.h文件。
魔术棒—>C/C++—>Include Paths—>添加start文件夹的路径,即将头文件路径加入。
!!!!注意ASM中的include paths也应该加入路径!!
notion image
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的错误。
notion image
notion image

配置寄存器点灯(F103)

PC13
使能GPIOC时钟
二进制数据—>十六进制数据,4个一分组
notion image
配置PC13口的模式
notion image
CNF:通用推挽输出模式—>00
MODE:最大输出模式11
0011:换算成16进制为3
00300000
端口输出:1为高电平,0为低电平。灯为低电平点亮,所以当ODR全为0就是亮。
0x00000000亮,0x00002000灭
notion image
编译下载
notion image
如果这样写,那么会将其他端口的位也变为0,可能会导致影响到其他端口的原有配置,如果需要做到只配置PC13而不影响其他位,&=与|=

库函数点灯(F103)

新建库函数工程

工程文件夹—>Library(存放库函数)
D:\Desktop\江协\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver
notion image
src:第一个为内核的库函数,其他为内核外的外设库函数,全选cv—>Library
inc:库函数的头文件,全选cv—>Library
Target1 建组Library-,全选add
 
D:\Desktop\江协\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
notion image
头文件包含关系,两个中断函数—>工程的User文件下,keil中User组里加入
 
宏定义,头文件右键打开文件
notion image
定义改字符串,下面的conf头文件才有效
魔术棒C/C++,这样才能包含标准外设库
!注意也要在Asm中包含这些路径!
notion image
notion image
箱子:
notion image
仅需要改动User的文件,将Library文件向上挪动

库函数点灯

💡
使能时钟
notion image
两个参数,选择外设和选择状态
右键光标定位跳转到函数定义,上方为函数简介和函数说明
notion image
简介:这个函数是用来使能或者失能APB2的外设时钟
第一个参数可以是下面这些值
notion image
第二个参数:
notion image
cv,注意分号和英文逗号。
函数内部本质还是配置寄存器RCC->APB2ENR
notion image
|=和&=的使用不会影响到寄存器的其他位的
💡
配置端口模式
GPIO_Init()
notion image
第一个参数为选用哪个GPIO口,第二个参数为GPIO口的结构体
PC13的LED:GPIOC
配置结构体
notion image
定义结构体,.引出所有成员变量,
notion image
右键跳转Mode,注释里面的值,选中Ctrl+F搜索定义
notion image
枚举,选择OUT_PP,复制,即通用推挽输出
光标位于PIN位跳转,弹框原因:多个PIN定义,双击来到Member
宏定义,选中PIN13,cv
notion image
notion image
notion image
所有结构体的参数初始化完成之后,配置GPIO初始化函数的第二个参数:一个指向结构体的指针—>所以我们需要传递结构体的地址。&(&取地址符+结构体名)
💡
固定的GPIO配置流程
定义结构体,初始化所有成员变量,GPIO初始化函数传入所需配置的GPIO口和结构体地址。
notion image
💡
设置端口高低电平点灯
GPIO_SetBits():指定端口设置为高电平
GPIO_ResetBits():指定端口设置为低电平
notion image
notion image
 

注意事项(了解即可)

启动文件的分类和型号(直接全选cv即可)
notion image
新建工程步骤
notion image
第四步解决.h文件找不到的问题
notion image
第五步使用库函数的条件编译
notion image
notion image
启动文件是用汇编写的,定义了中断向量表和中断服务函数,复位中断:整个程序的入口。STM32上电复位按下复位按钮,程序进入复位中断函数执行,调用SystemInit()和main(),main函数的最后一定是一个死循环。
只需要#include "stm32f10x.h”就相当于包含了所有库函数头文件的原因
notion image
notion image
 
 

修改寄存器值直接驱动电机

在 STM32 微控制器中,通过操作寄存器完成电机驱动:
是因为这是硬件与软件交互的基础方式。寄存器是 MCU 内部的特定存储单元,直接映射到硬件功能上,通过操作寄存器可以控制硬件的行为。

寄存器是什么

寄存器是微控制器内部的小型存储器,用于存储特定信息(通常是状态或控制信息)。
每个外设模块(如 RCC、GPIO、TIM 等)都通过寄存器暴露功能接口。
  • 寄存器分类
    • 控制寄存器:设置硬件的工作模式(如启用/禁用外设、配置时钟源等)。
    • 状态寄存器:存储硬件当前的状态信息(如中断标志位)。
    • 数据寄存器:用于存储传输中的数据。

操作寄存器的优点

  1. 高效直接:
    1. 寄存器操作是直接与硬件交互,速度快且资源消耗低。
    2. 没有中间抽象层,硬件响应时间最短。
  1. 标准化接口:
    1. STM32 的所有外设都通过寄存器暴露功能,统一操作方式便于开发和调试。
  1. 深入了解硬件:
    1. 操作寄存器需要阅读数据手册,能更好地理解硬件工作原理。
    2. 在调试或需要非常精细的控制时,直接操作寄存器更加可靠。

代码思路

notion image

知识点

启用GPIOA和TIM2时钟

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

位移运算

位移运算符是 C 语言中的一种二进制操作符:
左移运算符 (<<): 将一个数的二进制位向左移动指定的位数。
右移运算符 (>>): 将一个数的二进制位向右移动指定的位数。
Value<<n:被操作数左移n位
notion image
notion image
按位或操作(|):
两个操作数对应位有一个是1,结果就是1;只有两个位都是0,结果才是0;
当需要在寄存器的某些位上设置为 1,但不改变其他位的值时,使用按位或。
// 将第0位置为1
notion image
按位与操作(&):
两个操作数对应位都为1,结果为1,只要有一个是0,结果就是0;
当需要在寄存器中将某些位清零,使用按位与。
按位与和取反结合使用:通过对目标位取反,再与原值按位与,就可清除特定位,同时保护其他位。
notion image
// 将第10位和11位(对应PA5)清零, &= ~(11 << (5 * 2));—>(0b)11=0x3
// 写入10复用模式 |= (0x2 << (5*2));
 
Q:为什么需要保护其他位?
A:在硬件寄存器中,多个位可能控制不同的功能。例如,MODER 寄存器的每两位决定一个 GPIO 引脚的模式。如果直接将目标位清零,而不小心影响了其他位,可能导致:临近引脚的配置被意外更改。不相关的外设功能被误触发。
因此,安全的位操作是:仅修改目标位,而不影响其他位。
//构造掩码
什么是掩码:掩码是一个二进制数,它的每一位对应寄存器中的某一位:
  • 掩码中值为 1 的位: 表示目标位(我们关心的位)。
  • 掩码中值为 0 的位: 表示非目标位(我们希望忽略的位)。
  • 改为二进制码和掩码的优劣
为什么需要掩码:掩码可以确保只操纵目标位,避免对非目标位造成干扰,从而达到安全操作寄存器的功能。
一些汇编
notion image
notion image
notion image
+4,32位。。。。
p137
notion image
notion image
notion image
notion image
notion image
 

配置寄存器点灯(F401)

由原理图可知,LD3为电源指示灯,LD2为连接在PA5上的小灯
接入USB5V时,电源指示灯常量,小灯闪烁。
notion image
notion image
 
使能GPIOA时钟,由时钟树图可知,GPIOA挂载在AHB1总线上
配置PA5为通用输出模式:01
notion image
 
输出高电平小灯亮,输出低电平小灯熄灭
notion image
notion image

库函数点灯(F401)

使能GPIOA时钟
配置PA5
输出高电平
notion image
notion image

注意事项

使能时钟,RCC模块
配置PA5:
配置完模式后,还有一步输出高低电平
点亮小灯:
F103:低电平点亮,高电平熄灭
F401:高电平点亮,低电平熄灭
Q1:LD小灯亮灭为什么会有这种不一样?
小灯的亮灭取决于电压(电势差)
由原理图可知,F103小灯一端为3.3V,所以需要引脚输出一个低电平才能产生电压差使得小灯闪亮。
notion image
而F401的小灯一端为GND,所以需要引脚输出一个高电平,才能产生电压差使得小灯闪亮。
notion image
 
 
Notion使用小指南喵~嵌入式操作系统
Loading...
🐟🐟
🐟🐟
在坚冰还盖着北海的时候,我看到了怒放的梅花
最新发布
四轴飞行器
2025-4-16
Notion使用小指南喵~
2025-4-16
Hi3861 & 服创
2025-4-16
Git
2025-4-16
嵌入式操作系统
2025-3-28
C2驾驶证考试
2025-3-13
公告
🎉NotionNext 3.15已上线🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏