STM32 DMA详解

发布者:科技律动最新更新时间:2020-12-25 来源: eefocus关键字:STM32  DMA 手机看文章 扫描二维码
随时随地手机看文章

本文是根据STM32F207的用户手册翻译整理而来

1、综述

DMA(Direct memory access)直接内存访问,被用于内存和内存之间或内存和外设之间的高速数据传输。数据传输可以在没有CPU的干预下快速移动,这样可以保持CPU资源处理其他事情

DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结

合在一起,优化了系统带宽,下图①处,可以看出双 AHB 主总线架构与独立的 FIFO的结构

注意看英文备注:

DMA1控制器AHB外设端口没有像DMA2一样连接到总线矩阵,所以只有DMA2数据流可以执行存储器到存储器的传输

我们对上图的②处,(DMA1和DMA2结构一样,我们就选择DMA1)详细看

 

①每个数据流总共可以有多达 8 个通道(或称请求)

②DMA1共有8个数据数据流(两个DMA共有16个数据流)

③每个DMA都有数据流仲裁器,用于处理 DMA 请求间的优先级

④DMA的数据流又有独立的FIFO

⑤DMA采用双 AHB 主总线架构

备注:

①处是选择器,配置完成只能选择一个通道,而③处是仲裁器,也就是说,配置完成,可能8个数据流全部存在,由仲裁器判断优先级

2、DMA事务

DMA从传输事务包含一系列的给定数目的数据传输序列。传输的数目可以通过软件编程,8位,16位或32位。

每一次DMA传输包含3个操作

  • 通过 DMA_SxPAR 或 DMA_SxM0AR 寄存器寻址,从外设数据寄存器或存储器单元中加载数据。

  • 通过 DMA_SxPAR 或 DMA_SxM0AR 寄存器寻址,将加载的数据存储到外设数据寄存器或存储器单元

  • DMA_SxNDTR 计数器在数据存储结束后递减,该计数器中包含仍需执行的事务数

在产生事件后,外设会向 DMA 控制器发送请求信号。 DMA 控制器根据通道优先级处理该请求。只要 DMA 控制器访问外设, DMA 控制器就会向外设发送确认信号。外设获得 DMA 控制器的确认信号后,便会立即释放其请求。一旦外设使请求失效, DMA 控制器就会释放确认信号。如果有更多请求,外设可以启动下一个事务

3、通道选择

每个数据流可以有8个通道

 

通过上图①可以看出,通道选择仲裁器可以通过DMA_SxCR寄存器的CHSEL[2:0]配置

DMA的请求可以来自TIM,ADC,SPI等外设

DMA1的请求通道

 

DMA2的请求通道

 

4、仲裁器

仲裁器为两个 AHB 主端口(存储器和外设端口)提供基于请求优先级的 8 个 DMA 数据流请求管理,并启动外设/存储器访问序列。

优先级管理分为两个阶段

  • 软件:每个数据流优先级都可以在 DMA_SxCR 寄存器中配置。分为四个级别:非常高优先级、高优先级、中优先级、低优先级

  • 硬件:如果两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据流。例如,数据流 2 的优先级高于数据流 4

5、DMA数据流

8个DMA控制器数据流都能够提供源和目标之间的单向传输链路

每个数据流配置后都可以执行

  • 常规类型事务:存储器到外设、外设到存储器或存储器到存储器的传输

  • 双缓冲区类型事务:使用存储器的两个存储器指针的双缓冲区传输(当 DMA 正在进行自/至缓冲区的读/写操作时,应用程序可以进行至/自其它缓冲区的写/读操作)

要传输的数据量(多达 65535)可以编程,并与连接到外设 AHB 端口的外设(请求 DMA 传输)的源宽度相关。每个事务完成后,包含要传输的数据项总量的寄存器都会递减。

6、源、目标和传输模式

源地址和目标地址可以在整个4G地址空间,在0x00000000和0xFFFFFFFF之间

