历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2020年10月09日 | STM32的串口采用DMA方式发送数据测试

发布者:GoldenEclipse 来源: eefocus关键字:STM32  串口  DMA方式  发送数据 手机看文章 扫描二维码
随时随地手机看文章

环境:


主机:WIN7


开发环境:MDK4.23


MCU:STM32F103CBT6



源代码:


配置:



//---------------------串口功能配置---------------------

//打开串口对应的外设时钟  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);   

//启动DMA时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

//DMA发送中断设置

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//DMA1通道4配置

DMA_DeInit(DMA1_Channel4);

//外设地址

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);

//内存地址

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Send_Buffer;

//dma传输方向单向

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

//设置DMA在传输时缓冲区的长度

DMA_InitStructure.DMA_BufferSize = 100;

//设置DMA的外设递增模式,一个外设

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

//设置DMA的内存递增模式

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

//外设数据字长

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

//内存数据字长

DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;

//设置DMA的传输模式

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

//设置DMA的优先级别

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

//设置DMA的2个memory中的变量互相访问

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

DMA_Init(DMA1_Channel4,&DMA_InitStructure);

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);

 

//使能通道4

//DMA_Cmd(DMA1_Channel4, ENABLE);

 

  

//初始化参数  

//USART_InitStructure.USART_BaudRate = DEFAULT_BAUD;  

USART_InitStructure.USART_WordLength = USART_WordLength_8b;  

USART_InitStructure.USART_StopBits = USART_StopBits_1;  

USART_InitStructure.USART_Parity = USART_Parity_No;  

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    

USART_InitStructure.USART_BaudRate = DEFAULT_BAUD; 

//初始化串口 

USART_Init(USART1,&USART_InitStructure);  

//TXE发送中断,TC传输完成中断,RXNE接收中断,PE奇偶错误中断,可以是多个   

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  

 

//配置UART1中断  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;               //通道设置为串口1中断  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;       //中断占先等级0  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;              //中断响应优先级0  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //打开中断  

NVIC_Init(&NVIC_InitStructure);                                 //初始化  

 

//采用DMA方式发送

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);

//启动串口  

USART_Cmd(USART1, ENABLE);   

 

//设置IO口时钟      

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);    

//串口1的管脚初始化    

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                       //管脚9  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 //复用推挽输出  

GPIO_Init(GPIOA, &GPIO_InitStructure);                          //TX初始化  

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                      //管脚10  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //浮空输入  

GPIO_Init(GPIOA, &GPIO_InitStructure);                          //RX初始化                                                      

 

//设置IO口时钟      

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);   

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                       //管脚9  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                //选择GPIO响应速度  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 //复用推挽输出  


中断函数:


//串口1DMA方式发送中断

void DMA1_Channel4_IRQHandler(void)

{

//清除标志位

  DMA_ClearFlag(DMA1_FLAG_TC4);

//DMA_ClearITPendingBit(DMA1_FLAG_TC4);

  //DMA1->IFCR |= DMA1_FLAG_TC4;

//关闭DMA

DMA_Cmd(DMA1_Channel4,DISABLE);

  //DMA1_Channel4->CCR &= ~(1<<0);

 

//允许再次发送

Flag_Uart_Send = 0;

}


发送测试:


//串口DMA发送测试

Uart_Send_Buffer[0] = 1;

Uart_Send_Buffer[1] = 2;

Uart_Send_Buffer[2] = 3;

Uart_Send_Buffer[3] = 4;

Uart_Send_Buffer[4] = 5;

i = 1;

while (1)

{

//检查串口是否可以发送

while (Flag_Uart_Send);

Flag_Uart_Send = 1;

//设置传输数据长度

DMA_SetCurrDataCounter(DMA1_Channel4,i);

//打开DMA

DMA_Cmd(DMA1_Channel4,ENABLE);

i++;

if (i > 5)

{

i = 1;

}

}


关键字:STM32  串口  DMA方式  发送数据 引用地址:STM32的串口采用DMA方式发送数据测试

上一篇:STM32的串口采用DMA方式接收数据测试
下一篇:STM32通过DMA采集多通道AD

推荐阅读

