-----从51过来的小白----超全笔记------
-----已更新P1--P16-------
P1:课程简介
1、新手小白可以先去看UP主的51单片机,这样容易理解;
2、学习硬件设备
04:29
3、软件设备:keil5
05:40
4、设备介绍
08:11
P2:STM32简介
1、简介
[1-2] STM32简介 P2 - 00:02
2、主流系列

3、外设

4、命名规则
5、STM32系统结构---了解即可
[1-2] STM32简介 P2 - 24:33
6、STM32F103C8T6芯片-引脚定义图
[1-2] STM32简介 P2 - 26:51 引脚定义图



7、引脚介绍及用途
[1-2] STM32简介 P2 - 29:44 各引脚介绍
8、启动配置
[1-2] STM32简介 P2 - 34:37 启动配置

9、原理图
[1-2] STM32简介 P2 - 38:17 电路原理图

10、原理图
[1-2] STM32简介 P2 - 44:48 更大的原理图
11、实物图
[1-2] STM32简介 P2 - 47:14
P3:软件安装
1、安装步骤--安装包看UP主视频下面介绍连接;放的目录不用中文容易出错:
[2-1] 软件安装 P3 - 00:20 安装步骤
2、支持包
[2-1] 软件安装 P3 - 07:16
3、省略
P4:新建工程
1、目前STM32的开发是基于寄存器的方式和51单片机开发方式一样;用程序配置寄存器。(最底层、最直接、效率高些)
2、STM32结构复杂,寄存器多,不推荐基于寄存器方式;基于库函数的方式使用ST官方提供封装好的函数,调用函数间接配置寄存器;基于HAL库的方式可以图形界面快速配置STM32(不推荐,有基础的推荐);
3、函数库:键工程用到,手册有使用方法可参考;
[2-2] 新建工程 P4 - 02:23

4、键标准库工程、新建文件夹,打开keil5软件,project---第一个--选新建的文件夹-在文件夹里键文件夹存工程---选中工程文件夹--键project项目--保存--选型号--小助手(关掉)--创建完成;
[2-2] 新建工程 P4 - 03:26 键工程

5、打开函数库、将启动文件复制下来,在工程文件里面键文件夹(start)粘贴过来(具体看下面视频标记),时钟等也要复制粘贴到同一个目录下具体看视频;
[2-2] 新建工程 P4 - 05:14
6、修改项目文件名称跟启动文件名称一致(5、start)然后如下操作,(.H和.C文件都要添加),添加后如下图3,有小钥匙:表示只读文件
[2-2] 新建工程 P4 - 07:53




7、工程目录下键文集夹(user)放main,软件里面如下改一样名称User
[2-2] 新建工程 P4 - 09:43 键其他代码文件在工程目录下



8、工程创建完,包含头文件,写代码
[2-2] 新建工程 P4 - 10:35
9、修改字体大小、编辑器文字大小也一起修改


10、调试器、设置后执行会更方便、debug修改
[2-2] 新建工程 P4 - 13:34
11、配置3个寄存器就可以点亮灯,第一个寄存器配置时钟使能IOPC->APB2ENR(蓝色括号部分)、就可以打开时钟。GPIO都是APBB2的外设




12、第二个寄存器配置PC13口模式,将13口位置配置为0011,其他的为0,转换为16进制,为0x00300000。GPIOC(x表示A-Z)->CRH口的模式



[2-2] 新建工程 P4 - 16:57

13、配置第3个GPIOC输出,ODR13写1高电平,0低电平;下面图(8.2.4)横线部分都给0,可得到0x00002000(灯为低电平亮全为0亮现在为2灭,把2改0灯亮);






14、以上配置都把其他口配置为0,会影响其他不用的位,需要操作一下(&=、|=)才能只配置使用的位;代码简洁操作不方便;用库函数看看。
[2-2] 新建工程 P4 - 19:02 用库函数与寄存器操作对比
15、在工程文件下新建Library用来存放库函数-固件库中需要用到的文件复制过来(操作2步头文件.H、源文件.C的这复制到新建文件夹Library,下方有视频位置看具体操作);


[2-2] 新建工程 P4 - 19:43 复制需要文件到刚键的文件夹去
16、在keil5软件选中Target右键--添加组改名为Library,在选中Library打开,Ctrl+A,add;