在DNA_SxCR寄存求的DIR[1:0]配置DMA的传输方式

 

源地址和目标地址的关系

 

当数据宽度是半字或字时,外设地址或存储器地址必须是半字或字对齐

6.1、外设到存储器模式

当配置成外设到存储器的DMA传输模式时,两种模式

  • FIFO模式:外设有DMA请求(TIM溢出,PWM下降沿等)时,DMA会搬运源数据(外设数据)到FIFO,当FIFO满时,将数传输给目标地址(内存)

  • 直连模式:配置直连模式,DMA_SxFCR 寄存器中的 DMDIS 值为“0”。不使用 FIFO 的阈值级别控制:每完成一次从外设到 FIFO 的数据传输后,相应的数据立即就会移出并存储到目标中。

 

传输开始条件,使能数据流(DMA_SxCR 寄存器中的位 EN 置 1),然后外设发出请求,再然后该请求赢得了数据流仲裁,才会开始传输。

 

传输停止条件,下列满足一条即可

  • DMA_SxNDTR 寄存器达到零

  • 外设请求传输终止

  • DMA_SxCR 寄存器中的 EN 位由软件清零

6.2 存储器到外设模式

FIFO模式

这种模式,只要使能数据流(DMA_SxCR 寄存器中的位 EN 置 1),存储器数据就会传输到FIFO中,发生外设请求,FIFO数据会移出并存储到目标地址。当FIFO小于阈值,存储器的数据会重载FIFO。

 

直连模式

使能数据流时,DMA传输存储器的第一个数据到内部FIFO,发生外设请求时,DMA把预装在值发送的目标地址,然后进行下一个数据的传输。预装载的数据大小为 DMA_SxCR 寄存器中 PSIZE 位字段的值

 

传输停止条件,下列满足一条即可

  • DMA_SxNDTR 寄存器达到零

  • 外设请求传输终止

  • DMA_SxCR 寄存器中的 EN 位由软件清零

存储器到外设模式和外设到存储器模式一样,同样需要对应数据流赢得仲裁,才会启动传输

 

6.3 存储器到存储器模式

这种模式较为简单,没有外设请求

启动传输

DMA_SxCR 寄存器中的使能位 (EN) 置 1 来使能数据流时,数据就会从源地址传输到FIFO,到达FIFO阈值时,FIFO数据移出到目标地址

 

停止传输,下列满足一条即可

  • DMA_SxNDTR 寄存器达到零

  • DMA_SxCR 寄存器中的 EN 位由软件清零

当然,同样该数据流需要赢得仲裁

 

7、指针递增

外设和存储器指针在每次传输后自动向后递增或保持常量,根据DMA_SxCR寄存器的PINC和MINC位。

禁止递增模式时非常有用的,当外设源和目标数据是通过单个寄存器访问的

如果使能了递增模式,则根据在 DMA_SxCR 寄存器 PSIZE 或 MSIZE 位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增 1(对于字节)、 2(对于半字)或 4(对于字)

为了优化封装操作,可以不管 AHB 外设端口上传输的数据的大小,将外设地址的增量偏移大小固定下来。 DMA_SxCR 寄存器中的 PINCOS 位用于将增量偏移大小与外设 AHB 端口或32 位地址(此时地址递增 4)上的数据大小对齐。 PINCOS 位仅对 AHB 外设端口有影响。

如果将 PINCOS 位置 1,则不论 PSIZE 值是多少,下一次传输的地址总是前一次传输的地址递增 4(自动与 32 位地址对齐) 。但是, AHB 存储器端口不受此操作影响。

如果 AHB 外设端口或 AHB 存储器端口分别请求突发事务,为了满足 AMBA 协议(在固定地址模式下不允许突发事务),则需要将 PINC 或 MINC 位置 1。

8、循环模式

循环模式可用于处理循环缓冲区和连续数据流(例如 ADC 扫描模式)。可以使用 DMA_SxCR寄存器中的 CIRC 位使能此特性。

