讨论三个问题:1、什么叫串口DMA 请求;2、串口简要复习;3、串口DMA发送流程。
1、什么叫串口DMA 请求(战舰STM32开发板)
说这个问题之前先简单回顾DMA的基本特性。先导出原子哥的PPT内容:
DMA全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。
STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个通道,每个通道专门用来管理来自于一个或者多个外设对存储器的访问请求。还有一个仲裁器来协调各个DMA请求的优先权。
作用:为CPU减负!
下面上图
DMA各通道
从外设(TIMx、ADCx、SPIx、I2Cx、和USARTx)产生的DMA请求,通过逻辑或输入到DMA控制器,这就意味着同时只能有一个请求有效(在同一时间,就只能使用其中的一个,其他通道也类似)。外设的DMA请求,可以通过设置相应的外设寄存器中的控制位,被独立的开启或关闭。
看到这里串口DMA请求的定义就出来了:先举个例子:譬如我想用串口发送数据到PC机,一般做法是CPU通过APB1/APB2总线往串口写数据,然后串口发送;或者是CPU通过总线从串口取(读)数据;如果此时CPU处理的任务非常多,这就会耗费CPU的处理时间。
而我们如果用DMA来传送数据那就很快了,DMA会通过自己的特定通道将数据从一个地址空间复制到另一个地址空间,而且不需要CPU的干预。所以串口DMA请求的定义是:串口要发送/接收数据会请求DMA来完成数据的写和读。(注意这句话只针对本文!)
2、串口简要复习(库函数)
这里简要复习一下战舰STM32串口的知识点。举个例子:我想用PC机往STM32串口发送个数据,然后STM32接收到后将数据原样返回给PC机(显示在串口调试助手中)。思路:
首先我们会在串口初始化函数中配置串口接收中断,当你PC机往串口发送数据时,串口会产生接收中断;并在中断服务函数中,判断接没接收完,如果接收完毕就会把接收状态寄存器的接收完成标志位置1。到这儿是接收中断的作用。。
然后在主函数中,我们不断检测接收状态寄存器的接收完成标志,看接没接收完。如果接收完了,就通过for循环将接收到的数据,全部发给串口的USART_DR寄存器(当向该寄存器写数据时,串口就会自动发送)。于是我们通过PC机发给串口的数据就会被STM32通过串口发回来了,显示在串口调试助手中。
3、串口DMA发送流程(库函数)
战舰实验:通过按键KEY0来控制DMA发送,每按一次KEY0,DMA就传送一次数据到USART1,然后在TFTLCD模块上显示进度信息。这个现在理解就不难了吧。
从主函数入手,首先我们在STM32的SRAM中开辟一段5200(这个数字越大DMA传输越慢,反之越快)字节的空间SendBuff[],作为我们的存储器(内存),存储要往外设(USART1)发送的数据。
然后我们在SendBuff[]中写满TEXT_TO_SEND[]里的内容。这里战舰往SendBuff[]里写的算法非常巧妙,应该学习;
现在SendBuff[]中已经存满了要发送给串口的数据。这时我们还要检测KEY0有没有按下,如果按下了,就通过两个函数:1、使能串口发送(在STM32库函数stm32f10x_usart.c中,配置USART_CR3中的DMA使能位DMAT);2、使能DMA1通道4,启动传输(在dam.c中,最后也是调用了stm32f10x_dma.c中的DMA_Cmd();函数来使能通道)。加上之前(本文没有)对DMA参数的初始化(初始化存储器和外设基地址等),就可以启动一次传输了。
传输时间问题:传输时间跟波特率密切相关。比如波特率是9600,意思就是每秒钟发送或接受的速率为9600bit/s,8bit=1Byte(字节),故当波特率为9600时,串口的传输速率为1200字节每秒。上文我们申请的存储器(内存)空间是5200字节,故串口要传输完这个大小的空间内容内容,预计需要5200/1200约4秒多。
关键字:STM32 单片机 串口DMA
引用地址:
STM32单片机串口DMA解析
推荐阅读最新更新时间:2024-11-11 08:12
51单片机产生PWM软件延时和定时器产生两种方法
89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。 1 软件延时法 利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。 程序如下: #include sbit pwm=P1^0; main() { while(1) { pwm=1; delayus(60);//置高电平后延时60us,占空比60% pwm=0; delayus(40); } } void delayus(uint x) { while(x--); } proteus软件仿真结果如下: 可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是
[单片机]
PIC单片机软件模拟器PICSIM及其使用
简介:本文主要介绍 PIC单片机软件模拟器PICSIM及其使用,帮你更多的认识PIC单片机。 我们知道单片机开发工具,一般都包括实时在线仿真器(Emulator)和烧写器(Programmer),其中在线仿真器是很好的工具,价格也较高。对于一些想节省开发成本的用户,也可以用软件模拟器(Simulator)来替代实时仿真器,因为其成本一般都很低。用软件模拟器和烧写器可组成一套低成本的开发系统,如针对Microchip著名的PIC单片机系列有PICKIT,即由软件模拟器PICSIM和烧写器PICPROG构。 (一)功能特点 PICSIM即然称为软件模拟器,顾名思义即知它是一个纯软件,不需专门的仿真板,专门用于模拟调试PIC
[单片机]
赛普拉斯 Traveo™ 汽车用 MCU 系列集成 Altia 人机交互代码生成器
赛普拉斯半导体公司 和 Altia 今日共同宣布为赛普拉斯 Traveo™ 汽车用微控制器 (MCU) 系列集成 Altia 人机交互代码生成器。本次合作为汽车制造商能够在仪表盘、平视显示器和 HVAC 显示器中实现丰富图形和先进功能相结合提供了低成本高效益的平台。Traveo 系列的 Altia 代码生成解决方案已被多家国际汽车制造商和顶级供应商采纳应用。 赛普拉斯 Traveo MCU 系列产品搭载具有Arm® Cortex®-R5 240-Mhz 内核的32-位 RISC 微控制器,以单芯片 MCU 解决方案实现高端图形功能。该系列微控制器配备高效的 2D/3D 图像引擎,集速度、防护安全、功能安全性能和高质量图像于一身,
[汽车电子]
STM32将12M晶振换8M晶振后Keil及程序的相关设置
外部从12M晶振换8M晶振,如果还想是72MHZ时钟,只需要改三个地方: 首先:stm32f10x.h和system_gd32f10x.c文件可以通过下图找到 1、stm32f10x.h中,将#define HSE_VALUE ((uint32_t)12000000)改为#define HSE_VALUE ((uint32_t)8000000) 在stm32f10x.h中,改后如下图 2、system_gd32f1x0.c中,使用72M的那个宏,即改为如下: //#define SYSCLK_FREQ_HSE HSE_VALUE //#define SYSCLK_FREQ_24MHz 24000000
[单片机]
STM32 USB设计原理
首先,我们来看看usb的工作过程。 当usb设备接入到主机时,主机开始枚举usb设备,并向usb设备发出指令要求获取usb设备的相关描述信息,其中包括设备描述(device descriptor)、配置描述(configuration descriptor)、接口描述(interface descriptor)、端点描述(endpoint descriptor)等。这些信息是通过端点0(endpoint 0)传送到主机的。获取各种描述信息后,操作系统会为其配置相应的资源。这样主机就可以与设备之间进行通信了。 usb通讯有四种通讯方式控制(control)、中断(interrupt)、批量(
[单片机]
51单片机,汇编语言,定时与计数
要求:将定时器 T1 设置为外部事件计数器,要求每计 500 个脉冲,再将 T1 转为定时方式,在 P1.2 输出一个脉宽 10ms 的正脉冲。 周而复始。 设系统时钟频率为 12MHz。 程序如下: ORG 0000H ;----------------------------------- START: CLR P1.2 CLR TR1 MOV TMOD, #50H ;T1计数方式1 MOV TH1, #(65536 - 500) / 256 ;计数值为500 MOV TL1, #(65536 - 500) MOD 256 SETB TR1 JNB TF1,
[单片机]
stm32 adc dma多通道采样 数据错位 的解决方法
解决方法:不要采用连续转换模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 需要时才实施转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 转换后取消转换 ADC_SoftwareStartConvCmd(ADC1, DISABLE); 经过测试能够解决stm32 adc dma多通道采样 数据错位
[单片机]
利用单片机串口实现多个LED的显示
在单片机系统中,数码管 (LED) 是一种常用的显示器。一般的显示器为 4 位或 8 位,实现这种显示的方法比较多,也比较简单。但是,对于多个 LED 显示,由于单片机本身提供的 1/O 口有限,就必须采取必要的措施才能实现。本文介绍一种设计方法,利用该方法设计的多路 LED 显示系统具有硬件结构简单,软件编程方便,价格低廉等特点,经常应用在车站、银行的显示屏中,效果很好。 1 硬件电路的设计 AT 89C 51 单片机是美国 ATMEL 公司生产的 51 系列单片机,应用广泛。 89051 单片机串行口除了可用于串行通讯,它在方式 0 状态下,还可以扩展并行 I/O
[单片机]