17、添加完后不能直接使用,需要下面视频位置操作,找到下面3个复制到User文件,在keil5里User添加:
[2-2] 新建工程 P4 - 20:39 库文件添加到keil5后操作

18、复制字符串、包含外设库
[2-2] 新建工程 P4 - 21:58



19、上图添加如下,操作完,库函数工程建立完了。

20、将不用改的放上面,点3个箱子图标,选择放上面的拉到前面。编译通过即成功。
21、库函数实现点灯
[2-2] 新建工程 P4 - 23:30 库函数实现点灯
1)外设时钟控制(参数1外设选择,2状态选择)GPIOC外设时钟配置如下,找到函数定义,复制参数;

2)端口模式配置,使用GPIO_Init()函数,参数13(13就是C)口,所有GPIOC为第一个参数,第二个参数为结构图,要先定义,结构体里面有3个参数,Mode\Pin\Speed选中右键找到位置,看注释选中对应的Ctrl+F看具体定义;蓝色部分GPIO13口设置高电平(灯)
[2-2] 新建工程 P4 - 28:00 结构体定义




22、其他补充
[2-2] 新建工程 P4 - 31:53



P5 :GPIO输出
1、本节3个程序:LED闪烁、LED流水灯、蜂鸣器(下节写代码);数据0就是0V,数据1就是3.3V,部分可以输入5V(下面带FT 的可容忍,第一节里有),输出只能最高3.3V;





2、数据寄存器1时,N-MOS断开,高阻模式,可外接上拉电阻5V输出;数据寄存器为0,下管导通,接VSS,输出低电平,低电平有驱动能力,高电平没有,可作为通讯协议的驱动方式(I2C通讯引脚)。推挽输出也叫强推模式P-MOS高电平,开漏输出N-MOS低电平输出
3、GPIO8种工作模式,






4、当使用ADC时候,将引脚配置为模拟输入就可以了;输出只有一个,输入可以多个
5、看手册
[3-1] GPIO输出 P5 - 23:25



P6、LED闪烁&LED流水灯&蜂鸣器
1、面板板连接;
2、新建工程,project--new project,新建文件夹。。。
[3-2] LED闪烁&LED流水灯&蜂鸣器 P6 - 02:46 新建工程
3、正式点亮LED,RCC和GPIO两个外设控制,跳转不了,是删掉了中间文件,再编译一下就好了;
[3-2] LED闪烁&LED流水灯&蜂鸣器 P6 - 09:17 开始写代码


4、用到的GPIO初始化和读取8个(上图)
5、写代码了,①外设时钟库函数调用;②点灯推挽输出out_pp
[3-2] LED闪烁&LED流水灯&蜂鸣器 P6 - 13:24 开始写代码

6、端口高低电平设置,GPIO_Writebit也可以控制端口高低电平
GPIO_SetBits:设置高电平;
GPIO_ReSetBits:设置低电平;


7、延时函数拿过来使用,闪烁
[3-2] LED闪烁&LED流水灯&蜂鸣器 P6 - 20:23 第二个流水灯代码开始




8、开漏输出,高电平没有驱动能力(高阻态)特殊用,低电平有驱动能力。推挽输出高低电平均有驱动能力,一般用。
9、第二个流水灯代码实现,拿上面的过来修改
[3-2] LED闪烁&LED流水灯&蜂鸣器 P6 - 26:38 流水灯


10、蜂鸣器
[3-2] LED闪烁&LED流水灯&蜂鸣器 P6 - 33:21 蜂鸣器代码实现




11、PB12输出低电平,蜂鸣器响。
P7.GPIO输入
1、一个按键控制一个LED亮灭;光敏控制蜂鸣器,挡住光线蜂鸣器响;





2、按键一般用下接方式(习惯与规范),按下低电平,松手高电平;
3、C语言基础
[3-3] GPIO输入 P7 - 16:49 C语言基础




4、结构体(数据类型)
[3-3] GPIO输入 P7 - 27:58 c语言结构体

P8:按键控制LED&光敏电阻控制蜂鸣器
1、按键控制LED接线图片,按键接法如下硬件电路,LED低电平点亮接法(GPIO口的PA1\PA2口,另一端接VCC)。


2、将蜂鸣器代码复制一份改名;
[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 01:32
3、硬件驱动单独出来,工程目录和keil5都要建Hardware文件放驱动,建.C和.H文件封装;
[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 04:07 操作
4、初始化LED(打开时钟、配置端口...)①外设时钟、②端口模式(引脚根据前面连接的PA1\PA2),main函数引用时有警告,需要更新一下就 可以了;



5、Ctrl+alt+空格(自动补全弹框)、默认是低电平(灯会亮起来),初始化让灯熄灭代码如下(LED默认关闭灯不亮);

6、点亮LED1、LED2初始化SetBit():关闭LED、ReSetBit():点亮LED
[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 09:20 点亮LED初始化


7、按键封装:按键两个端口设置为上拉输入模式①开启时钟,②接在B上(读取按键上拉模式,1和11号口,速度是GPIO输出速度,输入没用),GPIOB初始化
[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 11:47 按键封装

8、读取按键,KeyNum默认没按下返回0 ;按下返回1;下面4个为GPIO读取函数,读取按键要用到;

[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 16:11

9、输入寄存器的值,0代表低电平,1高电平;按键检查1和11 代码一样,复制一份改引脚和返回值2即可;

10、主函数调用操作,==1或==2是判断是否按下按键,按下的为那个按键

11、LED1取反操作,复制一份改LED2;

[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 22:46


12、加注释
13、第二个代码部分
[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 24:08

14、蜂鸣器PB12、光敏传感器PB13,实物跟上图一样接法;(遮住光灯不亮,输出高电平1,松手输出低电平,指示灯亮)

15、复制前面工程修改名称,打开
16、蜂鸣器封装,蜂鸣器接的引脚为PB12(①②),函数从LED初始化拿过来改端口与引脚即可;
[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 25:49



17、光敏封装模块(实物连接PB13端口)
[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 28:26




18、总结使用方法、初始化时钟、赋值结构体、外设初始化...
[3-4] 按键控制LED&光敏传感器控制蜂鸣器 P8 - 31:34

P9:OLED调试工具、显示屏
1、驱动函数模块


2、实物图



3、SCL\SDA是I2C通讯引脚
P10:OLED显示屏
1、连接

2、复制按键控制LED工程文件夹
[4-2] OLED显示屏 P10 - 02:20
3、删掉main测试功能代码;
4、驱动函数模块存放位置,将4针脚的3个文件复制到本节工程Hardware文件夹中;keil中也要添加
[4-2] OLED显示屏 P10 - 02:55 驱动函数
5、默认SCL接PB8,SDA接PB9



6、字库数据、点阵数据
[4-2] OLED显示屏 P10 - 05:57
7、显示行列4行16列

8、显示(代码可以在UP主视频下载)

[4-2] OLED显示屏 P10 - 09:30
9、C语言不支持写二进制;

10、keil调试模式debug
[4-2] OLED显示屏 P10 - 11:52
P11:中断系统
1、第一个现象,挡光次数统计;第二个现象旋转编码加减显示;













2、中断函数不需要调用N是多个中断线路
[5-1] EXTI外部中断 P11 - 09:57
3、值越小优先级越高
[5-1] EXTI外部中断 P11 - 23:32

4、[5-1] EXTI外部中断 P11 - 34:14
5、模块电路图

6、手册
[5-1] EXTI外部中断 P11 - 37:22
P12、对射式红外传感器计&旋转编码器计次



1、复制上一个视频代码,实现的代码删除,开始写代码模块化,开始时钟函数(上图3个IO口)打开时钟-配置GPIO-配置AFIO-配置EXTI-NVIC.(后两个不用开始时钟)。
[5-2] 对射式红外传感器计次&旋转编码器计次 P12 - 06:09
2、看手册使用
[5-2] 对射式红外传感器计次&旋转编码器计次 P12 - 09:13

3、重要的gpio函数:
[5-2] 对射式红外传感器计次&旋转编码器计次 P12 - 11:28
4、外部中断引脚函数:



5、EXTI配置:第一个可以恢复到上电默认状态;第二个初始化外设;第三个初始结构化参数;基本库函数都有前三个;第4个出发外部中断;第5标志位是否值1,第6清除标志位;在中断函数中-最后两个查看和清除标志位;

6、EXTI:
[5-2] 对射式红外传感器计次&旋转编码器计次 P12 - 18:22

7、NVIC配置:①中断分组函数;②初始化;③设置中断列表;④系统低功耗配置;只用①②;
[5-2] 对射式红外传感器计次&旋转编码器计次 P12 - 22:27


8、复制-右键跳转定义-参数(分组只进行一次,可以不用放模块里)
9、中断函数无参无返回值;
[5-2] 对射式红外传感器计次&旋转编码器计次 P12 - 29:26

10、下降沿触发移开加1,上升沿触发遮挡加1;
11、第二个代码功能实现:
[5-2] 对射式红外传感器计次&旋转编码器计次 P12 - 35:22
12、Encoder文件模块:
13、中断函数
[5-2] 对射式红外传感器计次&旋转编码器计次 P12 - 41:53
P13:TIM定时中断
1、第一程序效果

2、第二个效果,前面加到9清零后面开始加






3、分频系数=预分频器的值(0-65535)+1
[6-1] TIM定时中断 P13 - 17:09 通用定时器









4、[6-1] TIM定时中断 P13 - 27:04 高级定时器

P14:定时器时钟中断&定时器外部时钟
1、代码接线图


2、复制OLED显示屏的代码->修改名称->打开删除主函数mian.c里面的其他操作->运行;

3、建模块-初始化
1)RCC时钟中断开始;
2)选择内部时钟源;
3)配置时机单元;
4)配置输出控制;
5)配置NVIC,并分配优先级;
6)运行控制-使能计数器;
7)定时器中断函数,中断一次计算一次;

4、旗子符号-标记功能-不影响代码运行;
5、找对应1)-7)配置;
[6-2] 定时器定时中断&定时器外部时钟 P14 - 07:34


