STM32实现USARTDMA接收未知长度的数据和发送[整理]

上传人:x****育 文档编号:143411651 上传时间:2020-08-29 格式:PDF 页数:9 大小:14.78KB
返回 下载 相关 举报
STM32实现USARTDMA接收未知长度的数据和发送[整理]_第1页
第1页 / 共9页
STM32实现USARTDMA接收未知长度的数据和发送[整理]_第2页
第2页 / 共9页
STM32实现USARTDMA接收未知长度的数据和发送[整理]_第3页
第3页 / 共9页
STM32实现USARTDMA接收未知长度的数据和发送[整理]_第4页
第4页 / 共9页
STM32实现USARTDMA接收未知长度的数据和发送[整理]_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《STM32实现USARTDMA接收未知长度的数据和发送[整理]》由会员分享,可在线阅读,更多相关《STM32实现USARTDMA接收未知长度的数据和发送[整理](9页珍藏版)》请在金锄头文库上搜索。

1、1 前言:开始学USART DMA 的时候看到帖子STM32 UART DMA 实现未知数据长度接收, 觉得方法妙极了。此下出自此帖子(整体的思路是这样的,一开始设置好DMA 接收,可 以把缓冲区长度设置为帧最大长度,我们可以把RX连接到定时器的管脚输入端,并且一开 始设置输入并且使能引脚下降沿中断,当帧的第一个字节发送时,因为起始位为低电平,空 闲时 UART 为高电平,满足条件,进入中断,禁止中断,并且在中断中开启定时器,该定时 器工作在复位模式,上升沿复位,并且设置好定时器输出比较值为超时时间,比如20ms, 这样, 在传输后面字节时,肯定会有高低电平出现,即便是传输的是0 x00,0

2、xFF,虽然 UART 数据区不变,但是都为1,或都为0,但是因为起始位为低电平,停止位是高电平,所以肯 定会有上升沿, 定时器会一直复位,输出定时器的计数器一直到达不了输出比较值,当一帧 传输结束后,定时在最后一个字节复位后,由于没有数据继续到达,无法复位,则计数器就 能计到输出比较值,这时发出中断, 在定时器中断中可以计算出接收数据的长度,并且通知 外部数据已经接收完毕。) 今天我在工作中调通了另一种USART DMA 接收未知数据长度的接收,使用的是USRAT 空 闲总线中断接收,这种方法也在网站上比较多见,以前没试过,今天才知道如此的爽,另外 我使用 DMA 发送 USART 数据替代

3、了以前的查询法发送,发现更加爽了。 其速度快了很多,尤 其是在大量数据传输与发送的时候其优势更加明显。 我举个例子:1、后台数据-USART1- USART2-其它设备,其它设备数据-USART2- USART1- 后台,这两个数据过程也可能同时进行。 2、由于硬件的限制,USART1和 USART2 的传输波特率不一样,比如USART1使用 GPRS 通信, USART2 使用短距离无线通信;或者 USART1 使用以太网通信,USART2 使用 485 总线通 信。 由于在寝室只有笔记本电脑,只有一个串口转USB ,没办法实现两个串口之间的数据转 发了,只好实现串口各自的数据转发。 现在我

4、把我实现的过程简单描述一下: 1、 初始化设置:USART1_RX DMA1_ Channel5 ,USART2_RX DMA1_ Channel6, USART1_TX DMA1_ Channel4, USART2_TX DMA1_ Channel7 (具体设置请看程序包)。 2、 当数据发送给USART1接收完毕时候会引起USART1的串口总线中断,计算DMA1_ Channel5 内存数组剩余容量,得到接收的字符长度。将接收的字符复制给DMA1_ Channel4 内存数组,启动DMA1_ Channel4 通道传输数据, (传输完成需要关闭。 )下一次数据接收可 以在启动DMA1_ C

