STM32 串口采用DMA方式接收数据

2018-06-08 19:48:03来源: eefocus 关键字:STM32   串口  DMA方式  接收数据

环境:

主机:WINXP

开发环境:MDK4.23

MCU:STM32F103CBT6


说明:

串口可以配置成用DMA的方式接收数据,不过DMA需要定长才能产生接收中断,如何接收可变长度的数据呢?

方法有以下3种:

1.将RX脚与一路时钟外部引脚相连,当串口一帧发完,即可利用此定时器产生超时中断.这个实时性较高,可以做到1个字节实时监测.

2.不改变硬件,开启一个定时器监控DMA接收,如果超时则产生中断.这个实时性不高,因为超时时间必须要大于需要接收帧的时间,精度不好控制.

3.STM32单片机有的串口可以监测总线是否处于空闲,如果空闲则产生中断.可以用它来监测DMA接收是否完毕.这种方式实时性很高.

本文采用第3种方式.在波特率576000下大数据包冲击证明可行.


源代码:


  1. //串口接收DMA缓存  

  2. #define UART_RX_LEN     128  

  3. extern uint8_t Uart_Rx[UART_RX_LEN];  



  1. //串口接收DMA缓存  

  2. uint8_t Uart_Rx[UART_RX_LEN] = {0};  



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

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

  3.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);   

  4.     //串口发DMA配置    

  5.     //启动DMA时钟  

  6.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  

  7.     //DMA发送中断设置  

  8.     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;  

  9.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  

  10.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  

  11.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

  12.     NVIC_Init(&NVIC_InitStructure);  

  13.     //DMA1通道4配置  

  14.     DMA_DeInit(DMA1_Channel4);  

  15.     //外设地址  

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

  17.     //内存地址  

  18.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Send_Buffer;  

  19.     //dma传输方向单向  

  20.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  

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

  22.     DMA_InitStructure.DMA_BufferSize = 100;  

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

  24.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  

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

  26.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

  27.     //外设数据字长  

  28.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  

  29.     //内存数据字长  

  30.     DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;  

  31.     //设置DMA的传输模式  

  32.     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  

  33.     //设置DMA的优先级别  

  34.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;  

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

  36.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

  37.     DMA_Init(DMA1_Channel4,&DMA_InitStructure);  

  38.     DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);  

  39.       

  40.     //使能通道4  

  41.     //DMA_Cmd(DMA1_Channel4, ENABLE);  

  42.   

  43.     //串口收DMA配置    

  44.     //启动DMA时钟  

  45.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  

  46.     //DMA1通道5配置  

  47.     DMA_DeInit(DMA1_Channel5);  

  48.     //外设地址  

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

  50.     //内存地址  

  51.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Rx;  

  52.     //dma传输方向单向  

  53.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  

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

  55.     DMA_InitStructure.DMA_BufferSize = UART_RX_LEN;  

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

  57.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  

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

  59.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

  60.     //外设数据字长  

  61.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  

  62.     //内存数据字长  

  63.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  

  64.     //设置DMA的传输模式  

  65.     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  

  66.     //设置DMA的优先级别  

  67.     DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;  

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

  69.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

  70.     DMA_Init(DMA1_Channel5,&DMA_InitStructure);  

  71.   

  72.     //使能通道5  

  73.     DMA_Cmd(DMA1_Channel5,ENABLE);  

  74.       

  75.         

  76.     //初始化参数    

  77.     //USART_InitStructure.USART_BaudRate = DEFAULT_BAUD;    

  78.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;    

  79.     USART_InitStructure.USART_StopBits = USART_StopBits_1;    

  80.     USART_InitStructure.USART_Parity = USART_Parity_No;    

  81.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    

  82.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      

  83.     USART_InitStructure.USART_BaudRate = DEFAULT_BAUD;   

  84.     //初始化串口   

  85.     USART_Init(USART1,&USART_InitStructure);    

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

  87.     //USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  

  88.       

  89.     //中断配置  

  90.     USART_ITConfig(USART1,USART_IT_TC,DISABLE);  

  91.     USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);  

  92.     USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);    

  93.   

  94.     //配置UART1中断    

  95.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);  

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

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

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

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

  100.     NVIC_Init(&NVIC_InitStructure);     

  101.           

  102.     //采用DMA方式发送  

  103.     USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  

  104.     //采用DMA方式接收  

  105.     USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);  

  106.     //启动串口    

  107.     USART_Cmd(USART1, ENABLE);   

[1] [2]

关键字:STM32   串口  DMA方式  接收数据

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2018060839668.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32的串口1发送、接收DMA模式函数配置
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

网友正在学习IC视频

推荐阅读
全部
STM32
串口
DMA方式
接收数据

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

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

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