当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应 DMA 请求。

也就是说,比如我们要从内存中采集 64 个字节发送到串口,如果设置为重复采集,那么它会在 64 个字节采集完成之后继续从内存的第一个地址采集,如此循环。这里我们设置为一次连续采集完成之后不循环。所以设置值为 DMA_Mode_Normal。在我们下面的实验中,如果设置此参数为循环采集,那么你会看到串口不停的打印数据,不会中断,

9、双缓冲模式

此模式可用于所有 DMA1 和 DMA2 数据流。

通过将 DMA_SxCR 寄存器中的 DBM 位置 1,即可使能双缓冲区模式。

除了有两个存储器指针之外,双缓冲区数据流的工作方式与常规(单缓冲区)数据流的一样。使能双缓冲区模式时,将自动使能循环模式( DMA_SxCR 中的 CIRC 位的状态是“无关”),并在每次事务结束时交换存储器指针。

在此模式下,每次事务结束时, DMA 控制器都从一个存储器目标交换为另一个存储器目标。这样,软件在处理一个存储器区域的同时, DMA 传输还可以填充/使用第二个存储器区域

基于DMA双缓冲模式的的特点,应用中必须开辟两个存储区以及存放两个存储区首地址的存储寄存器,DMA_SxM0AR和DMA_SxM1AR。

1:DMA_SxM0AR:指向存储区0(DMA_Memory_0),单缓冲模式下默认使用该寄存器做存储区指针。

2:DMA_SxM1AR:指向存储区1(DMA_Memory_1),仅在DMA双缓冲模式下才能使用。

3:DMA正在访问的当前存储区由DMA_SxCR表示

CT:当前目标

CT = 0:DMA正在访问存储区0,CPU可以访问存储区1

CT = 1:DMA正在访问存储区1,CPU可以访问存储区0

 

优点:

使用DMA双缓冲传输,既可以减少CPU的负荷,又能最大程度地实现DMA数据传输和CPU数据处理互不打扰又互不耽搁,DMA双缓冲模式的循环特性,使用它对存储区的空间容量要求也会大大降低。尤其在大批量数据传送时,你只需开辟两个合适大小的存储区,能满足DMA在切换存储区时的当前新存储区空出来就好,并不一定要开辟多大多深的存储空间,单纯一味地加大双缓冲区的深度并不明显改善数据传输状况

 

10、可编程数据宽度、封装/解封、字节顺序

要传输的数据项数目必须在使能数据流之前编程到 DMA_SxNDTR(要传输数据项数目位,NDT)中,当流控制器是外设且 DMA_SxCR 中的 PFCTRL 位置为 1 时除外。

当使用内部 FIFO 时,源和目标数据的数据宽度可以通过 DMA_SxCR 寄存器的 PSIZE 和MSIZE 位(可以是 8、 16 或32 位)编程

 

11、单次传输和突发传输

DMA控制器可以产生一个单次传输或者4、8或16节拍的突发传输

突发大小通过软件针对两个 AHB 端口独立配置,配置时使用 DMA_SxCR 寄存器中的MBURST[1:0] 和 PBURST[1:0] 位

突发大小指示突发中的节拍数,而不是传输的字节数。

为确保数据一致性,形成突发的每一组传输都不可分割:在突发传输序列期间, AHB 传输会锁定,并且 AHB 总线矩阵的仲裁器不解除对 DMA 主总线的授权。

根据单次或突发配置的情况,每个 DMA 请求在 AHB 外设端口上相应地启动不同数量的传输

  • 当 AHB 外设端口被配置为单次传输时,根据 DMA_SxCR 寄存器 PSIZE[1:0] 位的值,每个 DMA 请求产生一次字节、半字或字的数据传输

  • 当 AHB 外设端口被配置为突发传输时,根据 DMA_SxCR 寄存器 PBURST[1:0] 和PSIZE[1:0] 位的值,每个 DMA 请求相应地生成 4 个、 8 个或 16 个节拍的字节、半字或字的传输

