技术标签: stm32 学习 # stm32-江科大 单片机
注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。
注:工程及代码文件放在了本人的Github仓库。
本教程使用STM32最小系统板(STM32F103C8T6)+面包板硬件平台进行学习。使用面包板可以完成任意硬件的连接,相比于成品的开发板方式,使用面包板更有利于对硬件电路的学习,而且也可以避免开发板的一些问题(如引脚冲突、引脚无法更改等)。但是,面包板也有缺点,比如实验现象不对有可能时程序接线的问题,所以连线时要更加细心一些。主要套件如下:
STM32是一款32位单片机(51单片机是8位单片机),其中“ST”是ST公司(得捷电子Digi-Key是其官方授权的分销商),“M”则是“MicroController Unit, MCU”的缩写,即STM32基于ARM Cortex-M内核开发的32位微控制器。补充一点概念上的区别(不是非常认同但先这么记着):
- 原理不同:
mcu又称单片微型计算机(Single Chip Microcomputer )或者单片机,重点在于单片。
单片机则是把一个计算机系统集成到一个芯片上,重点在于芯片,相当于微型计算机但缺少I/O设备。- 指代对象不同:
MCU是指单片微型计算机或者单片机。单片机则是微型计算机家族中的一个分支而已。- 范畴不同:
CPU有三个分支:DSP、MCU(Micro Control Unit,微控制器单元)、MPU(Micro Processor Unit,微处理器单元)。
单片机是MCU中最具有代表性,是MCU的实现。- 功能不同。
MCU在不同的场合有不同的应用。例如手机、遥控器甚至汽车电子和机器手臂的控制等都有涉及。
单片机的使用领域比MCU的要更为广泛,从家用电器和通讯设备到智能仪表以及导航系统都有应用。- 用途不同:
MCU倾向于不同信息源的多种数据的处理诊断和运算,更侧重于控制。
而单片机就是一块芯片,主要是对数据进行高速化处理。注:但通常认为MCU和单片机概念等价。
STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器,常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等。下面是ST公司官网上对于自家STM32 MCU的产品型号介绍:
注:通常来说,无线wifi都用esp,用stm32的个人玩家很少。
ARM既指ARM公司,也指ARM处理器内核。ARM公司是全球领先的半导体知识产权(IP)提供商(只设计内核,不生产实物),全世界超过95%的智能手机和平板电脑都采用ARM架构。ARM公司设计ARM内核,半导体厂商完善内核周边电路并生产芯片。ST公司就是ARM公司的授权厂商之一。下面是ARM公司设计的内核系列:
根据上图,ARM针对不同的应用场景设计了不同型号的内核。经典款逐渐不够用之后,AREM公司推出了新一代的Cortex内核来满足市场需求,并推出了Cortex-A、Cortex-R、Cortex-M三种系列。通常,A系列适用于高端应用领域(如手机芯片),R系列主要针对实时处理领域(如硬盘监控器),M系列适用于单片机领域。
下图的左侧是所有STM32芯片的内部结构示意图。可以看出ARM公司设计的内核只是其中的一部分(但最关键,相当于CPU),其他公司围绕着这个内核设计一系列外围电路配合其工作,进而发挥内核的性能。右侧图则给出了本节课程所使用的STM32芯片:STM32F103C8T6。
STM32F103C8T6主要指标:
系列:主流系列STM32F1
内核:ARM Cortex-M3
主频:72MHz
RAM(运行内存):20K(SRAM)
ROM(程序存储器):64K(Flash)
供电:2.0~3.6V(标准3.3V)。由于USB供电是5V,所以还要加稳压芯片。(注:51单片机为5V供电)
封装:LQFP48
英文缩写 | 名称 | 补充说明 | 英文缩写 | 名称 | 补充说明 |
---|---|---|---|---|---|
NVIC | 嵌套向量中断控制器 | 内核中用于管理中断的设备,如配置中断优先级。 | CAN | CAN通信 | 常用于汽车领域。 |
SysTick | 系统滴答定时器 | 内核中的定时器,给操作系统(如FreeRTOS、UCOS等)提供定时服务,以完成任务切换。 | USB | USB通信 | 可以做模拟鼠标、模拟U盘等设备。 |
RCC | 复位和时钟控制 | 使能各模块时钟,上电默认其他外设模块均无时钟。 | RTC | 实时时钟 | 可接备用电池,掉电保持运行。 |
GPIO | 通用IO口 | 可以用GPIO来点灯、读取按键等。 | CRC | CRC校验 | — |
AFIO | 复用IO口 | 可以完成复用端口的重定义,中断端口的配置。 | PWR | 电源控制 | 可使芯片进入睡眠模式,节能。 |
EXTI | 外部中断 | 引脚有电平变化会触发中断。 | BKP | 备份寄存器 | 接备用电池,掉电保存数据。 |
TIM | 定时器 | 最常用,功能最多的外设,可以测频率、生成PWM波等。分为高级定时器、通用定时器(最常用)、基本定时器。 | IWDG | 独立看门狗 | 当程序死机或死循环时,复位程序。 |
ADC | 模数转换器 | 芯片内的12位ADC外设,无需外接AD芯片。 | WWDG | 窗口看门狗 | |
DMA | 直接内存访问 | 帮助CPU搬运大量数据。 | DAC | 数模转换器 | — |
USART | 同步/异步串口通信 | 异步串口UART应用更多。 | SDIO | SD卡接口 | 用于读取SD卡数据。 |
I2C | I2C通信 | — | FSMC | 可变静态存储控制器 | 用于扩展内存,或配置成其他总线协议。 |
SPI | SPI通信 | — | USB OTG | USB主机接口 | 让STM32作为USB主机,读取其他设备。 |
注意:
- 前两个加粗资源表示是位于Cortex-M3内核里面的外设,剩下的都是位于内核之外的外设。
- 上表给出的是STM32F1系列芯片中所有的外设,而具体到STM32F103C8T6芯片,则不包含最后4种外设。
- 关于芯片外设的具体介绍,可以参考数据手册《STM32F10xxx参考手册》、《STM32F103x8B数据手册》。
首先来看看STM32的芯片系统结构(只需要大致了解一下即可):
- Cortex-M3:内核。注意ICode、DCode、System是直接从内核引出的三根总线。
- Flash:存储编写的程序。ICode总线和DCode总线主要用于连接Flash闪存。
- SRAM:用于存储程序运行时的变量数据。
- ICode:指令总线。加载程序指令。
- DCode:数据总线。加载数据,如常量和调试参数。
- System:系统总线。连接到Flash以外其他外设上,如SRAM、FSMC(本课程不会用到)。
- AHB系统总线:先进高性能总线。用于挂载最基本的(如复位和时钟控制RCC、SDIO)、或者性能比较高的外设。
- APB2、APB1:先进外设总线。用于连接一般的外设。通常AHB(72MHz)性能总体高于APB,而APB2(72MHz)性能高于APB1(36MHz)。所以APB2连接外设中稍微重要的部分,如GPIO、各外设的1号接口;剩下的次要外设给APB1。
- 桥接2、桥接1:由于AHB和APB的总线协议、 总线速度、数据传输格式上的差异,需要加上2个桥接,来完成数据的转换和缓存。
- DMA2、DMA1:拥有和CPU相同的总线控制权,用于帮助CPU完成数据搬运这样简单但重复的活,相当于CPU的小秘书。若外设需要进行数据搬运,那么会直接找DMA(DMA请求),DMA就会获得总线控制权来搬运数据,整个过程无需CPU的参与。
上图给出了UP主自己做的STM32F103C8T6引脚定义。一些说明如下:
- 标红色的是电源相关的引脚,标蓝色的是最小系统相关的引脚,标绿色的是IO口、功能口引脚。所以 最小系统板主要关心红色和蓝色部分。
- 类型:S代表电源、I代表输入、O代表输出、I/O代表输入输出。
- I/O口电平:表示I/O所能容忍的电压,默认3.3V,FT表示5V。注意没有FT标志的引脚都需要加装电平转换电路。
- 主功能:上电默认功能。
- 默认复用功能:I/O口上同时连接的外设功能引脚,配置IO口时可以设置是主功能/复用功能。
- 重定义功能:如果需要某一个端口上实现两个功能,那么可以将其中一个功能重映射到另一个空闲端口上,这个空闲端口的重定义功能需要包含相应的功能。
- 推荐优先使用加粗的IO口,没有加粗的可能需要配置或兼具其他功能,使用时需要注意。
下面来一一介绍这些引脚的功能(包括PA0~PA15、PB0~PB15、PC13~PC15、9个供电、2个时钟、1复位、1个BOOT0):
- 引脚1:备用电池供电。可接3V电池,系统断电时为芯片内部的RTC和备用寄存器提供电源。
- 引脚2:IO口/入侵检测/RTC。IO口输出或读取高低电平;入侵检测提供安全保障,可以将外部一些防拆的触点接在此端口,若触点电平变化,STM32芯片会自动清空寄存器数据;RTC可输出RTC校准时钟、RTC闹钟脉冲、秒脉冲。
- 引脚3、4:IO口/32.765kHzRTC晶振。
- 引脚5、6:系统主晶振,一般8MHz,芯片内的锁相环电路将时钟倍频成72MHz作为系统主时钟。
- 引脚7:系统复位引脚。N表示低电平复位。
- 引脚8、9:芯片内部模拟部分的电源,如ADC、RC振荡器等。VSS接地、VDD接3.3V。
- 引脚10~19、21~22、25~33、41~43、45~46:共26个默认普通IO口。 其中的PA0兼具WKUP功能,用于唤醒处于待机状态的STM32。
- 引脚20:IO口/BOOT1引脚。BOOT1引脚用于控制启动模式。
- 引脚23/24、35/36、47/48:系统的主电源口。STM32采用分区供电的方式,所以供电口多。
- 引脚34、37~40:IO口/调试端口。STM32支持SWD和JTAG两种调试方式。SWD只需SWDIO、SWCLK两根线;JTAG需要全部的5根。教程使用STLINK(SWD)下载程序,此时剩余3个引脚可配置成IO口。
- 引脚44:BOOT0,和BOOT1配合,用于启动配置。启动配置就是指定程序开始运行的位置,一般程序在Flash程序存储器中运行,但在某些情况下可以指定程序在别的地方开始执行以完成特殊功能。
- “主闪存存储器”启动模式最常用。
- “系统存储器”模式用于串口下载程序,系统存储器中存储的是一段STM32的BootLoader程序,其作用就是接收串口数据然后刷新到主闪存中。当5个调试端口全被配置成IO口时,单片机将无法再下载程序!! 此时只能使用串口下载程序的方式进行补救。另外,当手头上没有STLINK和JLINK,也可以使用串口来下载程序,通俗来说就是“刷机”。
- “内置SRAM”模式主要用于程序调试,使用较少,本教程不会出现。
- 注意BOOT值是在上电一瞬间(第4个时钟上升沿)有效,后面随意,即BOOT1引脚后续会变成普通IO口。
上面给出了STM32最小板的原理图。单片机只有一个芯片无法正常工作,还需要连接一些最基本的电路,称之为最小系统电路。即,最小板仅保留引脚中的电源部分(红色)和最小系统部分(蓝色)。
- STM32及供电:连接了4个电源进行分区供电,每个电源的正负极之间都加了滤波电容滤除电源波纹。备用电源VBAT有需要就接上。
- 晶振:8MHz主时钟,内部锁相环倍频到72MHz主频。C1、C2是两个起振电容。若需要RTC功能还需要接32.768kHz晶振,这个晶振经过215分频就可以得到1s的计数。
- 复位:给单片机提供复位信号,低电平复位。C3保证上电瞬间NRST为低电平,后续充电变成高电平。左侧并联的按键提供手动复位的功能。
- 启动配置:拨动中间的开关就可以让BOOT1、BOOT0引脚选择相应的高低电平了。开发板上选择了跳线帽实现。
- 下载端口:使用STLINK下载程序,需要将SWDIO、SWCLK两个引脚接出来方便引线,GND必须引出来,3.3V供电可以不引,但是建议这四个引脚都引出来。
- 没有给出的稳压芯片:常用的5V转3.3V稳压芯片有XC6204、XC6206、AMS1117等。
文章浏览阅读801次。本系列文章将向大家讲述华为网关AR502H的开发方法。本文介绍OVF和OVA的区别。一、什么是OVF文件开源虚拟化格式OVF文件是一种开源的文件规范,它描述了一个开源、安全、有效、可拓展的便携式虚拟打包以及软件分布格式,它一般有几个部分组成,分别是ovf文件、mf文件、cert文件、vmdk文件和iso文件。二、OVF文件工作原理以及各组件的作用简单来说,OVF文件可以抽象看做一个由规定的几个不同类型的文件所组成的文件包,这个文件包可作为以后不同虚拟机之间一个标准可靠的虚拟文件格式,实现_ova/ovf
文章浏览阅读2.6k次。问题:flask+vue时,flask的网址可正常访问,但从vue访问返回【Error: Network Error】解决方案:在flask里 加一句:CORS(app, supports_credentials=True)解决跨域问题,服务端把CORS配置好,或者用node做代理层访问API浏览器访问时,对跨域请求进行了组织, 而vue的response没有, 所以用浏览器是可以进行请求的并且请求成功了, 但是vue肯定是不行的.开发环境的话可以通过Cors做一个中间层进行代理,js发_vue network error
文章浏览阅读339次。目录第一个JAVA程序的总结和提升注释数据类型整数变量整型常数的三种表示形式进制转换浮点型字符型(2个字节)boolean类型(一位,不是一个字节)类型转换自动类型转换强制类型转换运算时类型提升问题基本类型转化时常见错误和问题第一个JAVA程序的总结和提升Java对大小写敏感,如果出现了大小写拼写错误,程序无法运行关键字cass表明Java程序中的全部内容都包含在类中,Java是一种面向对象的语言。 main方法是Java应用程序的入口方.._1.8^308
文章浏览阅读952次。旅游预算描述一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同。旅游预算有如下规则: 若油箱的油过半,不停车加油,除非油箱中的油不可支持到下一站;每次加油时都加满;在一个加油站加油时,司机要花费2元买东西吃;司机不必为其他意外情况而准备额外的油;汽车开出时在起点加满油箱;计算精确到分(1元=100分)。编写程序估计实际行驶在某路线所需的最小费用。输入第一行为起点到终点的距离(实数) 第二行为三个实数,后跟一个整数,每两个数据间用一个空格隔开。其中第一个数_旅游预算算法设计图示
文章浏览阅读415次。1. Xcode是一个非开源的IDE,即集成开发环境(Integrated Development Environment)。2. Xcode是用于(桌面级的)OS X和(移动级的)iOS开发。3. Xcode包括:> 设备分析工具(Instruments analysis tool)> iOS模拟器(iOS Simulator)> OS (OS Frameworks) :_ios sdk如何混淆
文章浏览阅读482次。计算机辅助求解一元高次方程.pdf应用研究 数字技术与应用计算机辅助求解一元高次方程李艳(潍坊职业学院信息工程学院 山东潍坊 261041)摘要:本文主要介绍了使用计算机辅助求解..._计算机解高次方程
文章浏览阅读2.3w次。/// 自定义包含指定字符的base64工具 internal static class Base64Helper { static readonly string base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"; static read_base64去掉等号不能被四整除
文章浏览阅读2.5k次。函数对象(也叫functor),听起来或许有点陌生,但他们是c++实体,即使你没有用过,也一定见过,只是你没有意识到而已。从概念上讲,函数对象时用作函数的对象;但是从实现上来说,函数对象时实现了 operate()的类的对象。虽然函数和函数指针也可以归为函数对象,但实现了operate()的类的对象才能保存状态,才能用于STL。\quad我们直接看定义: - 一元函数:接受一个参数的函数,如f(x
文章浏览阅读815次。前言:"懒"在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒cocos2d-x程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致!一.懒人说书Android.mk中LOCAL_SRC_FILES需要罗列出所有参与编译的文件,这样在.cpp文件少的时候还可以一个一个添加,当有几百个文件的时候会十分的痛苦!我们下
文章浏览阅读1.3k次。Linux nc常用命令Linux中nc命令是一个功能强大的网络工具,全称是netcat。 nc/netcat(选项)(参数) 选项:-g<网关>:设置路由器跃程通信网关,最多设置8个;-G<指向器数目>:设置来源路由指向器,其数值为4的倍数;-h:在线帮助;-i<延迟秒数>:设置时间间隔,以便传送信息及扫描通信端口;-l:使用监听模式,..._nc -nv命令
文章浏览阅读1.1k次。错误:描述2018-03-09 10:41:08 5128 [Note] InnoDB: Highest supported file format is Barracuda.2018-03-09 10:41:08 5128 [Note] InnoDB: 128 rollback segment(s) are active.2018-03-09 10:41:08 5128 [Note] Inn..._gtid主从配置是否需要开启skip_slave_start
文章浏览阅读1.5k次。private static String readUrlFile(String url) { BufferedReader reader = null; StringBuilder content = new StringBuilder(); try { URL httpUrl = new URL(url); String line = null; CookieHandler.set.