STM8L 在USART中使用DMA来发送与接收数据

发布者:小牛队最新更新时间:2018-09-08 来源: eefocus关键字:STM8L  USART  DMA  接收数据 手机看文章 扫描二维码
随时随地手机看文章

以USART为例子来使用DMA

分两部分,第一为,DMA这个外设自身的配置;第二为,USART的DMA部分配置,

DMA与USART的DMA配置

void SYS_DMA_Init(void)

{

CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE); //打开时钟,很重要

/* Deinitialize DMA channels */

DMA_GlobalDeInit();

 

DMA_DeInit(DMA1_Channel1);

DMA_DeInit(DMA1_Channel2);

/* DMA channel Rx of USART Configuration */

    //该函数主要要配置好接受的数组,以及USART的数据寄存器地址,数组大小,以及DMA模式

DMA_Init(DMA1_Channel2, (uint16_t)RxBuffer, (uint16_t)0x5231, \

        10, DMA_DIR_PeripheralToMemory, DMA_Mode_Normal, \

        DMA_MemoryIncMode_Inc, DMA_Priority_Low, DMA_MemoryDataSize_Byte);

 

/* DMA channel Tx of USART Configuration */

    //该函数主要配置发送数组,以及USART的数据寄存器地址,数组大小,以及DMA模式

DMA_Init(DMA1_Channel1, (uint16_t)TxBuffer, (uint16_t)0x5231, \

60, DMA_DIR_MemoryToPeripheral, DMA_Mode_Normal, \

DMA_MemoryIncMode_Inc, DMA_Priority_High, DMA_MemoryDataSize_Byte);

/* Enable the USART Tx/Rx DMA requests */

USART_DMACmd(USART1, USART_DMAReq_TX, ENABLE);

USART_DMACmd(USART1, USART_DMAReq_RX, ENABLE);

 

/* Global DMA Enable */

DMA_GlobalCmd(ENABLE);

 

/* Enable the USART Tx DMA channel */

DMA_Cmd(DMA1_Channel1, ENABLE);

/* Enable the USART Rx DMA channel */

DMA_Cmd(DMA1_Channel2, ENABLE);         

}



下面主要对void DMA_Init(DMA_Channel_TypeDef* DMA_Channelx,

              uint32_t DMA_Memory0BaseAddr,

              uint16_t DMA_PeripheralMemory1BaseAddr,

              uint8_t DMA_BufferSize,

              DMA_DIR_TypeDef DMA_DIR,

              DMA_Mode_TypeDef DMA_Mode,

              DMA_MemoryIncMode_TypeDef DMA_MemoryIncMode,

              DMA_Priority_TypeDef DMA_Priority,

              DMA_MemoryDataSize_TypeDef DMA_MemoryDataSize )

函数的主要参数做一下说明,DMA_Channelx:针对不同的外设,这个有可能是通道0123,主要根据下表来进行选择:


本例子中,USART_TX 对应的是通道1,USART_RX对应的是通道2。

DMA_Memory0BaseAddr:该参数为存储器地址,在本例中为接收数组RXBuffer或发送数组TxBuffer的指针地址。

DMA_PeripheralMemory1BaseAddr:该参数为外设的数据地址,在本例中为USART的数据寄存器的地址

DMA_BufferSize:该参数为接收数组或发送数组的缓存区大小。

DMA_DIR_TypeDef DMA_DIR:该参数为DMA数据传输的方向,在USART_TX中为存储器到外设,在USART_RX 中就为外设到存储器。

DMA_Mode_TypeDef DMA_Mode:该参数为DMA的模式,分正常模式和循环模式两种。正常模式下响应了DMA请求后不再响应请求。

下面再讲讲如何在DMA正常模式下,响应了一次DMA请求后,再次启动DMA请求,分别以USART_TX、USART_RX为例子讲解

USART_TX:在上面例子中,TxBuffer[]存放着待发送的数组,当调用DMA_Cmd(DMA1_Channel1, ENABLE);

启动DMA通道后,DMA响应了该次请求,如需再次响应请求则需先关闭DMA通道DMA_Cmd(DMA1_Channel1, DISABLE); 并调用DMA_SetCurrDataCounter(DMA1_Channel1, 60)函数重新设置待发送的数据大小,之后再使能DMA通道DMA_Cmd(DMA1_Channel1, ENABLE); 即可重新发送数据。

USART_RX:USART DMA接收中,与上面USART_TX的流程相同,当调用了DMA_Cmd(DMA1_Channel1, ENABLE)之后,DMA可响应首次接收请求,如需再次响应请求则需要关闭DMA通道DMA_Cmd(DMA1_Channel1, DISABLE); 并调用DMA_SetCurrDataCounter(DMA1_Channel2, 10)函数重新设置待接收的数据大小,之后再使能DMA通道DMA_Cmd(DMA1_Channel1, ENABLE); 即可再次响应USART接收DMA请求。



关键字:STM8L  USART  DMA  接收数据 引用地址:STM8L 在USART中使用DMA来发送与接收数据

上一篇:STM8L151G6U6 之实现低功耗
下一篇:STM8L151 使用硬件SPI驱动VS1003B MP3解码芯片

推荐阅读最新更新时间:2024-03-16 16:13

串口使用DMA发送数据时的数据覆盖问题
在STM32等单片机中,为了提高程序的执行效率,在使用串口时,经常会使用DMA的方式来进行收发数据,这样,CPU只需要把数据放在发送缓存区即可离开。 但是,由于在串口发送中使用的是引用调用,即数据传递时是将要发送的指针进行传递,而非将数据复制了一份。这样的好处是方便快捷,但同时带来的一个后果时,当该数据还未发送完时,下一串数据就不能放入该发送缓冲区,否则,就会发生数据覆盖问题,即后一串数据覆盖前边还未发完的数据。 一般发生这种数据覆盖问题,都是在连续发送两串以上数据的时候,第一次的还没发完,后边的就会将前一次的数据覆盖。 若是在每次发送之前进行判断上次数据是否发完,如果没有发完就等待的话,就会降低CPU的效率;或者,如
[单片机]
s3c6410 s3c2440串口发送接收数据的实现(轮询)及相关寄存器
1 6410与串口相关寄存器 一 需要设置的寄存器(其实进入uboot后,串口已经设置好了,直接发送数据就行了,) 1)模式 UCON (轮询,中断,DMA等) 2)相关参数 ULCON0 定义了串口数据的帧格式,数据位长度,奇偶校验位,停止位(8-N-1) BRDIV 定义了波特率的计算公式所得结果的整数部分 UDIVSLOT0 定义了波特率的计算公式所得结果的小数部分 3)高级选项(串口的发送接收缓冲的大小(fifo)默认是1B,可改成64B 二 发送接收数据 相关的寄存器 UTXH0 UART channel 0 transmit buffer register URXH0 UART chan
[单片机]
Linux系统对ISA总线DMA的实现
  引言   Stratix II是ALTERA公司生产的一款高性能FPGA器件。它采用TSMC的90 nm低k绝缘工艺技术生产,等价逻辑单元(LE)高达180 k,嵌入式存储器容量达到9 MB。该器件不但具有极高的性能和密度,而且还针对器件总功率进行了优化,同时可以支持高达1 Gbps的高速差分I/O信号,因而是一款超快的FPGA。该芯片中所含的高性能嵌入式DSP块的运行频率高达370 MHz。另外Stratix II还有12个可编程PLL,并具有健全的时钟管理和频率合成能力。能实现最大的系统性能。   MAX1951是MAXIM公司的一款高效的DC-DC电源转换芯片,主要用于DSP、FPGA、ASIC的内核及I/O口供电。
[嵌入式]
STM32F0xx_USART收发配置详细过程
前言 串口对于处理器来说算是一种标配,也是在软件开发中必不可少的,那就是使用串口来调试信息(打印出相应的信息)。STM32F0系列的芯片,串口根据型号不同,数量也不同,从1个到8个不等。 今天主要总结串口简单且常用的功能,发送字符和中断接收字符。今天提供的串口发送功能将在后面的各个模块总结中都需要使用到,主要用于验证和测试各项功能的正确性。 下载 ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议参考该手册,以后如果你换用一种型号芯片也方便了解。
[单片机]
STM32F0xx_<font color='red'>USART</font>收发配置详细过程
STM32自学之SPI的DMA操作(寄存器级)
STM32自学之SPI的DMA操作(寄存器级) 一、实验目标 学会配置STM32的SPI寄存器和DMA寄存器,实现STM32的SPI1与SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。之后看可以利用DMA来实现什么功能~~~ 二、实验目的 加入DMA的SPI通信相对于普通SPI通信有什么好处?ST给SPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题,一直边学习边想。以下是我的看法: 减少CPU负荷?我想这应该是DMA最主要的功能,可是对于SPI通信来说,其实大部分时候我们需要根据发送的指令- 目标器件的应答来决定下一个指令,所以此时CPU还是需要一直等待每次通信的结束。而且
[单片机]
STM32自学之SPI的<font color='red'>DMA</font>操作(寄存器级)
STM32通过DMA采集多通道AD
环境: 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 通过脚PA1,PA2采集AD。每路AD采集10次。 #include ad_driver.h //全局变量 //AD采样存放空间 __IO uint16_t ADCConvertedValue ; //函数 //初始化AD void init_ad(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //----
[单片机]
ADC多通道+DMA采样求均值
一、硬件配置 本实验采用STM32F103RB nao开发板 使用PA0/1/2 引脚,即ADC1的IN0/1/2三个通道,分别测量GND/VCC/VR三处电压。 接线为: PA0 → GND PA1 → VCC PA2 → VR 二、CubeMX配置 1.配置时钟 打开HSE、LSE,配置为内外部时钟,主频配置为72MHz,ADC时钟默认为12MHz。 2.配置串口 这里使用USART1,等会重定向Printf用于打印测量信息。 选择USART1,配置为异步模式,参数无需调整。 3. 配置ADC 在模拟器件中选择ADC1 使能ADC1的三路通道 IN0/1/2 ,右侧可见 PA0/1/2 引脚被配
[单片机]
ADC多通道+<font color='red'>DMA</font>采样求均值
ADSP-21535 Blackfin的Mem DMA高速通信
  ADSP-21535 Blackfin 是美国AD公司和Intel 公司于2001年底联合推出的一款定点DSP, RISC指令结构,运作高效,具有十分优异的性能。该DSP具有300MHz的主频,2个40bit的MAC(乘加器)和2个32bit的ALU(算术逻辑单元),4个8bit的视频处理单元,16个地址寻址单元。该DSP内部集成了308KB的RAM,并具有丰富的外部接口,如PCI、USB、SPI、同步和异步串口等。同时,芯片内部设计了看门狗和多种定时器,充分满足软件工程稳定性的设计要求。值得一提的是,21535可以动态地控制电压输入,调整运行频率,减少芯片功耗,十分适用于移动产品的设计。   2002年底,AD公司在中国
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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