对于需要配置 MBURST 和 MSIZE 位的 AHB 存储器端口,必须考虑与上述相同的内容。在直接模式下,数据流只能生成单次传输,而 MBURST[1:0] 和 PBURST[1:0] 位由硬件强制配置。

必须选择地址指针(DMA_SxPAR 或 DMA_SxM0AR 寄存器),以确保一个突发块内的所有传输在等于传输大小的地址边界对齐

选择突发配置必须要遵守 AHB 协议,即突发传输不得越过 1 KB 地址边界,因为可以分配给单个从设备的最小地址空间是 1 KB。这意味着突发块传输不应越过 1 KB 地址边界,否则就会产生一个 AHB 错误,并且 DMA 寄存器不会报告这个错误。

 

12、FIFO

FIFO结构

FIFO是用来临时存储从源地址传来的数据,在这些数据被发送到目的地市之前。

每个数据流都有独立的4字FIFO,他们可以被软件配置为1/4、1/2、3/4或满

使用FIFO阈值,必须禁止直接模式

下图是FIFO结构和数据源、阈值关系的示意图

 

FIFO阈值和突发设置

警告被要求,选择 FIFO 阈值(DMA_SxFCR 寄存器的位 FTH[1:0])和存储器突发大(DMA_SxCR 寄存器的 MBURST[1:0] 位):FIFO 阈值指向的内容必须与整数个存储器突发传输完全匹配。如果不是这样,当使能数据流时将生成一个 FIFO 错误( DMA_HISR 或 DMA_LISR寄存器的标志 FEIFx),然后将自动禁止数据流

 

FIFO更新

FIFO可以被更新,当数据流被禁止通过写入DMA_SxCR寄存器的EN位和当数据被配置成外设到存储器或存储区到存储区模式:如果禁止数据流时仍有某些数据存留在FIFO 中, DMA 控制器会将剩余的数据继续传输到目标(即使已经有效禁止了数据流)。刷新完成时,会将 DMA_LISR 或 DMA_HISR 寄存器中的传输完成状态位 (TCIFx) 置 1。

在这种情况下,剩余数据计数器 DMA_SxNDTR 保持的值指示在目标存储器现有多少可用数据项。

直接模式

默认情况下, FIFO 以直接模式操作(将 DMA_SxFCR 中的 DMDIS 位置 1),不使用 FIFO阈值级别。如果在每次 DMA 请求之后,系统需要至/自存储器的立即和单独传输,这种模式非常有用。

当在直接模式(禁止 FIFO)下将 DMA 配置为以存储器到外设模式传输数据时, DMA 会将一个数据从存储器预加载到内部 FIFO,从而确保一旦外设触发 DMA 请求时则立即传输数据

 

13、DMA传输完成

以下各种事件均可以结束传输过程,并将 DMA_LISR 或 DMA_HISR 状态寄存器中的 TCIFx位置 1

  • 在 DMA 流控制器模式下:①在存储器到外设模式下, DMA_SxNDTR 计数器已达到零,②传输结束前禁止了数据流(通过将 DMA_SxCR 寄存器中的 EN 位清零),并在传输是外设到存储器或存储器到存储器的模式时,所有的剩余数据均已从 FIFO 刷新到存储器

  • 在外设流控制器模式下:①已从外设生成最后的外部突发请求或单独请求,并当 DMA 在外设到存储器模式下工作时,剩余数据已从 FIFO 传输到存储器②数据流由软件禁止,并当 DMA 在外设到存储器模式下工作时,剩余数据已从 FIFO传输到存储器

14、DMA传输暂停