6、中断输出:ITConfig函数,其他函数介绍
[6-2] 定时器定时中断&定时器外部时钟 P14 - 12:23
7、开始写代码
[6-2] 定时器定时中断&定时器外部时钟 P14 - 13:32
8、TIM2是APB1的时钟外设;

9、选择内部时钟-默认是使用内部函数,可以不配置;


10、时机单元初始化:

11、分屏、模式向上计数、自动重装、预分频器(72M,7200分频,10K计数频率,计10000,就是1S时间);


12、时钟更新中断


13、NVIC优先分组


14、中断函数-启动文件
[6-2] 定时器定时中断&定时器外部时钟 P14 - 23:46


15、函数调用
[6-2] 定时器定时中断&定时器外部时钟 P14 - 24:59
16、变量声明num++
[6-2] 定时器定时中断&定时器外部时钟 P14 - 25:41
17、



18、可以直接把中断函数放main里面就不用声明了。




19、第二个代码
[6-2] 定时器定时中断&定时器外部时钟 P14 - 31:48


20、复制上面的工程
[6-2] 定时器定时中断&定时器外部时钟 P14 - 32:52
21、使用外部时钟,内部时钟配置删除


参数:外部出发 反向出发 滤波器不用0x00




22、主函数调用
[6-2] 定时器定时中断&定时器外部时钟 P14 - 37:20

P15、TIM输出比较
1、做电机的认真学这个功能

2、本小节现象,三个程序
1)PWM驱动LED呼吸灯;
2)PWM驱动舵机;
3)PWM驱动直流电机;
[6-3] TIM输出比较 P15 - 00:31
3、输出比较

4、PWM波形,具有惯性的系统才可使用

5、占空比:
[6-3] TIM输出比较 P15 - 10:15
,占空比=高电平比一周期
6、通道



7、有效电平1;无效电平0;

8、图红色与蓝色部分比较得到绿色部分的图形。

9、外部设备





P16、PWM驱动LED呼吸灯
1、接线图与实物图


2、复制OLED文件,修改名字。main实现代码删除掉。

3、OLED可以显示调试,键模块
4、PWM初始化函数①RCC开始时钟,把TIM外设和GPIO外设时钟打开;②时钟源选择,时机配置;③配置输出单元
[6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机 P16 - 02:34

5、tim.h文件







[6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机 P16 - 07:56

6、重要函数


7、通道初始化-模式、极性、使能、CCR

8、初始化,占空比越多灯越亮
[6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机 P16 - 20:36

9、引脚重映射
[6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机 P16 - 30:56


10、第二个代码
11、驱动舵机

12、复制上一个代码改名。

13、修改代码
[6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机 P16 - 39:47 代码实现-修改
14、舵机模块
[6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机 P16 - 45:58
p17、TIM输入捕获