5、hannel4 时候就开始,不需要等待DMA1_ Channel4 数据传输完成。但是上 一次 DMA1_ Channel4 完成之前,不可以将数据复制给DMA1_ Channel4 内存数组,会冲掉以 前数据。 3、 USART2类同 USART1 。 呵呵,下面贴程序: IO 口定义: void GPIO_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; /* 第 1 步:打开GPIO和 USART 部件的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2P

6、eriph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* 第 2 步:将 USART Tx的 GPIO配置为推挽复用模式 */ 2 = GPIO_Pin_9; = GPIO_Mode_AF_PP; = GPIO_Speed_50MHz; GPIO_Init(GPIOA, /* 第 3 步:将 USART Rx的 GPIO配置为浮空输入模式 由于 CPU复位后, GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的 但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数 */

7、= GPIO_Pin_10; = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, /* 第 1 步:打开 GPIO和 USART2 部件的时钟 */ /RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* 第 2 步:将 USART2 Tx的 GPIO配置为推挽复用模式 */ = GPIO_Pin_2; = GPIO_Mode_AF_PP; = GPI

8、O_Speed_50MHz; GPIO_Init(GPIOA, /* 第 3 步:将 USART2 Rx的 GPIO配置为浮空输入模式 由于 CPU复位后, GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的 但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数 */ = GPIO_Pin_3; = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, /* 第 3 步已经做了,因此这步可以不做 = GPIO_Speed_50MHz; */ GPIO_Init(GPIOA, 串口初始化: void USART_Configuration(voi

9、d) USART_InitTypeDef USART_InitStructure; /* 第 4 步:配置 USART 参数 - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ 3 = 19200; = USART_WordLength_8b; = USART_StopBits_1; = USART_Parity_No;

10、= USART_HardwareFlowControl_None; = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, / 空闲中断 USART_ITConfig(USART1, USART_IT_IDLE , ENABLE); /* 第 5 步:使能 USART , 配置完毕 */ USART_Cmd(USART1, ENABLE); /* CPU 的小缺陷:串口配置好,如果直接Send,则第 1 个字节发送不出去 如下语句解决第1 个字节无法正确发送出去的问题 */ USART_ClearFlag(USART1, USART_FLAG_T

11、C); /* 清 发 送 外 城 标 志 , Transmission Complete flag */ = 9600; = USART_WordLength_8b; = USART_StopBits_1; = USART_Parity_No; = USART_HardwareFlowControl_None; = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, USART_ITConfig(USART2, USART_IT_IDLE , ENABLE);/ 开启空闲 , 帧错 ,噪声 , 校验错中 断 USART_Cmd(USART2, E

12、NABLE); /* CPU 的小缺陷:串口配置好,如果直接Send,则第 1 个字节发送不出去 如下语句解决第1 个字节无法正确发送出去的问题 */ USART_ClearFlag(USART2, USART_FLAG_TC); /* 清 发 送 外 城 标 志 , Transmission Complete flag */ DMA 配置: void DMA_Configuration(void) DMA_InitTypeDef DMA_InitStructure; /* DMA clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1

13、, ENABLE);/DMA1 /* DMA1 Channel4 (triggered by USART1 Tx event) Config */ DMA_DeInit(DMA1_Channel4); = 0 x; = (uint32_t)USART1_SEND_DATA; = DMA_DIR_PeripheralDST; = 512; = DMA_PeripheralInc_Disable; = DMA_MemoryInc_Enable; 4 = DMA_PeripheralDataSize_Byte; = DMA_MemoryDataSize_Byte; = DMA_Mode_Circul

14、ar; = DMA_Priority_High; 2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE); /* Enable USART1 DMA TX request */ USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); DMA_Cmd(DMA1_Channel4, DISABLE); /* DMA1 Channel5 (

15、triggered by USART2 Tx event) Config */ DMA_DeInit(DMA1_Channel7); = 0 x; = (uint32_t)USART2_SEND_DATA; = DMA_DIR_PeripheralDST; = 512; = DMA_PeripheralInc_Disable; = DMA_MemoryInc_Enable; = DMA_PeripheralDataSize_Byte; = DMA_MemoryDataSize_Byte; = DMA_Mode_Circular; = DMA_Priority_High; 2M = DMA_M2

16、M_Disable; DMA_Init(DMA1_Channel7, DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, ENABLE); /* Enable USART1 DMA TX request */ USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); DMA_Cmd(DMA1_Channel7, DISABLE); /* DMA1 Channel5 (triggered by USART1 Rx event) Config */ DMA_DeInit(DMA1_Channel5); = 0 x; = (uint32_t)USART1_RECEIVE_DATA; = DMA_DIR_PeripheralSRC; = 512; = DMA_PeripheralInc_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 习题/试题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号