可以随时暂停 DMA 传输以供稍后重新开始;也可以在 DMA 传输结束前明确禁止暂停功能,分两种情况

  • 数据流禁止传输,以后不从停止点重新开始暂停。这种情况下,只需将 DMA_SxCR 寄存器中的 EN 位清零来禁止数据流,除此之外不需要任何其他操作。禁止数据流可能要花费一些时间(需要首先完成正在进行的传输)。需要将传输完成中断标志(DMA_LISR 或DMA_HISR 寄存器中的 TCIF)置 1 来指示传输结束。现在 DMA_SxCR 中的 EN 位的值是“0”,借此确认数据流已经终止传输。 DMA_SxNDTR 寄存器包含数据流停止时剩余数据项的数目,这样软件便可以确定数据流中断前已传输了多少数据项。

  • 数据流在 DMA_SxNDTR 寄存器中要传输的剩余数据项数目达到 0 之前暂停传输。目的是以后通过重新使能数据流重新开始传输。为了在传输停止点重新开始传输,软件必须在通过写入 DMA_SxCR 寄存器中的 EN 位(然后检查确认该位为‘0’)禁止数据流之后,首先读写入DMA_SxNDTR 寄存器来了解已经收集的数据项的数目。然后①必须更新外设和/或存储器地址以调整地址指针②必须使用要传输的剩余数据项的数目(禁止数据流时读取的值)更新 SxNDTR 寄存器③然后可以重新使能数据流,从停止点重新开始传输

15、流控制器

控制要传输的数据数目的实体称为流控制器。此流控制器使用 DMA_SxCR 寄存器中的PFCTRL 位针对每个数据流独立配置

流控制器可以是:

  • DMA 控制器:在这种情况下,要传输的数据项的数目在使能 DMA 数据流之前由软件编程到 DMA_SxNDTR 寄存器

  • 外设源或目标:当要传输的数据项的数目未知时属于这种情况。当所传输的是最后的数据时,外设通过硬件向 DMA 控制器发出指示。仅限能够发出传输结束信号的外设支持此功能,也就是SDIO

16、流配置过程

配置 DMA 数据流 x(其中 x 是数据流编号)时应遵守下面的顺序

  1. 如果使能了数据流,通过重置 DMA_SxCR 寄存器中的 EN 位将其禁止,然后读取此位以确认没有正在进行的数据流操作。将此位写为 0 不会立即生效,因为实际上只有所有当前传输都已完成时才会将其写为 0。 当所读取 EN 位的值为 0 时,才表示可以配置数据流。因此在开始任何数据流配置之前,需要等待 EN 位置 0。应将先前的数据块 DMA传输中在状态寄存器(DMA_LISR 和 DMA_HISR)中置 1 的所有数据流专用的位置 0,然后才可重新使能数据流

  2. 在 DMA_SxPAR 寄存器中设置外设端口寄存器地址。外设事件发生后,数据会从此地址移动到外设端口或从外设端口移动到此地址

  3. 在 DMA_SxMA0R 寄存器(在双缓冲区模式的情况下还有 DMA_SxMA1R 寄存器)中设置存储器地址。外设事件发生后,将从此存储器读取数据或将数据写入此存储器

  4. 在 DMA_SxNDTR 寄存器中配置要传输的数据项的总数。每出现一次外设事件或每出现一个节拍的突发传输,该值都会递减

  5. 使用 DMA_SxCR 寄存器中的 CHSEL[2:0] 选择 DMA 通道(请求)

  6. 如果外设用作流控制器而且支持此功能,请将 DMA_SxCR 寄存器中的 PFCTRL 位置 1

  7. 使用 DMA_SxCR 寄存器中的 PL[1:0] 位配置数据流优先级

  8. 配置 FIFO 的使用情况(使能或禁止,发送和接收阈值)

  9. 配置数据传输方向、外设和存储器增量 / 固定模式、单独或突发事务、外设和存储器数据宽度、循环模式、双缓冲区模式和传输完成一半和/或全部完成,和/或 DMA_SxCR寄存器中错误的中断

  10. 通过将 DMA_SxCR 寄存器中的 EN 位置 1 激活数据流

一旦使能了流,即可响应连接到数据流的外设发出的任何 DMA 请求。

一旦在 AHB 目标端口上传输了一半数据,传输一半标志 (HTIF) 便会置 1,如果传输一半中断使能位 (HTIE) 置 1,还会生成中断。传输结束时,传输完成标志 (TCIF) 便会置 1,如果传输完成中断使能位 (TCIE) 置 1,还会生成中断。

 

17、中断

对于每个 DMA 数据流,可在发生以下事件时产生中断

  • 传输一半时

  • 传输完成时

  • 传输错误时

  • FIFO错误(溢出,下溢或FIFO等级错误)

  • 直接模式错误

中断列表

18、代码配置

配置代码

/* Configure DMA Stream */

DMA_InitStructure.DMA_Channel = DMA_Channel_0;

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Buffer;

DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DST_Buffer;

DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;

DMA_InitStructure.DMA_BufferSize = (uint32_t)32;

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;.          

DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;

DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

DMA_Init(DMA2_Stream0, &DMA_InitStructure);

DMA_Channel :


设置 DMA 数据流对应的通道,供每个数据流选择的通道请求多达 8 个,取值有


#define DMA_Channel_0                     ((uint32_t)0x00000000)

#define DMA_Channel_1                     ((uint32_t)0x02000000)

#define DMA_Channel_2                     ((uint32_t)0x04000000)

#define DMA_Channel_3                     ((uint32_t)0x06000000)

#define DMA_Channel_4                     ((uint32_t)0x08000000)

#define DMA_Channel_5                     ((uint32_t)0x0A000000)

#define DMA_Channel_6                     ((uint32_t)0x0C000000)

#define DMA_Channel_7                     ((uint32_t)0x0E000000)

DMA_PeripheralBaseAddr :


DMA 传输的外设基地址,假设进行uart1串口DMA 传输,我们可以按照寄存器的地址偏移直接设置地址:0x40011004,也可以直接使用ST提供库的表示方法:&USART1->DR


 


DMA_Memory0BaseAddr :


DMA 传输的内存基地址


 


DMA_DIR:


设置数据传输方向,有存储器到存储器,存储器到外设,外设到存储器三种选择,取值有:

[1] [2]
关键字:STM32  DMA 引用地址:STM32 DMA详解

上一篇:STM32 看门狗详解
下一篇:STM32 Flash详解

推荐阅读最新更新时间:2024-11-06 06:43

STM32中EXTI(外部中断)和NVIC(嵌套向量中断)的关系
NVIC是Cortex-M3核心的一部分,关于它的资料不在《STM32的技术参考手册》中,应查阅ARM公司的《Cortex-M3技术参考手册》 Cortex-M3的向量中断统一由NVIC管理 EXTI是ST公司在其STM32产品上扩展的外中断控制。它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断(PVD,RTC alarm,USB wakeup,ethernet wakeup),以及软件中断。其输出最终被映射到NVIC的相应通道。因此,配置EXTI中断的过程必然包含对NVIC的配置,例如下面配置EXTI0的过程,就要首先配置EXTI控制器(使能相应的中断线,选择中断/事件模式,触发边沿极性),然后再配置NVIC控制器(
[单片机]
如何设计基于stm32的数字示波器
随着集成电路的发展和数字信号处理技术的采用,数字示波器已成为集显示、测量、运算、分析、记录等各种功能于一体的智能化测量仪器。数字示波器在性能上也逐渐超越模拟示波器,并有取而代之的趋势。与模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。因此,数字示波器的使用越来越广泛。目前我国国内自主研发的高性能数字示波器还是比较少,广泛使用的仍是国外产品。因此,有必要对高性能数字示波器进行广泛和深入研究。 本文通过采用高速高性能器件,设计了一实时采样率为60 msa/s的宽带数字示波器。 1 数字示波器的性能参数设计 数字存储示波器的指标很多,包括采样率、带宽、灵敏度、通
[测试测量]
如何设计基于<font color='red'>stm32</font>的数字示波器
STM32学习笔记-RCC
调试芯片:STM32F103CBT6 外部晶振:4MHz 初次学习ST须知: STM芯片的所有片上外设都需要手动设置时钟 概念: 三种不同的时钟源可被用来驱动系统时钟(SYSCLK): HSI振荡器时钟:由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。(所以通常不用与提供SYSCLK) HSE振荡器时钟:高速外部时钟信号,由HSE外部晶体/陶瓷谐振器(较常用)或者HSE用户外部时钟两种方式产生 PLL时钟:时钟源输入,内部PLL可以用来倍频HSI RC的输出时
[单片机]
STM32 TIM8 PWM输出
STM32 TIM8初始化的配置与通用定时器的配置不同,我最开始时按照通用定时器配置,无论是配置一个通道,还是配置所有通道,死活不出来pwm 。接着查资料说要添加这一句代码:TIM_CtrlPWMOutputs(TIM8,ENABLE),添加后只有通道4有输出,其它三路没有输出,但是还是有点小激动啊 。后来看到一个网友说要添加下面几行代码:TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure
[单片机]
<font color='red'>STM32</font> TIM8 PWM输出
STM32库开发和流水灯
一、库开发 这里指的库开发使之调用库函数接口完成对相应寄存器的设置,相比较与51单片机编程中直接对寄存器操作而言,代码量跟查找手册看寄存器位再去配置,能节约很多时间。但是相对的对寄存器的位操作看得就没拿明白了,不知道库函数接口是如何配置各个寄存器位的了,这个时候可以将函数名复制下来去STM32固件库使用手册中查看相应了用法了。如下图所示复制了库函数之后,打开STM32固件库使用手册,复制到这里 然后回车,就会跳到相应的库函数说明那里,一下就清楚了它是如何配置寄存器位的,如下图 这个函数解释的很清楚了,使能和失能APB1的外设时钟,如果不理解参数是什么,可以复制参数能在末尾的表中找到相应的参数解释。 说一下我对库开
[单片机]
<font color='red'>STM32</font>库开发和流水灯
stm32+GPS定位
这周是个巨大任务,GPS模块调试。听着是挺高大上的样子,不过拿到模块的时候,还是什么都不懂,于是开始我的研究之旅。首先。直接用串口接GPS模块,连上电脑。打开串口调试助手,会看到模块给PC机发很多串口信息,如下: $GPRMC,055818.00,V,,,,,,,110515,,,N*7D $GPVTG,,,,,,,,,N*30 $GPGGA,055818.00,,,,,0,05,86.72,,,,,,0000*69 $GPGSA,A,1,27,42,31,26,50,,,,,,,,99.99,86.72,99.99*3B $GPGSV,3,1,12,08,24,044,35,09,31,315,,10,00,317,,16,67
[单片机]
STM32做SPI主机很常见,但是SPI从机玩过吗?
在平常的开发中,很多时候我们使用SPI都是使用主机模式去驱动一些传感器、存储器等等,很少会用到SPI从机。有时候,我们又需要STM32的SPI配置为从机去接收数据,本文就是介绍如何使用探索者开发版配置SPI从机。 这里我们以探索者开发版标准库实验25SPI实验为基础例程进行修改。这里我们把SPI从机只定义为一个接收,所以没有发送数据的操作。SPI的基础知识需要大家自己去学习,这里着重说明使用方法。 接下来,我们来看一下具体代码实现。 SPI初始化函数修改为如下代码: 这里特别需要几点: 以上代码跟原来程序不同点: ①SPI1的引脚使用的是PA4(SPI1_NSS),PA5(SPI1_CLK)和PA7(SPI1_MOSI)三
[单片机]
stm32串口加dma接收问题
设置:串口使能空闲中断;使用dma接收;dma中断屏蔽 现象:只要接收到的数据大于设置dma接收的长度,就会收不到数据,但是能进串口空闲中断 解决:把dma的中断打开,就会解决掉上述的溢出造成的结果。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved