stm32学习笔记

745 阅读28分钟

一、初识stm32

名称

image.png

理解stm32内部结构

image.png

1.ICode总线

ICode 中的 I 表示 Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在 FLASH中,内核要读取这些指令来执行程序就必须通过 ICode 总线,它几乎每时每刻都需要被使用,它是专门用来取指的

2.驱动单元
  • DCode总线 DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。我们在写程序的时候,数据有常量和变量两种,常量就是固定不变的,用 C 语言中的 const 关键字修饰,是放到内部的 FLASH当中的,变量是可变的,不管是全局变量还是局部变量都放在内部的 SRAM。因为数据可以被Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数
  • 系统总线 系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。
  • DMA总线 DMA 总线也主要是用来传输数据,这个数据可以是在某个外设的数据寄存器,可以在 SRAM,可以在内部的 FLASH。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数
3.被动单元
  • Flash(闪存) 内部的闪存存储器即 FLASH,我们编写好的程序就放在这个地方。内核通过 ICode 总线来取里面的指令
  • SRAM 内部的 SRAM,即我们通常说的 RAM,程序的变量,堆栈等的开销都是基于内部的 SRAM。内核通过 DCode 总线来访问它。
  • AHB到APB的桥 从 AHB 总线延伸出来的两条 APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设。我们经常说的 GPIO、串口、I2C、SPI 这些外设就挂载在这两条总线上,这个是我们学习 STM32 的重点,就是要学会编程这些外设去驱动外部的各种设备。

启动boot脚

(11条消息) 启动模式,BOOT0和BOOT1详解__Charles_Chen的博客-CSDN博客_boot0和boot1怎么设置

二、寄存器

1.什么是寄存器

寄存器实质是一个内存单元(在stm32中常说32位,在c51就是8位),我们给特殊功能的内存单元取一个别名,这个别名也就长说的寄存器,例如GPIOA_ODR寄存器,而取名的过程就叫寄存器映射了。\

2.寄存器的映射

例如 #define GPIOB_ODR 0X40010C0C这个过程就是映射过程了,而GPIOB_ODR也就是常叫的寄存器 而这也就是固件库的底层原理

3.寻找特定功能寄存器的地址如何找呢

查表:

大方向->小方向->寄存器(例如AHB->RCC->APB2perihpClock)

image.png

image.png

找到上面的小方向后,就可以直接找其内包含的寄存器,然后+偏移地址量

image.png

三、新建一个stm32固件库工程

1.整体步骤分为:

1.新建工程,然后添加相应的stm32芯片
2.改成Start文件,存放内核文件+工程启动文件(得选型)+外设描述文件
3.再建一个User文件,存放main,注意在建main的时候记得放在User文件下,不然会散。
4.添加Start目录至编译器中,魔术棒的c,c++处、
5.改字体大小,字体,文本格式,缩进大小等问题
或者 QQ图片20220316220809.png

2.过程配置展示

  • 1.Start中的文件

QQ图片20220316221251.png

其里面具体有

QQ图片20220316221254.png

  • 2.Library中的文件 .c文件 QQ图片20220316221308.png .h文件 image.png

  • 3.User中的文件 main和系统和包含文件 QQ图片20220316221323.png

3.配置中出现的问题:

  • 编程的注意点:

QQ图片20220316221857.png

  • 修改的地方

QQ图片20220316221854.png

  • 将配置好的文件和包含启动内容添加至编译器中

要启动stm32f10x_conf.h文件,必须先定义出如下图的字符 QQ图片20220316221904.png

QQ图片20220316221907.png

四、GPIO的介绍

1.GPIO的复用作用

如何理解STM32单片机引脚的复用功能? - 知乎 (zhihu.com) 即是当引脚作为外设,而不是单独的作为引脚输入输出高低电平时,需要用到复用开漏输出或者复用推挽输出;

2.GPIO的复用和重映射的讲解及代码

(11条消息) 【STM32】端口复用和重映射,完全重映射,部分重映射_Zhao-Jichao的博客-CSDN博客_部分重映射

3.上拉下拉浮空输入问题

几种按键电路实例:

  • 1.需要在软件端进行配置成默认上拉或下拉,但首先软件端GPIO口配置了这几种电阻电路 image.png 一般用上拉输入。上拉输入使得默认状态下GPIO口处于高电平。按下时,GND给低电平,这样误差很小。 image.png 同理给下拉输入
  • 2.硬件端给出了下拉输入或者上拉输入,则GPIO可以对应硬件电路设置成上拉或下拉,还可以设置成浮空模式

image.png

  • 3.复杂电路情况 image.png 下拉电阻接法+滤波按键抖动电路。

按键的几种电路

![image.png](p6-juejin.byteimg.com/tos-cn-i-k3…?

五、寄存器的位带操作

1.什么是位带操作

简单来说,就是可以通过位带操作实现单独配置某一个位,而固件库是每32位进行配置的。这就是区别。
等同于51单片机中的sbit所定义的位端口,直接操作,而我们所要实现的效果就是如P0_0=0/1这样的操作
在 STM32 中,有两个地方实现了位带,一个是 SRAM 区的最低 1MB 空间,令一个是外设区最 低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外(正常操作指的是32位进行操作,而现在是操作1位),他们还有自己的位带别名区

理解点:官方给片山外设的32位寄存器每一位都赋予了一个地址,然后将其地址存储到位带别名区中,然后我们要单独找到这一位的地址,然后通过指针,就可以直接实现对某位进行直接操作

2.位带操作对于stm32的实际意义

虽然说全部寄存器都可以实现比特操作,但我们在实际项目中并不会这么做,甚至不会这么做。但是当实际项目中,需要频繁的操作一个位的时候,就可以利用这种位带操作,使编写代码更简单,且写的代码占的空间更少,

3.位带操作具体内容

  • 片上外设的寄存器各个位都对应着位带别名区

QQ图片20220320102950.png

QQ图片20220320103014.png

QQ图片20220320103020.png 从该图片就易知外设都存在着相应的位带别名区,这就意味着都可以实现进行位操作

  • 解释公式内容 1. 是片上外设的外带别名区的地址计算
    AliasAddr= =0x42000000+ (A-0x40000000)84 +n*4

首先明白:一个地址要占4个字节,一个字节有一个地址。而现在官方给每位都赋值了一个地址,存储在外带别名区中。(下面外设位带别名区就是存储每一位的地址,而外设位带区是存储了每一个字节的地址),所以现在的目的就是找到某个位的地址,然后用指针追寻,再直接操作他。

然后解释:0X42000000 是外设位带别名区的起始地址,0x40000000 是该位所在寄存器的起始地址(该32位寄存器的第一个字节的地址), (A-0x40000000)表示该位所在的32位寄存器前面有多少个字节,一个字节有 8 位,所以 *8,一个位膨胀后是 4 个字节,所以 *4,n 表示该位所在32位寄存器的序号,因为一个位经过膨胀后是四个字节,所以也 *4。

2. 是SRAM的外带别名区的地址计算 AliasAddr= =0x22000000+ (A-0x20000000)84 +n*4

3. 最终公式可以变成一个通式
((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<<5)+(bitnum<<2))

实际操作与51的比较

位带操作实现和51一样,配置相应位直接实现功能
注意点:
1.实现形式最好和51差不多(如P0_0=1)
2.stm32还是要初始化GPIOX端口输出和输入模式,才能工作\

六、RCC时钟

1。RCC和时钟简单介绍

*时钟:

时钟就是单片机的心脏。每跳动一下。整个单片机的各个电路就同步的动作一下。就好像我们做广播体操的时候 广播上喊的节拍1234 2234 3234。。。。然后我们全部的同学就按照这个节奏进行一个个动作。节拍越快我们动作越快。节拍越慢我们动作的越慢。单片机是依照时钟节拍来工作的,单片机主要是靠执行先前已经编译好的程序来工作的,程序要一条条地被执行。

*RCC:

RCC就是一系列控制复位功能和控制时钟功能的寄存器,只有当外设上时钟打开时均才可使用片上外设端口IO进行工作。和51的区别就在于stm32有RCC控制着各个外设或其他寄存器的时钟配置和打开,而51是全部都处于打开状态。
对其解释:
(抄录于(4条消息) 对单片机中时钟的理解:_星空闪耀&的博客-CSDN博客_单片机时钟)\

51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以用了,而这个时钟是默认开启的,比如有一个水库,水库有很多个门,这些门默认是开启的,所以每个门都会出水,我们需要哪个门的水的时候可以直接用,但是也存在一个问题,其他没用到的门也在出水,即也在耗能。这里水库可以认为是能源,门可以认为是每个外设的使用状态,时钟可以认为是门的开关。stm32之所以是低功耗,他将所有的门都默认设置为disable,在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以,其他的没用到的可以还是disable,这样耗能就会减少。 在51单片机中一个时钟把所有的都包了,而stm32的时钟是有分工的,并且每类时钟的频率不一样,因为没必要所有的时钟都是最高频率,只要够用就行,好比一个门出来水流大小,我只要洗脸,但是出来的是和洪水一样涌出来的水,那就gg了,消耗能源也多,所以不同的时钟也会有频率差别,或者在配置的时候可以配置时钟分频。而这就需要RCC来进行分配了。

2.大致流程

实验设计:重写配置系统时钟的过程
这个并没有什么连接部分,全由RCC里面内部配置和通过RCC打开相应的外设时钟,所以只需研究RCC即可

3.框图原理和寄存器

*RCC时钟树框图:

image.png

*时钟树解释

image.png

*几个重要时钟(据框图分析)

  • 时钟源:HSI是高速内部时钟,RC振荡器,频率为8MHz。

HSE是高速外部时钟,可接石英/陶瓷谐振器(俗称晶振),或者接外部时钟源,频率范围为4MHz~16MHz。

LSI是低速内部时钟,RC振荡器,频率为40kHz。

LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

  • 由时钟源通过分频或倍频(硬件)得到的时钟PLLCLK是锁相环时钟,通过HSE和HSI分频或倍频得到,可查如图

SystemCLK是系统时钟,可由HSI,HSE,PLLCLK任意一个得到

③ 还有一些时钟是通过系统时钟+硬件倍频或分频得到,有些时钟根据具体功能的需求会有最大限制频率,查手册即可。

*寄存器

这个都是属于RCC寄存器,没有其他特别的东西,所以可查手册

4.固件库函数

*配置固件库函数流程

0.首先需要把RC_给全部复位(由于上电时,启动文件时,就已经配置好RCC内部时钟树了,设置系统时钟为默认频率72m)
1.打开HSE时钟,RCC_CR配置HSEON,开启HSE时钟源,
2.等待HSE时钟开启,检验,用RCC_CR的HSERDY,还有超时处理
3使能预取指FLASH,然后设置两个等待
4.设置AHB,APB2,APB1的分频各自为多少,72,72,36
6.锁相环配置,配置RCC_CFGR的PLLMUKL。将HSE的8M*9得到72M频率(这时候PLL必须处于关闭状态)
6.使能PLL, 配置RCC_CR的PLLON,启动PLL,然后等待检验PLLRDY
7.配置RCC_CFGR的SW位,选择PLL时钟
8.配置RCC_CFGR的PLLSRC和PLLXPTRE的寄存器(按照如图)\

都可在RCC.h和FLASH.h文件中找到

5.注意点:

七、NVIC中断向量表

正如前文已经多次提到的,向量中断控制器,简称 NVIC,是 Cortex-M3 不可分离的一部分,它与 CM3 内核的逻辑紧密耦合,有一部分甚至水乳交融在一起。NVIC 与 CM3 内核同声相应,同气相求,相辅相成,里应外合,共同完成对中断的响应。NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC 还包含了 MPU、SysTick 定时器以及调试控 制相关的寄存器。

八、EXTI外部中断(EXTI俗称外部中断/事件控制器)

1.大致流程

外设通过连接GPIO发出一段波形信号(正负),然后进入EXTI的外部中断控制器,通过EXTI后,才能进入NVIC中断向量表,然后NVIC通过识别是哪里发出的中断请求,然后向CPU报告,然后CPU发送特定指令去处理紧急事件(也就是中断)。\

image.png 所以要配置的地方有三个:GPIOx,EXTI,NVIC(还有一个就是GPIO和EXTI的连接部分由AFIO完成)

2.原理和寄存器

GPIO的原理和寄存器

GPIO也就是需要初始化,配置模式为输入模式即可,其他配置照常打开使能。

EXTI的原理和寄存器

  • 框图 image.png
  • 对应配置的寄存器 image.png

*其上面的输入线就是这下面的几根线

image.png

选择上面框图的哪一个接口Pin,和哪一个EXTI(0-15)由AFIO里的寄存器来配置,它属于APB2下,首先要打开它的时钟,才能够进行配置

image.png

NVCI的原理和寄存器

NVIC的原理和寄存器在CM3手册有具体讲解,可去看

可简单从固件库函数分析其里面完成的过程

image.png

各部分连接

配置好GPIO口后,连接EXTI,首先选择哪一个GPIO口的哪一个端口是通过AFIO完成配置,如现在已将GPIOA_Pin_0完成连接到指定的EXTI0处,然后配置EXTI,使得EXTI0中的线全部有效,而其他的EXTI的线无效(这也相当于EXTI0的线全部接入EXTI使能完成),然后前两部分已经完成功能使能和各部分连接。然后EXTI和NVCI的连接是配置NVCI寄存器,配置好中断源即完成了连接两部分

3.固件库函数

查看编写的源程序即可

  • EXTI库函数解释 image.png
  • 固件库函数 1.GPIO
    2.AFIO,在GPIO.h中找到
    3.EXTI 在stm32f10x_exti.h文件找到\

4.NVCI 在misc.h文件找到

  • 注意 1.这与定时器的原理可不同,是属于外部中断,需要外部信号来触发中断事件
    2.中断函数的编写,与c51的差别在于 c51是用 函数定义 interrup 0-6来标志哪一个中断, 而stm32则是需要找到其特殊函数名,在start里可找到,而且必须在it.h文件中编写
    本质还是一样

image.png

image.png

九、Systemtick(系统定时器)

1.大致流程:

系统定时器是内核的外设,其作用是与中断一起使用。
其意义是:当定时器输入一个时间,当这个时间流逝成0后,进入中断函数执行,也就是定时器表面意思。
框图:想象一下,有个区域是定时器(Systemtick),然后另一个区域是中断区域,其两者连接要靠NVCI向量表控制。所以我们需要明白的原理部分也就这三个部分。配置寄存器可能也就这三个部分。

2.原理和寄存器

*定时器原理

QQ图片20220325114023.png

*定时器时间计算

clk表示AHB的时钟频率,我们可以通过RCC寄存器来调节(默认为72m)

QQ图片20220325114034.png

*使用到的寄存器

  • 其内核外设和片上外设的中断优先级配置的地方

QQ图片20220326101110.png

  • systemstick寄存器各自功能如下:

QQ图片20220325114048.png

  • NVIC要配置的寄存器 配置的是中断源和中断优先级 image.png

*固件库函数和结构体

其System里的寄存器用结构体定义好了

QQ图片20220325114045.png

其里面配置过程对应着我们刚才讲述的寄存器中

QQ图片20220325114041.png

可以设置中断函数,但如何写是个问题

  • 讲解一下中断优先级问题(片上外设和内核外设的中断优先级) 中断优先级是在NVIC中进行配置的\

其配置首先要分优先级组,然后再分优先级(而优先级里又分抢占优先级和次优先级)\

然而其优先级是有4位进行配置,其中抢占优先级和次优先级的位数不知道,这是由优先级组来决定\

从如图可看,优先级组一共5组,每一组对应其抢占优先级和次优先级的各个位数不一样\

比较中断优先级的时候是先比较抢占优先级,再比较次优先级,再比较硬件编号。数低,每个部分优先级就高\

如先配置PriorityGroup_1,则抢占优先级可配1位,数值0/1,而次优先级可配3位,数值0-8
如先配置PriorityGroup_2,则抢占优先级可配2位,数值0-4,而次优先级可配2位,数值0-4 image.png

image.png

与C51的区别点

1.不和c51一样,其配置定时器得不断重复进行配置,我也不知道是什么原因 因为不能配置重装值和当前值

十、串口

1、掌握几个区域和流程

首先想要让串口进行通讯,则需要硬件连接对(查表)。其次就是编程使其运行。
首先是USART部分,然乎是其TX,RX通过GPIO口复用输出部分。(根据需求配置USART中断部分)

2、有关串口的一些额外知识

电平标准

详解:(4条消息) 电平标准详解_Mr. Qu的博客-CSDN博客_电平标准

  • 电平标准 就是当处理信息传输的时候,我们是以电压为传输媒介,而所要获取的是数字信号(硬件处理的数字信号只能为0或1)。则我们需要将这个模拟信号转化成数字信号。而现在面临的实际问题是,由于电压存在大小,正负,即让0,1表示某一个电压范围,则就需要制定一种标准,来将电压作为实际传输,数字01为虚拟载体(两者转化是靠硬件进行转化)。所以就衍生了电平标准。\
  • 存在多种电压标准的原因: 1.设备的硬件抗压能力的不同
    2.硬件所要用的功能不同(比如用于驱动,则就需要很大电压)
    3.电信号传输的环境不同(比如工厂中的硬件设备,其电平标准大部分为RS232,由于电平信号存在波动,需要很大的抗干扰能力防止有很大波动,如果无法从电压方面去增强抗干扰能力,那么我就从电平标准方面去做,使得波动大的电压也可以准确无误表示数字信号0,1)
    4.传输的距离不同

通讯的几个问题

详解: 全双工/半双工/单工,串行通信/并行通信,同步通信/异步通信,电平信号/差分信号,并行接口/串行接口,串口通信 - KeepMoving2018 - 博客园 (cnblogs.com)

  • 全双工,半双工,单工

      介绍:
          全双工,有两根线,收发,可以同时进行收发通讯。通讯可以双向
          半双工,有两根线,收发,只能进行一种通讯,要么收,要么发。通讯可以双向
          单工,一根线,只能从A发,B收。通讯单向
    
  • 同步,异步

      介绍:
          同步,有时钟线。同步通信中,通信双方按照统一节拍工作,所以配合很好;
              一般需要发送方给接收方发送信息同时发送时钟信号,接收方根据发送方给
              它的时钟信号来安排自己的节奏。同步通信用在通信双方信息交换频率固定,
              或者经常通信时。带时钟同步信号传输。
              如-SPI,IIC通信。
          异步,无时钟线。在双方通信的频率不固定时(有时 3ms 收发一次,有时 3 天
              才收发一次)不适合使用同步通信,而适合异步通信。异步通信时接收方不必一直
              在意发送方,发送方需要发送信息时会首先给接收方一个信息开始的起始信号,接
              收方接收到起始信号后就认为后面紧跟着的就是有效信息,才会开始注意接收信息
              ,直到收到发送方发过来的结束标志。异步通信:不带时钟同步信号。
              如·UART(通用异步收发器),单总线。
      主要区别:
          同步通信与异步通信区别:
          1.同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;
          2.异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可
            经过任意长的时间间隔再发送下一个字节。
          3.同步通信效率高,异步通信效率较低。
          4.同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
          5.同步通信可用于点对多点,异步通信只适用于点对点。
    
  • 串行,并行

      介绍:
          串行:通过一根线来发送数据,一个IO口即可传输多位数据
          并行:通过多个IO传输数据,可同时传输多位数据
      各自特点:
          串行:较并行传输慢,用于传输距离长
          并行:较串行传输较快,用于传输距离短  
    

image.png

3、物理层和协议层

最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。

物理层

  • 通讯之间的电平标准转换 image.png 由于电平标准不同,则传输时,电压大小也是不同的,则我们需要利用电平转换芯片进行转换
  • 通讯线(了解即可) image.png

image.png

协议层

  • 大致时序 image.png
  • 起始位,数据位,校验位(奇校验,偶校验,不校验),停止位
  • 波特率 这个在C51讲过

4、框图和寄存器原理

框图原理

image.png

  • 其引脚定义 1.如果使用SCLK时钟线通讯,那么就是同步USART。则就需要用GPIO来充当时钟线,特定时间给GPIO置位清位
    2.如下是USART的TX,RX收发引脚,注意与模块连接时,引脚连接好
    3.UART 只是异步传输功能,所以没有 SCLK、nCTS 和 nRTS 功能引脚。 image.png image.png

通讯时具体的时序图

这个固件库已经帮我们完成了,但如果用寄存器去写,那么得懂 image.png

寄存器原理

阅读相关手册,总结需要配置的哪些功能和寄存器
一般为
初始化硬件过程
通讯过程\使能过程
注意事项过程 image.png

image.png

image.png

image.png

时钟极性,时钟相位

image.png

  • 阅读寄存器所获得:流程 打开USART
    设置起始位和字节长度
    设置停止位
    置位TE使能发送(使能接收)
    然后写入USART_DR寄存器;如果要多次写入,则重复该步骤即可(接收USART_DR寄存器)
    结束输入则等待TC置位1;(RXNE置位1)
    然后可以选择关闭该TE使能发送\

3.c语言中的printf,Scanf

image.png

image.png

image.png

5、配置流程

主要分:

初始化部分

  • 必须配置:
    1.配置GPIO。打开其对应时钟,相应的USART(1-5)其收发TX,RX的接口是哪一个GPIO引脚,TX配置复用输出模式,RX配置浮空接收模式
    2.配置USART。打开其对应时钟,然后配置
    3.打开USART总开关

  • 根据需要进行配置
    1.时钟线问题
    2.中断服务问题:要NVIC配置USART相应寄存器中断使能配置其对应中断服务函数

功能部分

  • 一个字节(8位)的传输
  • 数组的传输
  • 字符串的传输(两种形式)
  • 电脑发送控制单片机命令

6、串口有关问题注意

  • 当设置中断的时候,如果开启了哪个的中断(中断产生是由于置位产生的),那么必须在中断函数中软件复位,要不然一直卡在中断函数中。

1. 发送如下单字节时: image.png image.png

2. 连续发如下数据时: image.png image.png

  • 发送中断,接收中断问题(贼离谱,恶心)

十一、定时器和定时器的其他功能

1、TIM介绍

image.png

2、TIM的框图和功能

这里主要介绍通用定时器,高级可看手册。 image.png

1.时基单元介绍

1.预分频器的作用是将CK_PSC(所选取的时钟源)上时钟信号进行分频,然后得到CK_CNT计数时钟,达到计数变慢的效果
公式:CK_CNT = CK_PSC / (PSC + 1)
2.计数器为16位,其存在16位重载计数器,计数器有多种计数模式达到溢出效果
计数模式有:向上,向下溢出,和中央对齐三种
公式:计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1)其中CK_PSC即为所选的时钟频率
3.重载值计数器为16位寄存器
4.区分几个时钟线,CK_INT(内部时钟),CK_PSC(预分频器前时钟),CK_CNT(预分频后时钟,计数器时钟)

