URL
Assignee
type
status
date
slug
summary
tags
category
icon
password
Status
受小瀞湫和mjh的启发,决定学一下,虽然未来不一定有用…
1-1 课程简介
1-2 STM32简介
- STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器
- STM32常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等
- STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器


片上资源/外设
英文缩写 | 名称 | 英文缩写 | 名称 |
NVIC | 嵌套向量中断控制器 | CAN | CAN通信 |
SysTick | 系统滴答定时器 | USB | USB通信 |
RCC | 复位和时钟控制 | RTC | 实时时钟 |
GPIO | 通用IO口 | CRC | CRC校验 |
AFIO | 复用IO口 | PWR | 电源控制 |
EXTI | 外部中断 | BKP | 备份寄存器 |
TIM | 定时器 | IWDG | 独立看门狗 |
ADC | 模数转换器 | WWDG | 窗口看门狗 |
DMA | 直接内存访问 | DAC | 数模转换器 |
USART | 同步/异步串口通信 | SDIO | SD卡接口 |
I2C | I2C通信 | FSMC | 可变静态存储控制器 |
SPI | SPI通信 | USB OTG | USB主机接口 |
系统结构

引脚定义

2-1 软件安装
2-2 新建工程


用库实现

总结

工程建立
添加工程必要文件
Libraries->CMSIS -> CM3-> DeviceSupport-> ST-> STM32F10x-> startup-> arm->是启动文件,复制到工程模板(新建Start),回到STM32F10x(复制那三个文件stmxxxh、systemxxx.c、systemxxx.h)复制到Start,打开CM3->CoreSupport(将两个文件复制到Start)回到Keil将文件添加到工程->点击Target1,将Source Group1单击改名Start->右键选择添加已存在文件,打开Start文件夹,打开筛选器All files,添加启动文件(视频所用型号添加后缀md.s文件)和剩下所有.c.h文件->在工程选项添加该文件夹头文件路径(魔术棒按钮,C/C++,Include Paths栏点右边三个点按钮新建路径再点右三个点按钮添加Start路径,最后点ok)->打开新建工程文件夹添加新文件夹User(放main函数),接着keil里Target右键新建(组别)改名User添加文件选.c名叫main(注意路径选择Userwenj夹),在main里右键插入头文件stm32f10x.h(若用寄存器开发32,到此就完成工程建立)
扳手里Encoding->UTF-8可以防止中文乱码
3-1 GPIO输出
GPIO(General Purpose Input Output)通用输入输出口
可配置为8种输入输出模式
引脚电平:0V~3.3V,部分引脚可容忍5V
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

TTL肖特触发器:整形

通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式
模式名称 | 性质 | 特征 |
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
3-2 LED闪烁&LED流水灯&蜂鸣器
LED闪烁

LED流水灯

蜂鸣器

结果不放了,这蜂鸣器再多哔哔哔叫几声估计我妈会以为家里报警器响了
3-3 GPIO输入
- c语言数据类型
关键字 | 位数 | 表示范围 | stdint关键字 | ST关键字 |
char | 8 | -128 ~ 127 | int8_t | s8 |
unsigned char | 8 | 0 ~ 255 | uint8_t | u8 |
short | 16 | -32768 ~ 32767 | int16_t | s16 |
unsigned short | 16 | 0 ~ 65535 | uint16_t | u16 |
int | 32 | -2147483648 ~ 2147483647 | int32_t | s32 |
unsigned int | 32 | 0 ~ 4294967295 | uint32_t | u32 |
long | 32 | -2147483648 ~ 2147483647 | ㅤ | ㅤ |
unsigned long | 32 | 0 ~ 4294967295 | ㅤ | ㅤ |
long long | 64 | -(2^64)/2 ~ (2^64)/2-1 | int64_t | ㅤ |
unsigned long long | 64 | 0 ~ (2^64)-1 | uint64_t | ㅤ |
float | 32 | -3.4e38 ~ 3.4e38 | ㅤ | ㅤ |
double | 64 | -1.7e308 ~ 1.7e308 | ㅤ | ㅤ |
- 关键字:#define
- 用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改
- 定义宏定义:
#define ABC 12345
- 引用宏定义:
int a = ABC; //等效于int a = 12345;
- 关键字:typedef
- 用途:将一个比较长的变量类型名换个名字,便于使用
- 定义typedef:
typedef unsigned char uint8_t;
- 引用typedef:
uint8_t a; //等效于unsigned char a;
- 关键字:struct
- 用途:数据打包,不同类型变量的集合
- 定义结构体变量:
struct{char x; int y; float z;} StructName;
因为结构体变量类型较长,所以通常用typedef更改变量类型名
- 引用结构体成员:
StructName.x = 'A';
StructName.y = 66;
StructName.z = 1.23;
或 pStructName->x = 'A'; //pStructName为结构体的地址 pStructName->y = 66;
pStructName->z = 1.23;
- 关键字:enum
- 用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合
- 定义枚举变量:
enum{FALSE = 0, TRUE = 1} EnumName;
因为枚举变量类型较长,所以通常用typedef更改变量类型名
- 引用枚举成员:
EnumName = FALSE;
EnumName = TRUE;
按键控制LED

光敏传感器控制蜂鸣器

能用,但是有点接触不良,不录视频了QAQ
4-1 OLED调试工具
函数 | 作用 |
OLED_Init(); | 初始化 |
OLED_Clear(); | 清屏 |
OLED_ShowChar(1, 1, 'A'); | 显示一个字符 |
OLED_ShowString(1, 3, "HelloWorld!"); | 显示字符串 |
OLED_ShowNum(2, 1, 12345, 5); | 显示十进制数字 |
OLED_ShowSignedNum(2, 7, -66, 2); | 显示有符号十进制数字 |
OLED_ShowHexNum(3, 1, 0xAA55, 4); | 显示十六进制数字 |
OLED_ShowBinNum(4, 1, 0xAA55, 16); | 显示二进制数字 |
4-2 OLED显示屏
OLED显示屏


5-1 EXTI外部中断
5-2 对射式红外传感器计次&旋转编码器计次
对射式红外传感器计次

旋转编码器计次

6-1 TIM定时中断
类型 | 编号 | 总线 | 功能 |
高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
6-2 定时器定时中断&定时器外部时钟
定时器定时中断

定时器外部时钟

6-3 TIM输出比较
输出比较简介
- OC(Output Compare)输出比较
- 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
- 每个高级定时器和通用定时器都拥有4个输出比较通道
- 高级定时器的前3个通道额外拥有死区生成和互补输出的功能
PWM简介
- PWM(Pulse Width Modulation)脉冲宽度调制
- 在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
- PWM参数:
频率 = 1 / TS 占空比 = TON / TS 分辨率 = 占空比变化步距


输出比较


模式 | 描述 |
冻结 | CNT=CCR时,REF保持为原状态 |
匹配时置有效电平 | CNT=CCR时,REF置有效电平 |
匹配时置无效电平 | CNT=CCR时,REF置无效电平 |
匹配时电平翻转 | CNT=CCR时,REF电平翻转 |
强制为无效电平 | CNT与CCR无效,REF强制为无效电平 |
强制为有效电平 | CNT与CCR无效,REF强制为有效电平 |
PWM模式1 | 向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平
向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平 |
PWM模式2 | 向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平
向下计数:CNT>CCR时,REF置有效电平,CNT≤CCR时,REF置无效电平 |
参数计算

- PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
- PWM占空比: Duty = CCR / (ARR + 1)
- PWM分辨率: Reso = 1 / (ARR + 1)
硬件电路


6-4 PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机
PWM驱动LED呼吸灯

PWM驱动舵机

PWM驱动直流电机

- 作者:嘎嘎sama
- 链接:https://www.zjuhjy.top//%E5%A6%99%E5%A6%99%E5%B7%A5%E5%85%B7/post11
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。