stm32笔记

区分LED正负:长脚为正极

英文查询

RCC:Reset and Clock Control。RCC是STM32芯片中的一个硬件模块(外设),负责管理整个系统的时钟生成、分配以及复位控制
RCC内部时钟:特指由RCC模块管理的内部时钟源,即芯片内部集成的RC振荡器:

CSS :Clock Security System

ITR1:Internal Trigger 1。内部触发信号

TIMx_ETR:Timer x External Trigger

TIM2_CH1_ETR:Timer 2 Channel 1 / External Trigger

TRGI:Trigger In
TROG:Trigger Out

TI1FP1: Timer Input 1 Filtered and Polarity-adjusted 1

  • TI1:定时器的输入通道1(对应引脚如TIMx_CH1,例如PA8/TIM1_CH1)。
  • FP:经过滤波(Filter)极性调整(Polarity)后的信号。
  • 1:表示该信号是通道1的衍生信号(与TI2FP2对应通道2)。

Keil

添加项目文件夹

  1. 在项目文件夹里新建一个文件夹
  2. 在Keil里进行如下操作,输入文件夹名称image-20250429164600016
    此时在项目文件目录处出现这个文件夹image-20250429165043717
  3. 把这个文件夹加入到头文件列表image-20250429164732283
  4. 此时可以像平常一样添加文件,但是注意文件夹要选中对应的文件夹,Keil不会自动给你选image-20250429165305144

介绍

命名规则

image-20250128110819295

系统结构

image-20250128110853277

引脚定义

image-20250128110910600

GPIO

基础知识

  • GPIO(General Purpose Input Output)通用输入输出口
  • 可配置为8种输入输出模式
  • 引脚电平:0V~3.3V,部分引脚可容忍5V
  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
  • STM32中所有的GPIO都是挂载在APB2外设总线上
  • 每个GPIO有16个引脚。由于STM32是32位的,寄存器都是32位,但是GPIO只有16个引脚,所以高16位没用

基本结构

image-20250205152408158

位结构

image-20250128111122826

上(下)拉输入模式的作用:避免引脚悬空导致输入数据不确定,使输入默认为高(低)电平

TTL肖特基触发器应该为施密特触发器

模拟输入是模拟量,接在施密特触发器前面。
复用功能输入是数字量,接在斯密特触发器后面。

位设置/清除寄存器作用
对某一位置1,在位设置寄存器的对应位写1就行。
对某一位置0,在位清除寄存器的对应位写1就行。
不会影响其他位的数据

模式

使用浮空输入时要接上一个连续的驱动源,不能出现悬空的状态

模式名称 性质 特征
浮空输入 (Floating Input) 数字输入 可读取引脚电平,若引脚悬空,则电平不确定
上拉输入 (Pull-up Input) 数字输入 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入 (Pull-down Input) 数字输入 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入 (Analog Input) 模拟输入 GPIO无效,引脚直接接入内部ADC
开漏输出 (Open-Drain Output) 数字输出 可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出 (Push-Pull Output) 数字输出 可输出引脚电平,高电平接VDD,低电平接VSS
复用开漏输出 (AF Open-Drain Output) 数字输出 由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出 (AF Push-Pull Output) 数字输出 由片上外设控制,高电平接VDD,低电平接VSS

代码

初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//RCC_APB2外设时钟控制
	
GPIO_InitTypeDef GPIO_InitStructure;	//定义初始化结构体
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;	//配置模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;	//选择IO口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//配置IO口速度,仅输出有效

GPIO_Init(GPIOA,&GPIO_InitStructure)	//初始化GPIOA的参数为以上结构体

输入输出

GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
//设置GPIOA的Pin0口为低电平

GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
//设置GPIOA的Pin0口为高电平

GPIO_Write(GPIOA,~0x1);						//设置GPIOA为0x1信号
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

中断系统

STM32--中断使用(超详细!)_stm32中断-CSDN博客

概念

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

中断优先级:

  1. 抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先级中断;
  2. 响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能相互打断;
  3. 抢占优先级和响应优先级都相同的情况下,自然优先级越高的先执行;
  4. 自然优先级:中断向量表中的优先级;
  5. 数值越小,表示优先级越高;

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

NVIC

NVIC 即嵌套向量中断控制器,全称 Nested vectored interrupt controller。属于是内核的器件,其作用是对STM32中的中断进行管理

image-20250501012245714

中断程序设计注意事项

  1. 不要在中断函数执行耗时过长的操作
  2. 不要在中断函数和主函数调用相同的函数或操作同一个硬件。
    可以选择在中断函数中维护一个标志位,当中断结束时,根据标志位进行下一步操作

EXTI(Extern Interrupt)外部中断

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

支持的触发方式:上升沿/下降沿/双边沿/软件触发

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断

通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

中断响应是正常流程,会告诉内核。

事件响应不会触发中断,而是触发外设操作,属于外设直接的联合工作

原理

基本结构

image-20250501013421351

AFIO(中断引脚选择)

AFIO主要用于引脚复用功能的选择和重定义

在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

image-20250501014634532

EXTI(边沿检查及控制)

image-20250501014708657

使用场景

获取的信号是外部驱动很快的突发信号,比如旋钮,红外线等

使用细节

在配置中断函数时,按照GPIO,AFIO,EXTI,NVIC的顺序来配置外设,这样不会遗忘每一步

EXTI配置模式是固定的,可以去手册中查找。
这里图片指对应引脚要选择浮空/上拉/下拉输入image-20250502142740490

EXTI中断函数的名字是固定的,每个中断通道对应一个中断函数。具体可以去中断向量表处查询

中断函数的参数和返回值都是void

每次执行完中断函数需要把对应的中断标志清除。否则就会一直在中断函数中运行

定时器

stm32 学习 定时器定时中断(最详细的Timer定时器介绍)_stm32定时中断-CSDN博客
【STM32】系统时钟RCC详解(超详细,超全面)_rcc时钟-CSDN博客

简介

TIM(Timer)定时器
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
16位计数器、预分频器、自动重装寄存器时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

16位计数器:每来一个时钟信号 ,计数器+1
预分频器:可以对计数器的时钟进行分频,让计数更加灵活
自动重装寄存器:设定触发,让计数达到一定数值的时候,进行中断的申请

\(最大定时 = (最大计数器)*(最大自动重装数)/72Mhz\)

定时器类型

对比

注意:每个芯片型号不一样,定时器不一定一样。使用前要查一下是否有这个外设

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

基本定时器

只能使用72MHz的内部时钟

时钟通过预分频器,来增加CNT计数器,当计数器的数值与自动装载寄存器相同时,产生中断信号,并且清零计数器。

图中向上的箭头代表会产生更新中断,向下的箭头代表更新事件
更新中断会由CPU处理;更新事件是纯硬件自动处理,不会由CPU处理

image-20250503162134216

主模式触发DAC

当需要用DAC 输出一段波形的时候(例如PWM),那么就需要每隔一段事件来触发一次DAC,让他输出下一个电压点,如果用正常的更新中断来手动触发DAC 转换的话,就会极大占用资源,影响主程序的运行和其他中断的相应。

而在使用主模式下,可以将触发事件映射到触发输出TROG(Trigger Out)的位置
实现TRGO直接接到DAC的触发转换引脚上。
这样定时器的更新就不需要经过NVIC 中断响应来触发DAC转换了,过程不需要软件的参与,实现了硬件的自动化。

通用定时器

支持向上计数,向下计数,中央对齐三种计数模式

image-20250503164034336

情况1

f255f8810c384bcdbb9dc14d4840e528.png

情况2

d227e9da1fe643bb855ce3aec0f2622c.png

情况3

c332d4227d294e8f94079dd00f9d8c61.png

总结,外部时钟模式1 下,输入可以是ETR引脚。其他定时器,CH1 引脚的边沿,CH1 和CH2 引脚,一般情况下,使用ETR 为外部时钟输入

**输入捕获电路/输出比较电路 **

78a30d8c5c6b4afb814098908a6e8233.png

输出比较电路有四个通道分别对应CH1 到 CH4的引脚,可以用于输出PWM 波形

输入捕获电路也有四个通道,可以用于输入方波的频率测量等

中间的是输入捕获跟输出比较电路寄存器,两个电路共用四根引脚,不能同时进行

高级定时器

image-20250504205336820

相比于通用计时器,这里首先在申请中断的地方 增加了一个重复次数计数器,可以实现每隔几个计数周期,才发生一次更新事件和更新中断,这就相当于对于输出的更新信号,又做了一次分频,这里可以实现级联计时器的效果。

DTG (Dead Time Generate)死区生成电路 防止桥臂直通现象

BRK 刹车输入功能 如果外部BKIN产生刹车信号,或者内部时钟信号产生问题,那么就会自动切断电机的驱动,防止意外的发生

定时中断基本结构

image-20250503233042206

运行控制:控制寄存器位的,比如向上计数,向下计数,启动停止等等

中断输出控制:中断输出允许位,如果需要中断,就允许

bc8095a34fce409c8704ee458140a3c6.png

时序图/影子寄存器

分频器和计数器都会有一个影子寄存器,保证更改分频器的参数和计数器的目标值更改后不会立即更改而导致混乱。
从而通过双缓冲机制确保参数变更的原子性

预分频器时序

image-20250504000837140

CK_PSC 时钟源; CNT_EN 计数器使能; CK_CNT 计数器时钟,他即是预分频器的时钟输出,也是计数器的时钟输入

计数器计数频率 = 时钟源频率/(分频器数值+1);

计数器时序

image-20250504001257538

计数器溢出频率=时钟频率/(设定定时阈值+1) =定时器时钟源 / (分频系数+1)/(自动重转器系数+1)

注: CK_CNT 跟 CK_PSC 虽然同为时钟,但是CK_PSC 为时钟源,CK_CNT 为预分配器的输出,也为CNT 计数器的输入,是经过处理后的时钟,

计数器溢出频率是指一段时间内,有多少个计数周期,与其呈反比,计数周期越短,溢出频率(触发频率)也就越大 溢出时间为溢出频率的倒数,例如溢出频率为10MHz 表示1秒内,会发生10次的溢出,那么每次就为1/10

计算机预装时序

让数值的更改与更新事件同步发生,防止运行途中出现错误,通过第ARPE进行设置就可以开启/关闭

image-20250504001305911image-20250504001326725

RCC时钟树

简述

RCC是时钟的“控制中心”,负责管理和配置所有时钟源及其分配;而时钟树是时钟的“传输网络”,描述了时钟信号从源头到各个外设或功能模块的路径和分频/倍频逻辑。

RCC是系统的核心模块,负责生成和管理所有时钟信号(如CPU时钟、外设时钟等)。

时钟树是芯片中负责将主时钟信号(Clock Source)低失真、低偏移地分配到所有同步元件(如触发器、寄存器等)的分布网络。
主要分为时钟的产生电路与时钟的分配电路两大部分

系统时钟SYSCLK 的左边系统时钟有很多种选择,而左边的部分就是设置系统时钟使用那个时钟源,

系统时钟SYSCLK 的右边,则是系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率

从左到右可以简单理解为 各个时钟源--->系统时钟来源的设置--->各个外设时钟的设置

image-20250505175915955

img

时钟产生电路

在时钟的产生部分,有四个震荡源,高速晶振提供系统时钟AHB APB2 APB1 都是来源这两个高速晶振,外部晶振比RC 内部振荡器更稳定准确

内部的8MHz高速RC振荡器

外部的4-16MHz石英晶体振荡器,也就是晶振,一般都是接8MHz

外部的32.768Khz低速晶振,一般是给RTC提供时钟的 RTC(Real-Time Clock)即实时时钟

内部的40KHz低速RC振荡器,这个可以给看门狗提供时钟

dd4d28c45b0e49a399e2899fb3878038.png

CSS (Clock Security System) 时钟安全系统

一旦外部时钟失效,就会让内部RC振荡器作为时钟

时钟分配电路

所有定时器时钟频率都为72MHz

3f7319ce7cb5492faeeef8708dc03496.png

外设

传感器

传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

image-20250429163101647

image-20250429163831264

旋转编码器

旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向

类型:机械触点式/霍尔传感器式/光栅式

image-20250501015634641image-20250501015639212

posted @ 2025-07-14 13:18  r_0xy  阅读(60)  评论(0)    收藏  举报