本文作为追随老顽童孟瑞生老师 [瑞生网] 学习STM32单片机系列教程笔记,一来方便将其微信公众号推送教程移至PC端,方便观看学习;二来,也是更重要的,有些思考的地方,或者觉得说的很好的地方,也好记录留档。
最新一次更新: 第9集,时间2016-03-12。
视频教程第一集
链接:点击跳转至原文
笔记:
+ 开发板拆装(主要是液晶屏)、液晶屏FPC排线。
+ 液晶屏16位驱动、8位驱动、SPI驱动,16位、8位应该说的是并口吧。
+ 短路帽。
+ 供电,电脑USB口输出5V,普通安卓手机充电器输出也是5V。
+ USB口,白底在下,从右至左依次为V+=5V、D-、D+、GND,中间为数据引脚,两侧为电源引脚。
+ 5V 2A
电流是其最大输出量,最大可输出2A,电流输出多少看负载。
+ CAN通讯、485通讯、232通讯、NRF24L01无线通讯、红外发射、红外接收。
+ EEPROM vs FLASH
EEPROM:一个字节一个字节地写,随意写无需擦除。
FLASH:一个扇区一个扇区(4K)地写,容量大,需要先擦除才能写入。
短路帽介绍
链接:点击跳转至原文
笔记:
+ 当你想让单片机一上电,就运行单片机中的程序,需要再上电之前,就把BOOT0引脚接地,BOOT1引脚无所谓高低,这也是为什么BOOT1引脚还可以作为其它复用功能的原因。
+ 你的疑问:开发板上,默认的短路帽配置是BOOT0和BOOT1都是低电平,也就是配置成了表中的第一种方式,就是一上电就默认运行单片机中的程序,那为什么还可以用串口下载程序?答:这是因为在串口下载程序时,开发板上的CH340这个芯片上的RTS引脚可以控制BOOT0引脚变高变低(查看原理图可知,此处采用短路帽兼容普通的BOOT0高、低电平连接方式)。
+ IR是PB0,即PB0控制红外接收;IE是PB1,即PB1控制红外发射。
+ FLASH存储芯片 SPI接口:W25Q_CS→PA4;SPI1_SCK→PA5;SPI1_MISO→PA6;SPI1_MOSI→PA7。
+ RS485接口:485_CTR→PA1;TXD2→PA2;RXD2→PA3。
+ 蜂鸣器:BEEP→PD6。
+ CAN通信:CAN_RX→PB8;CAN_TX→PB9。
+ EEPROM存储芯片 I2C接口:I2C1_SCL→PB6;I2C2_SDA→PB7。
+ CH340芯片 ISP下载接口:TXD1→PA9;RXD1→PA10。
+ RS232通信端口:TXD3→PB10;RXD3→PB11。
电源部分
链接:点击跳转至原文
笔记:
+ 5V输出,实际上就是从USB口输入的5V经过了一个500mA的保险丝。3.3V输出,实际上就是通过AMS1117把5V转换成的3.3V输出。
+ 输出电流最大500mA,这是由那个500mA的保险丝决定的。
+ 有些人问我,可不可以从这个5V输出口供电?答案是可以,你只要保证你的输入电压最好在5V左右,不要相差太多即可。)
+ 500mA的保险丝电流超过500mA自动断开但不会坏掉,电流低于500mA时自动导通。
+ 电流指示灯的限流电阻2K,其实>330Ω都是可以的,限流电阻越小,指示灯越亮。
+ 万用表的通断档。使用时注意不要将5V、3.3V和GND碰接,造成短路。
+ 六脚开关焊接的时候不需要区分方向。
单片机 STM32 的引脚模式设置
链接:点击跳转至原文
注: 参考博文 《STM32中GPIO的8种工作模式!》
笔记:
+ 寄存器 or 库开发?
如果你是用 直接写寄存器 来配置的话,那么,看上手册,给 “配置寄存器” 对应的位写 0 或者 1 就可以达到目的。如下图:
如果是用 库函数 来配置的话,就需要知道下面这个结构体中的变量代表的意义。
库函数,选择好 GPIO_Mode 之后,就要使用 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 函数来配置,你可以打开这个配置函数,实际上也是在对 “配置寄存器” 进行写操作。
先解释一下这个结构体中的各个变量的意思:
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: 复用推挽输出模式
前四个是输入模式,后四个是输出模式。
+ 结构图(本人整理部分)
最右端为 I/O 引脚,左端的器件位于芯片内部。I/O 引脚并联了两个用于保护的二极管 ,可以防止外部电流倒灌。
+ 4种输入模式(本人整理部分)
结构图的上半部分为输入模式结构,分为 上拉输入模式、下拉输入模式、浮空输入模式 和 模拟输入模式。
两个保护二极管进来,接下来就遇到了两个开关和电阻,与 $V_{DD}$ 相连的为上拉电阻,与 $V_{SS}$ 相连的为下拉电阻。再连接到 TTL 施密特触发器就把电压信号转化为 0、1 的数字信号存储在输入数据寄存器(IDR)。我们可以通过设置配置寄存器(CRL、CRH)来控制这两个开关,于是就可以得到 GPIO 的上拉输入模式 (GPIO_Mode_IPU) 和下拉输入模式 (GPIO_Mode_IPD) 了。
从它的结构我们就可以理解,若 GPIO 引脚配置为上拉输入模式,在默认状态下 (GPIO 引脚无输入),读取得的 GPIO 引脚数据为 1,高电平。而下拉模式则相反,在默认状态下其引脚数据为 0,低电平。 [ 上拉输入默认是高电平,外接低电平有影响,故只能用来检测外接低电平;下拉模式则相反,故只能用来检测外接高电平 ]
而 STM32 的浮空输入模式 (GPIO_Mode_IN_FLOATING) 在芯片内部既没有接上拉,也没有接下拉电阻,经由触发器输入。配置成这个模式直接用电压表测量其引脚电压为 1 点几伏,这是个不确定值 (高、低电平都有可能);由于其输入阻抗较大,一般把这种模式用于标准的通信协议如 $I^2C$、$USART$ 的接收端。 [ 可以用来检测外接是高电平,还是低电平 ]
模拟输入模式(GPIO_Mode_AIN )则关闭了施密特触发器,不接上、下拉电阻,经由另一线路把电压信号传送到片上外设模块 (如传送至 ADC 模块,由 ADC 采集电压信号,所以使用 ADC 外设的时候,必须设置为模拟输入模式)。 [ 不管外接是高电平还是低电平,始终是检测到低电平。。。没意义了 ]
另外,经测试,开漏输出模式 也能够实现正常检测高低电平,而且默认状态是高电平;
推挽输出模式 似乎也能检测,不过建议还是不要这样做。。。
+ 4种输出模式(本人整理部分)
结构图的下半部分为输出模式结构,分为 推挽输出模式、开漏输出模式、复用推挽输出模式 和 复用开漏输出模式。线路经过一个由 P-MOS 管和 N-MOS 管组成的单元电路。
所谓推挽输出模式,是根据其工作方式来命名的:在输出高电平时,N-MOS 管导通(使输出接地) ;低电平时,P-MOS 管导通(输出高电平)。两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为 0 伏(void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)),高电平为 $V_{DD} = 3.3$ 伏(void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin))。 [ 推挽输出模式默认输出低电平,另外,必须配置引脚输出速率,否则会导致输出紊乱 ]
在开漏输出模式时,如果我们控制输出为 0,低电平,则使 N-MOS 管导通,使输出接地(void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)),若控制输出为 1 (无法直接输出高电平),则既不输出高电平,也不输出低电平,为高阻态(高阻态就是电阻很大,或者说是趋向无穷大,用来隔开相当于断开但又不是真的断开)。为正常使用时必须在外部接上一个上拉电阻。它具有“线与”特性,即很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平,0 伏。
博客中关于 开漏输出模式 和 推挽输出模式 的阐述如下:
一、推挽输出:
可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由 IC 的电源决定。
推挽电路是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
二、开漏输出:
输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般 20mA 以内)。开漏形式的电路有以下几个特点:
1、 利用外部电路的驱动能力,减少 IC 内部的驱动。当 IC 内部 MOSFET 导通时,驱动电流是从外部的 VCC 流经上拉电阻、MOSFET 到 GND。IC 内部仅需很小的栅极驱动电流。
2、 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是 通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供 TTL/CMOS 电平输出等(上拉电阻的阻值决定了逻辑电平转换的速度。阻值越大,速度越低功耗越小,所以 负载电阻的选择要兼顾功耗和速度)。
3、 开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
4、 可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成 “与逻辑” 关系,即 “线与”。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑 0,相当于接地,与之并联的回路 “相当于被一根导线短路”,所以外电路逻辑电平便为 0,只有都为高电平时,与的结果才为逻辑 1。
关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:
① 左边的便是推挽输出模式,其中比较器输出高电平时下面的 PNP 三极管截止,而上面 NPN 三极管导通,输出电平 $V_{S+}$;当比较器输出低电平时则恰恰相反,PNP 三极管导通,输出和地相连,为低电平。
② 右边的则可以理解为开漏输出形式,需要接上拉:控制输出为 0,低电平,则使 N-MOS 管导通,输出 Out 接地;控制输出为 1,高阻态,输出 Out 的电压为外部上拉电阻所接电源的电压$V_{S+}$
STM32 的 GPIO 输出模式就分为 普通推挽输出(GPIO_Mode_Out_PP)、普通开漏输出(GPIO_Mode_Out_OD)及 复用推挽输出(GPIO_Mode_AF_PP )、复用开漏输出(GPI O_Mode_AF_OD )。
普通推挽输出模式一般应用在输出电平为 0 和 3.3 伏的场合。而普通开漏输出模式一般应用在电平不匹配的场合,如需要输出 5 伏的高电平,就需要在外部接一个上拉电阻,电源为 5 伏,把 GPIO 设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出 5 伏的电平。
对于相应的复用模式,则是根据 GPIO 的复用功能来选择的,如 GPIO 的引脚用作串口的输出,则使用复用推挽输出模式。如果用在 IC、SMBUS 这些需要线与功能的复用场合,就使用复用开漏模式。
在使用任何一种开漏模式时,都需要接上拉电阻。
+ 总结在 STM32 中选用 IO 模式(来自博客)
1、 浮空输入 GPIO_IN_FLOATING —— 浮空输入,可以做 KEY 识别,RX1
2、 带上拉输入 GPIO_IPU —— IO 内部上拉电阻输入
3、 带下拉输入 GPIO_IPD —— IO 内部下拉电阻输入
4、 模拟输入 GPIO_AIN —— 应用 ADC 模拟输入,或者低功耗下省电
5、 开漏输出 GPIO_OUT_OD —— IO 输出 0 接 GND,IO 输出 1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为 1 时,IO 口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样 IO 口也就可以由外部电路改变为低电平或不变。可以读 IO 输入电平变化,实现 C51 的 IO 双向功能
6、 推挽输出 GPIO_OUT_PP —— IO 输出 0-接GND, IO 输出 1-接VCC,读输入值是未知的
7、 复用功能的推挽输出 GPIO_AF_PP —— 片内外设功能(I2C 的 SCL,SDA)
8、 复用功能的开漏输出 GPIO_AF_OD —— 片内外设功能(TX1,MOSI,MISO,SCK,SS)
+ STM32 设置实例:(来自博客)
1、 模拟 I2C 使用开漏输出 _OUT_OD,接上拉电阻,能够正确输出 0 和 1;读值时先 GPIO_SetBits(GPIOB, GPIO_Pin_0); 拉高,然后可以读 IO 的值;使用 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
2、 如果是无上拉电阻,IO 默认是高电平;需要读取 IO 的值,可以使用带上拉输入 _IPU 和 浮空输入_IN_FLOATING 和开漏输出 _OUT_OD。
+ 通常有 5 种方式使用某个引脚功能,它们的配置方式如下:(来自博客)
1、 作为普通 GPIO 输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
2、 作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
3、 作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4、 作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
5、 作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
注意 如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。比如要使用 STM32F103VBT6 的 47、48 脚的 USART3 功能,则需要配置 47 脚为复用推挽输出或复用开漏输出,配置 48 脚为某种输入模式,同时使能 USART3 并保持 I2C 的非使能状态。如果要使用 STM32F103VBT6 的 47 脚作为 TIM2_CH3,则需要对 TIM2 进行重映射,然后再按复用功能的方式配置对应引脚。
+ 在上面基础上,最后,我们再从 瑞生哥 的分类来进行回顾
1、 输入和输出
从 51 过来的人,对输入和输出比较陌生。51 单片机不用设置输入和输出模式,自动变换,无需程序配置,当我们写程序读引脚的电平的时候,实际上就是作为输入模式来使用,当我们写程序让引脚输出电平的时候,实际上就是作为输出模式来使用。也就是说,并不是 51 单片机没有输入和输出这个概念,而是你已经使用了很久却没有发现。
STM32 与 51 的区别就是:当我们要读引脚电平的时候,也就是作为输入,我们必须要先把引脚设置为输入功能,才可以读。当我们要控制引脚高低电平的时候,也就是作为输出,我们必须要先把引脚设置为输出功能,才可以设置。
概念比较抽象,你只需要记住:在引脚上没有外界干扰的情况下,上拉就是把引脚设置为高电平了,你用万用表量上拉引脚,就是高电平;下拉就是把引脚设置为低电平了,你用万用表量下拉引脚,就是低电平,也就是 0 V。
2、 推挽与开漏
概念比较抽象,你只需要记住: 设置为推挽,就是提高了引脚的输出电流能力。设置为开漏,就是提高了引脚的输入电流能力。然后还要知道,设置为开漏时,如果外部不加上拉电阻,默认输出是低电平。
3、 通用与复用
通用就是作为普通的输入和输出引脚。复用就是该引脚可以作为 SPI 引脚 I2C 引脚等其他功能的引脚。
4、 使用介绍
结合上面讲的,可以得到一些简单的应用设置方式。
比如检测按键,就应该设置为输入,如果 外部没有加上拉电阻,你就需要设置引脚为上拉输入,这样如果检测到引脚是低电平,就是按下按键了。如果 外部加了上拉电阻,你这时既可以把引脚设置为上拉输入,也可以设置为浮空输入,设置为这两种,由于外部上拉电阻的原因,默认就是高电平,同样,检测到低电平时,就是按键按下 了。
当你要控制引脚高低电平做应用时,就是需要把引脚设置为输出功能。例如驱动一个器件,驱动一个发光二极管等。如果你要 使用高电平点亮发光二极管,就需要把引脚设置为推挽输出,以增大电流输出能力,如果你设置为开漏输出,发光二极管肯定是点不亮了。但是如果你 使用低电平点亮发光二极管,那么设置为开漏和推挽输出都可以正常点亮发光二极管。
STM32 之串口介绍
链接:点击跳转至原文
笔记:
- 串口硬件电路介绍
+ CH340 虚拟出一个串口(电脑使用的是 USB,CH340 即是 USB 转 TTL 芯片),电脑上需要安装相应的驱动。
+ CH340 需要晶振(12MHz),晶振的 匹配电容异常时可以不焊接,只是稳定性不太好。
+ CH340 的 DTR 引脚(高电平3.3V)需要连接到 STM32 的复位引脚 RST(ISP下载程序)。 - 如何用串口下载程序
+ 手动 ISP 下载程序,STM32 上电,会自动检测 BOOT0 引脚是什么电平,如果是高电平,等待用户下载程序;如果是低电平,运行用户之前下载到单片机的程序。所以我们需要把 BOOT0 引脚引出,然后控制其接地或接 VCC 来下载程序或者运行程序。在调试过程中,我们需要不断的控制 BOOT0,非常麻烦。
+ 自动 ISP 下载程序,把 BOOT0 与地直接连接,那么每次上电就会运行程序,而且只要点击电脑上的 “下载” 按钮,就开始下载程序,下载完程序,就开始执行。实现此目的,需要借助串口握手信号 DTR 和 RTS。DTR 连接 RESET(复位引脚),控制复位;RTS 连接 BOOT0,用来控制程序运行或者等待下载。
+ 按道理应该是 DTR 低电平复位,然后 RTS 低电平进入 BootLoader 呀。但是,有一点需要注意,它这里讲的高低电平,是针对电脑原始的 9 针串口 的,也就是 “232 电平”,我们用的 USB 转 TTL 芯片是 “TTL 电平”,正好相反(《USB 转串口-硬件扫盲》)。
单片机串口是 TTL 电平,要和电脑串口(或者USB 转串口线)通信,就需要使得他俩的电平逻辑一样才可以通信。这时候,就需要用到 TTL 转 232 电平 的芯片:MAX232、MAX3232、SP232、SP3232(232 芯片用于 5V 单片机,3232 用于 3.3V 的单片机)。
如果用的不是电脑原生的串口,而是 USB 转的串口,也就是,直接把 USB 转的串口,变成了可以和单片机直接通信的 TTL 电平了。USB 转 TTL 芯片有很多,例如:CH340、PL2303、CP2102、FT232 等。
+ 串口通讯的交叉连接方式:Rx1 <–> Tx2、Tx1 <–> Rx2。
+ ISP 下载方式必须使用 STM32 的 USART1(PA9[TxD1]、PA10[RxD1])。
STM32 之 JLINK 下载程序
链接:点击跳转至原文
笔记:
+ JLINK V8/V9、STLINK、ULINK2 等都可以使用。
+ 仿真器一般不提供电源,使用仿真器下载时,需要为开发板提供电源!!
+ 只有通过 JLINK 发现了单片机的器件号(IDCODE),才可以正常使用
+ 仿真器下载有 JTAG和 SW 两种方式,STM32 单片机均支持,板子上用的是 20PIN 的 JTAG 座(个人认为可以兼容 SW)。
STM32 之引脚高低电平
链接:点击跳转至原文
笔记:
+ 单片机引脚在上电之后默认是输入模式。
+ 不接地电路不构成回路,没有电流流过,LED 不亮;最好串联一限流电阻,防止 LED 烧坏!
+ 模板例程的概念,具体如何建立模板例程后续再介绍。
STM32 之检测引脚电平
链接:点击跳转至原文
笔记:
+ 单片机引脚内部有带上拉电阻,故可选择性在引脚外部电路带或不带上拉电阻(采用上拉输入模式)。
+ 四角按键,左右两同侧引脚按下,均导通。
+ 使用万用表测通断时,千万不要给开发板上电! !
+ uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 返回的其实就是 0、1。
STM32 之蜂鸣器应用
链接:点击跳转至原文
笔记:
+ 蜂鸣器电路: 下拉电阻 (NPN 三极管高电平导通,单片机引脚上电后为输入模式,防止复位时蜂鸣器误动作而鸣叫) + 基极限流电阻(防止烧坏 NPN 三极管)。
+ 其他参考电路: