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

发布者:数字舞者最新更新时间:2020-06-17 来源: 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来发送与接收数据

上一篇:MPC5744P-SPI模块(串行外设接口模块)
下一篇:STM8L 串口通信波特率异常

推荐阅读最新更新时间:2024-11-11 03:59

基于VxWorks实现自动发送彩信嵌入式设计
随着嵌入式应用的发展和16/32位RISC处理器技术的成熟,以及支持各种高端处理器的嵌入式操作系统的涌现和完善,嵌入式无线设备可以利用CDMA网络实现许多新的应用。自动发送彩信的嵌入式系统就是这种新应用之一,在特定的条件下,系统自动发送彩信到指定的移动通信终端;该应用系统是由用户根据要求设定触发条件的自动发送彩信系统,当满足触发条件时,设备会自动控制捕获、压缩图像部件拍摄外部图像,经过模数转换、数字压缩等处理后,经处理器做MMS(Multimedia Message Service,多媒体短信服务)协议封装,封装后的数据经由手机模块发送到移动交换网络,最终转发到移动通信终端用户。 系统整体设计● 系统主处理器 系统选用Sa
[单片机]
基于VxWorks实现自动<font color='red'>发送</font>彩信嵌入式设计
[nrf51822][SDK12.3] BLE分层设计 NUS 透传数据队列发送,提升带宽利用率
四、 透传服务,加入队列机制 /******************************************************************************** * @file biz_ble_nus.c * @author jianqiang.xue * @Version V1.0.0 * @Date 2022-03-16 * @brief ble数据透传服务(从机) https://blog.csdn.net/weixin_41572450/article/details/84036968 *****************************************
[单片机]
STM32之ADC_2(DMA实例)
实例分析:(采用DMA模式) mian函数: extern __IO u16 ADC_ConvertedValue;//ADC转换的电压值,是在ADC1_Init()所属的文本中定义的 float ADC_ConvertedValueLocal;//用来保存转换计算后的电压值 int main(void) { USART1_Config(); //串口配置 ADC1_Init(); //使能ADC1以及配置ADC1为DMA模式 while (1) { ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的 AD 值
[单片机]
s3c6410 DMA 实现(入门级)
char src = abcdefghigklmn123456\n ; char dest = kkkk\n ; void dma_init(void) { DMACConfiguration = 1; //开总的DMA 使能 DMACC7SrcAddr = (int)src; //给源地址寄存器赋源地址 DMACC7DestAddr = (int)dest;//给目标地址寄存器赋目的地址 DMACC7Control0 = 0x0c000000; //【26】【27】位置1,使源地址和目标地址在发送后递增 DMACC7Control1 = 0x64; //写入拷贝的size; DMACC7Configurati
[单片机]
51单片机实现通过串口用delay延时方式发送一串数据
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: USART ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200713 ---- @ModifiedTime: 20200713 ----
[单片机]
51单片机实现通过串口用delay延时方式<font color='red'>发送</font>一串<font color='red'>数据</font>
STM32微控制器中采用DMA实现方波的产生和捕获
   1 STM32微控制器介绍   STM32系列微控制器是ST公司基于Cortex-M3内核的高集成度的微控制器。它在性能、价格、功耗和实时性方面树立了一个新的标杆,集成了Cortex-M3内核,以及双ADC、多用途的通用时钟TIMx、RTC、I2C、SPI、UART、CAN、DMA、USB等丰富的外设。其功耗在全速72MHz所有模块都打开时也仅仅为36 mA,在低功耗模式下其功耗仅为2 A。   2 DMA和TIMx简介   STM32系列微控制器均含有DMA和通用时钟TIMx模块。其低端型号中仅包含DMA1,支持7个通道;高端型号还包括DMA2,支持5个通道。它的每个通道可任意指定工作模式,如内存到内存、内存到外设或外
[单片机]
STM32微控制器中采用<font color='red'>DMA</font>实现方波的产生和捕获
按键控制串口发送数据的STM32实例
按下按键,串口调试助手接收区显示接收到的字符“1”,同时LED2亮一下表示发送成功。 开发板用的是STM32F03ZET6芯片。 主函数main.c代码如下: #include SysTick.h #include led.h #include key.h #include uart.h /************************************************* *函数名:主函数 *函数功能:按下按键KEY_UP,向串口发送字符1 *输入:无 *输出:无 **************************************************/ int main()
[单片机]
按键控制串口<font color='red'>发送</font><font color='red'>数据</font>的STM32实例
AVR串口发送程序
ATMega32 频率: 8.0MHz 编译器:CodeVisionAVR 1.24.8c 串口发送程序 */ #i nclude mega32.h #i nclude delay.h #i nclude stdio.h #define uchar unsigned char // 0~255 #define uint unsigned int // 0~65535 #define _SPK PORTB.2 #define _LED PORTB.3 #define CLI() #asm( cli ) #define SEI() #asm( sei ) /**//*
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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