2.时钟源选择介绍

  • 可来源于四种

      1.其中外部的可以有两种,一种是TIMX_ETR,和输入捕获通道中的信号作为时钟
      2.一种是内部的时钟(来自APB1/2总线上的经过分频得来的72M,默认)
      3.另一种是定时器的TRGO作为时钟源
    
  • 框图 image.png 联级之后的连接问题 image.png 3.时钟源模式2,是ETR输出等效于ETR模式1输出

image.png

  • 时钟源选择编写程序流程与注意 1.TIM在不选择时钟源情况下默认就是72M,选择ETR外部时钟或者模式一的时钟,只需调用一个函数即可使用,函数参数都有滤波器,极性选择功能(从框图中也不难看出有)(还有需要注意ETR极性可以是高电平和上升沿,而TIFP1/2只能是上升沿,但我现在未发现有啥太大区别点),根据需要配置即可
    2.当使用的是手动模拟时钟(按键...),这个得十分注意这个分频问题和重装载值。原理:反正始终是一个公式 t=(PSC-1)*(ARR-1)/clk(所选择的时钟)。

  • 固件库中的体现

image.png

**可查直接固件库选择函数配置参数**

3.定时器中断问题:

1.定时器中断类型

(11条消息) stm32定时器中断类型分析_aishibei0465的博客-CSDN博客 blog.csdn.net/xuhao0258/a…

TIM_IT_Update:更新中断,计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
TIM_IT_CC1~4:都是捕获/比较中断,貌似都是平等的,即输入捕获,输出比较
TIM_IT_Trigger:触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

4.输出比较PWM介绍

image.png

image.png

1.PWM输出框图

image.png

2.PWM的多个通道输出特点

1.一个定时器(高级或通用)有四个通道,所以可以输出四路不同的PWM
2.同一个定时器的四路通道,共用一个定时计数(即CCR相同),四个不同的比

5.定时器的主从模式介绍

主模式主要是:TIM内部对外部设备进行触发操作
如:计数器操作,更新事件,比较输出通道来作为触发源通过TROG对外设进行输出信号(触发信号)

从模式主要是:外部设备信号对TIM内部进行触发操作
如:外部时钟1,TIM的TRGO级联,输入捕获通道作为触发源通过TRGI对内部TIM的操作设置(更新,重置,编码器模式等操作)


常用库函数
主模式:
    触发源选择:void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource)
    TRGO连接:void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode);
 从模式:
     触发源选择:
     void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
     和编码器模式的触发源:void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
                            uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
     触发模式选择;void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);

     

image.png

6.定时器的输入捕获介绍

  • 功能框图 image.png

  • 编程的几块 image.png

      1.配置捕获通道CH对应的GPIO端口
      2.配置捕获通道单元
      3.配置捕获触发到从模式下的连接
      4.配置时基单元用来计数
    

7.定时器的编码器接口介绍

可以利用极性反相来调整引脚交叉连接的结果

4、寄存器定义

image.png

image.png

image.png

image.png

image.png

image.png

image.png

5、固件库函数

image.png image.png

image.png image.png image.png

image.png

image.png

6、配置流程

  • 定时器中断配置框图: image.png
  • 输出比较的配置框图(不需要定时器的中断功能) image.png 较值

7、定时器的一些其他用途

1.可以用来外部时钟或者一些输出模拟信号来当作计数的时钟,接口在TIMX_ETR
2.可以用TRGO实现定时器联级和AD,DA的触发启动源

1.TRGO作为定时器的更新事件时

TRGO可以被用作多种模式作为输出,如下图 image.png

  • 如作为更新事件时(定时器联级,触发AD,DA) image.png
  • 作为输出比较通道

image.png

  • 固件库函数

image.png

2.主从模式解释和框图

image.png

  • 寄存器 主模式:

image.png

从模式:

image.png

十二、串口下载的原理和boot引脚的问题。

串口下载

image.png

通过串口下载:
原理:首先要进入系统存储器开始,使得运行一段
BOOtLoder代码(ST公司已经写好的,相当于一个串口下载程序(固件))
。运行BOOtLoder代码,然后这段代码会将来自串口的数据进行
刷新到Flash中(主存储器),这样就完成了一段代码的下载。

但要运行,还是要先进入Flash中进行运行。

所以如果单纯通过boot引脚进行下载程序:
1.将boo0切到1(此时为CPU从系统存储器作为启动区域),复位锁存,然后串口下载,下载至Flash中
2.将boo1切到0(此时为CPU从主闪存Flash中作为启动区域),复位锁存,将里面程序运行

其中要首先要求进入系统存储器还是Flash中,由BOOT1,0引脚决定。

image.png

下载必须先拔插引脚,然后复位进行锁存当前的BOOT的取值来决定启动模式 切换运行模式也是一样的调试

十三、stm32中的数据类型解释

(12条消息) STM32中数据类型定义 U8 U16 U32解释说明_Lee139499的博客-CSDN博客_stm32中u32在哪定义的