如今,我们生活在一个高速发展的全球信息化时代,整个经济就像地球一样紧密地融合在一起,任何一项新技术的进步都将带来整个产业的全方位变革,5G技术将是未来几年引领时代变革和进步的核心驱动力之一。 大家之所以如此看好5G技术的前景,一方面由于它是未来信息基础设施的核心,高速率、高带宽满足人们对通讯日益增长的新要求;另一方面是因为5G技术为实...
相关研究显示,目前我国新能源汽车产业总体上对安全性认识不足,全链条中安全交互机制没有形成,导致了电动汽车安全事故频发,对消费者感观和产业发展都造成了负面影响。对此,汽车传感器供应商森萨塔科技日前推出了高可靠、长寿命的动力电池热失控智能监测方案,可对电池实现7×24小时监测并进行异常诊断。2019年1月10日,工信部正式将《电动汽车用动力蓄...
微软 Surface Duo 和 Surface Neo 最初定于 2020 年 12 月上市,之后,微软方面从 Surface Neo 宣传页面中删除了 “2020 年假期即将到来”文本信息,今年 9 月份微软已悄悄从 YouTube 上删除了该设备的宣传视频。  现在,微软官网也下线了 Surface Neo 相关信息,虽然搜索还可以看到 Surface Neo“了解详情”的标签...
据台湾《经济日报》报道,半导体分析实验室大厂闳康科技第三代半导体告捷,主要是来自大陆相关需求不断成长,包括材料分析穿透式电子显微镜(TEM)、二次离子质谱仪(SIMS)等方面。据悉,其第三代半导体的总客户数量已超过上千家。闳康表示,目前在二次离子质谱仪检测分析规模产能是东亚最大,需求快速成长。不过,由于当前产能严重不足,相关分析结果往...

史海拾趣

问答坊 | AI 解惑

PIC16C712功能、特点、应用领域

与替代16C711方法、注意事项PIC16C712为Microchip公司推出的基于711芯片功能基础上的增强型产品,它与16C711是Pin对Pin兼容。其功能与价格均优于16C711…

查看全部问答∨

如何降低测试系统开关噪声

为测试电子和机电器件设计开关系统所遇到的问题和设计产品本身一样多。随着器件中高速逻辑的出现以及与更灵敏模拟电路的连接,使得降低测试开关系统中的噪声比以前任何时候更加重要。   本文所述的噪声降低技术准则是针对信号频率低于300MHz、电 ...…

查看全部问答∨

评单片机选型的讨论

很久以来总是能看到关于单片机的各种讨论,又是这个不好啦,那个不好了,那个过时啦,这个先进啊,学什么什么没用啦! 我吧我看到的告诉大家 西门子S7-200 PLC   8051 单片机做的 西门子S7-300PLC    模拟量采集模板(正在大量使用 ...…

查看全部问答∨

求助PSD813和TSC80251破解

有PSD813和TSC80251需要破解,能一起做下来的请联系我sensorsun@163.com,谢谢!…

查看全部问答∨

USB驱动学习

我很想学习一下USB的驱动,在PowerPC基础上的vxworks下USB驱动。但是现在手头上没有带USB的板子。vmware也没有基于powerPC的版本。有什么办法可以学习一下么?virtruePC貌似也不行! 怎么办了?有什么基于powerPc和vxworks的虚拟环境么?? 谢谢 ...…

查看全部问答∨

为何wince数据库在单个记录中无法对单个属性进行连续存储呢?

像这样先存一个数再存一个字符串,完全可以存储 ////////////////////////////////////////////////////////////////////         CEPROPVAL *pRorps;         pRorps = new CEPROPVAL[10000];   ...…

查看全部问答∨

哪为牛人知道计算机系统结构下的智能网络系统具体是研究什么的?或者要学习什么知识?网上都找不到,望高手解答.

哪为牛人知道计算机系统结构下的智能网络系统具体是研究什么的?或者要学习什么知识?网上都找不到,望高手解答.谢谢!!…

查看全部问答∨

关于在QT里面写一个Hello,出错,请教。。。。。。。。。高手请进

各位我使用了最原始的Hello world 开始学习,可是qmake [project] ;qmak; make; 出错,信息和代码如下: -------------------------------------- #include <qapplication.h> int main( int argc, char **argv ) {     QAppl ...…

查看全部问答∨

Wince驱动程序

找人做PXA270上的SPI驱动程序, Wince的,在北京, 有意给我站内联系…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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