MCU-Study-Stm32

MCU-Study-Stm32

jrl Lv3

Part1. 初识Stm32

一、Preparation

1.编写软件的准备

Keil5的arm版本,这个放在之前安装过的C51版本的根目录下即可。

拿取CID激活LIC的步骤就不过多赘述了。

之后还是需要安装STLink的USBdriver,识别成功即安装成功。

二、About Stm32

1.Introduction

STM32相较于C51单片机,功能更加全面

2. STM32f103c8tc

(1)基本参数

(2)外设

(3)命名规则

(4)系统结构

(5)引脚定义

(6)启动配置和最小系统电路

一般来说,在需要串口下载程序的时候才会设置为“系统存储器”启动模式。

BOOT引脚的值是在上电复位后的一瞬间有效的。

Part2. 编写STM32

编写STM32主要有以下几种方式:

  1. 基于寄存器的方式(由于STM32机构复杂,寄存器多而繁杂,不推荐)
  2. 基于封装函数(库函数)的方式(调用方便,一般来说使用这种方法间接配置寄存器)
  3. HAL库基于图形化界面快速配置STM32(快速方便,但需理解底层逻辑)

一、GPIOC口

1.硬件与软件的调试准备

首先需按图所示连接号STLINK与STM32

在Keil5中,将调试器改为使用的ST-Link

然后在Flash中勾选上,使程序在下载后立马复位执行

2.直接配置寄存器

看出这样操作麻烦,工作量大,远没有封装的库函数来的简洁与方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stm32f10x.h"                  // Device header

int main(void)
{
RCC->APB2ENR = 0x00000010; //´ò¿ªGPIOC¼Ä´æÆ÷
GPIOC->CRH = 0x00300000;
GPIOC->ODR = 0x00002000;
while(1)
{

}

}

3.通过调用库函数来调试GPIOC口

注意:

这里有一个条件编译,即若要使”stm32f10x_conf.h”生效,必须定义 USE_STDPERIPH_DRIVER

在Define中输入,并添加好路径

配置完之后编译检验是否配置成功。

(1)新建工程

(2)工程架构

  • **startup: **

    即启动文件,在Keil5中这是用汇编写的,内含中断向量表和中断服务函数等。中断服务函数里的复位函数是所有程序的入口,当STM32上电复位或者按下复位按键后就进入复位中断函数执行。它将调用SystemInit函数和main函数,然后结束。

    实际上单片机不会停止工作,因为main函数一般以while(1)死循环结尾

代码块如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stm32f10x.h"                  // Device header

int main(void)
{
unsigned int i=0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; //结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC,&GPIO_InitStructure); //取地址返回
GPIO_SetBits(GPIOC,GPIO_Pin_13); //将13号口置为高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //设置为低电平
while(1)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);

}

}

二、GPIO输出

1.GPIO相关知识

(1)GPIO简介

只有部分引脚可以忍受5V的电压,即FT(Five Tolerate)

(2)GPIO基本结构

APB2:外接总线,在stm32中所有的GPIO都挂载在APB2上

GPIO类别:GPIO(A–B–C)等等,每个GPIO口都有16个引脚

32位寄存器:

仅低16位起作用,因为只有16个端口

  • 输出寄存器写1,则输出引脚输出高电平;0—-低电平
  • 输入寄存器读取1,则输入引脚为高电平;0—-低电平

驱动器:

增加信号驱动能力

(3)GPIO位结构

(4)GPIO模式

由于浮空输入的电平是不确定的,所以在使用浮空输入时,端口一定要接上一个连续的驱动源,不能出现悬空的状态。

a. 浮空/上拉/下拉输入

VDD:上拉

VSS:下拉

输入通过施密特触发器进行波形整形后,连接到输入数据寄存器

b. 模拟输入(ADC专属)

注意到,此时仅有I/O引脚和进入片上外设的一条线在起作用

仅在模拟输入模式会关闭数字的输入功能

c. 开漏/推挽输出
d. 复用开漏/推挽输出

三、OLED调试工具和OLED显示屏

1. OLED调试工具

(1)OLED简介

(2)调试方式

  • 串口调试: 把电脑的屏幕挂在单片机上。通过电脑端调试,功能强大,可以显示图像,曲线,图像,自己做的软件。不利于人机交互,不能不断刷新数据。
  • 显示屏调试:对于不断变化的数据可以不断刷新显示

(3)硬件电路

​ SCL和SDA需要接在单片机的I2C通信引脚

(4)OLED驱动函数

2.OLED显示屏

1.引脚配置

1
2
3
4
/*引脚配置*/
#define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))
#define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))

SCL和SDA配置为开漏输出模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*引脚初始化*/
void OLED_I2C_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOB, &GPIO_InitStructure);

OLED_W_SCL(1);
OLED_W_SDA(1);
}

2.调试模式

点击红色放大镜进入调试模式

四、TIM定时中断

1.TIM简介

定时器是一个计数器,基本功能是定时触发中断

(1)TIM类型

APB2总线性能更高 定时器向下兼容

a.基本定时器

时基单元:

TIMxCLK是72MHz

预分频器: 0,即不分频 ; 1,即2分频,36MHz

CNT计数器:16位计数器,值0–65535,溢出则归零。 自增运行至目标值,产生中断。

自动重装寄存器:存储目标值的寄存器,即写入的计数目标。当计数达到目标值,产生中断信号并清零计数器,自动开始下一次的计数计时。

更新中断: 计数值等于自动重装值产生的中断,产生更新中断后会通往NVIC,若配置好NVIC的定时器通道,那定时器的更新中断就能得到CPU的响应了。
b.通用定时器

除了基本的向上计数模式(基本定时器的计数模式)外,通用定时器和高级定时器还支持向下计数模式中央对齐模式

向下计数模式: 从重装值开始向下自减,减到0,申请中断,循环。

中央对齐模式: 从0开始,向上自增到重装值,申请中断;向下自减到0,再申请中断。循环。

c.高级定时器

2.定时中断基本结构

上述为定时器搜友可选时钟源

若为高级定时器,则在自动重装器和中断输出控制之间还会多一个重复计数器

中断输出控制:中断输出的“允许位”,允许后,对应中断才可输出

1. 预分频器时序

预分频缓冲寄存器(影子寄存器)才是真正起作用的寄存器,当计数到一半时,若改变了分频值,变化不会立刻生效,会等到本次计数周期结束,产生了更新事件(UEV),预分频寄存器的值才会被传递到缓冲寄存器里面去,才会生效。

CNT_EN:计时器使能,高电平计数器正常工作,低电平计数器停止

CK_CNT:计数器时钟,使预分频器的时钟输出也是CNT计时器的时钟输入

2.计数器时序

UIF只要置1了,就会去申请中断,中断响应后需要在中断程序中手动清零

ARR:自动重装定时器,它也有缓冲寄存器

a. 计数器无预装时序
b.计数器有预装时序

让值得变化和更新同步发生,防止在运行得途中更改发生错误

3.RCC时钟树

五、TIM输出比较

1.输出比较简介

IC:Input Capture 输入捕获

CC:Capture/Compare 输入捕获和输出比较的单元

CNT计数器与CCR捕获比较寄存器

CNT自增,CCR为给定值,通过比较二者的值不断置1 ,置0,来达到输出PWM波形的效果。

2.PWM波形

PWM为数字输出信号,由高低电平组成。PWM的频率越快,它等效的模拟信号就约平稳。

快频率通电断电,就可以得到一个平均输出值。

分辨率:占空比变化的精细程度。

3. 输出比较部分电路

(1)输出比较通道

oc1ref: reference(参考信号)

极性选择:

0–>信号不反转

1–>非门取反,信号反转

OC1右侧接推挽电路(2个,形成H桥),就可用于驱动电机(正反转)

(2)八种模式输出比较

  • 冻结:输出暂停,高低电平维持冻结状态保持不变。

  • 有效电平/无效电平(1/0)

  • 匹配时输出翻转:更新两次,输出才为一个周期。

4.PWM基本结构

(1)总体结构

PWM输出:

蓝色:CNT 黄色:ARR 红色:CCR

(2)参数计算

5.STM32外设

(1)舵机

PWM信号输入到控制板,给控制板一个指定的角度。然后,电位器检测输出轴的当前角度。若大于目标角度,直流电机反转;小于,正传。最终使输出轴固定在指定角度。

(2)直流电机

H桥: 由两路推挽电路组成

  • Title: MCU-Study-Stm32
  • Author: jrl
  • Created at: 2023-10-06 16:17:42
  • Updated at: 2023-11-19 12:54:02
  • Link: https://jrl777.github.io/2023/10/06/MCU-Study-Stm32/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments