STM32F1库函数初始化系列:串口DMA空闲接收_DMA发送
1 void USART3_Configuration(void) //串口3配置---S
2 {
3 DMA_InitTypeDef DMA_InitStructure;
4 USART_InitTypeDef USART_InitStructure;
5 GPIO_InitTypeDef GPIO_InitStructure;
6 NVIC_InitTypeDef NVIC_InitStructure;
7 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
8 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1|RCC_AHBPeriph_DMA2, ENABLE);
9 //USART1
10 //TX
11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
12 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
13 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
14 GPIO_Init(GPIOB, &GPIO_InitStructure);
15 //RX
16 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
17 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
18 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
19 GPIO_Init(GPIOB, &GPIO_InitStructure);
20
21 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&( USART3->DR);
22 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)_code_rece;
23 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
24 DMA_InitStructure.DMA_BufferSize = 4000;
25 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
26 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
27 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //HalfWord
28 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
29 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ; // DMA_Mode_Normal
30 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA_Priority_Low DMA_Priority_Medium DMA_Priority_High
31 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
32 DMA_Init(DMA1_Channel3, &DMA_InitStructure);
33
34 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&( USART3->DR);
35 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)_send_data;
36 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
37 DMA_InitStructure.DMA_BufferSize = 14;
38 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
39 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
40 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //HalfWord
41 DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
42 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; // DMA_Mode_Normal
43 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA_Priority_Low DMA_Priority_Medium DMA_Priority_High
44 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
45 DMA_Init(DMA1_Channel2, &DMA_InitStructure);
46
47 USART_OverSampling8Cmd(USART3, ENABLE);
48 USART_InitStructure.USART_BaudRate = 460800;
49 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
50 USART_InitStructure.USART_StopBits = USART_StopBits_1;
51 USART_InitStructure.USART_Parity = USART_Parity_No;
52 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
53 USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
54 USART_Init(USART3, &USART_InitStructure);
55
56 //NVIC 设置,使能中断
57 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //选择中断分组1
58
59 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //选择串口3中断
60 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
61 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1
62 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
63 NVIC_Init(&NVIC_InitStructure);
64 USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//开启中断
65
66 USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);
67 USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE);
68 DMA_Cmd(DMA1_Channel3, ENABLE);
69 USART_Cmd(USART3, ENABLE);
70 USART3->SR;
71 USART3->DR;
72 }
73
74 DmaSendDataProc( DMA1_Channel2, 14 );
75 //开启一次DMA传输
76 void DmaSendDataProc(DMA_Channel_TypeDef *DMA_Streamx,u16 ndtr)
77 {
78
79 DMA_Cmd(DMA_Streamx, DISABLE); //关闭DMA传输
80
81 DMA_SetCurrDataCounter(DMA_Streamx,ndtr); //数据传输量
82
83 DMA_Cmd(DMA_Streamx, ENABLE); //开启DMA传输
84
85 }
86 void USART3_IRQHandler(void) //客户端传来数据
87 {
88 if(USART_GetFlagStatus(USART3, USART_FLAG_IDLE)==SET) //RXNE一个字节接收完成标志位,
89 {
90 DMA_Cmd(DMA1_Channel3, DISABLE); //关闭DMA输出
91
92 usart2_num = 2000 - DMA1_Channel3 ->CNDTR; //获取读到的字节数
93 //处理数据
94 DMA1_Channel3->CNDTR = 2000; //重新填充
95 DMA_Cmd(DMA1_Channel3, ENABLE); //开启DMA传输
96 }
97
98 USART_ClearITPendingBit(USART3, USART_IT_IDLE); //清除接收中断标志位
99 USART3->SR;
100 USART3->DR;
101
102 }
STM32F1库函数初始化系列:串口DMA空闲接收_DMA发送的更多相关文章
- STM32 串口DMA方式接收(转)
STM32 是一款基于ARM Cortex-M3内核的32位MCU,主频最高可达72M.最近因为要在车机上集成TPMS功能, 便开始着手STM32的开发工作,STM32F10x系列共有5个串口(USA ...
- STM32串口DMA超时接收方法,可大大节约CPU时间
//超时时间定义#define UART1_TimeoutComp 2 //20ms#define UART2_TimeoutComp 10 //100ms#defin ...
- STM32之串口DMA接收不定长数据
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...
- STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)
数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232 ...
- STM32 HAL库利用DMA实现串口不定长度接收方法
参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...
- STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收
参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...
- STM32串口DMA接收数据错位——暴力解决方法
背景:两片STM32通过串口通信,为了减小CPU负担,采用DMA进行通信,发送端为STM32F103C8T6,接收端为STM32F407VET6.在调试的过程中发现,一直出现数据错位的问题,接收端尝试 ...
- STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率
前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...
- STM32——DMA接收和发送的实现
最近写程序,需要一段一段数据的接收,再通过其他串口发送出去. 老司机们建议用DMA通信,以节约CPU资源.然后,我听了,发现挺好用的.特此,把自己写的代码贴上了. DMA发送接收的步骤如下: 1.初始 ...
- Stm32CubeMX5 配置 STM32的串口DMA接受方式 --- 基于 stm32f051k8u6
实现的功能: 使用MDA方式把串口接受的数据在发送给串口(当然也可以做其他解析控制使用) 1. 先初始化 时钟使用外部的晶振配置系统时钟为48Mhz 2. 串口参数配置 3. 使能中断 4. 配置串 ...
随机推荐
- Linux 中的内部命令和外部命令
Linux 中的内部命令和外部命令 作者:Grey 原文地址: 博客园:Linux 中的内部命令和外部命令 CSDN:Linux 中的内部命令和外部命令 什么是 bash shell ? bash s ...
- [Android开发学iOS系列] TableView展现一个list
TableView 基础 本文讲讲TableView的基本使用. 顺便介绍一下delegation. TableView用来做什么 TableView用来展示一个很长的list. 和Android中的 ...
- mysql 多个结构不同表查询 返回相同字段名
( select ID,数据库原字段名1 AS 统一字段名1,数据库原字段名2 AS 统一字段名2 from 第一个表名 WHERE 1) UNION(联合表查询)( select ID,数据库原字段 ...
- VsCode搭建一个React项目
安装Node.js 使用 npm -v检查安装成功 目前的 node 中都会自带 npm 所以不需要重新下载 直接切换至淘宝镜像即可 1.临时使用 :npm --registry https://re ...
- easyui textbox setvalue 和 settext前后之别
今天在这里转了好久,浪费了不少时间.话不多说直接上干货: 1.text与value设置不同的值一定要先赋值 value后赋值text, 否则全为value值 2.若只setValue,则getValu ...
- Blender修改视野范围
首先,我不是专门的建模人员.但是有时候会拿到建模人员的制作的模型导入进行修改. 比如简单的删除某个模型,调整模型的尺寸. 还有就是调整模型的建模中心点,这点有时候显得特别重要,模型的中心点偏离较大会给 ...
- bug处理记录:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=512M; support was removed in 8.0
1. 报错: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=512M; support was removed ...
- Java手写一个批量获取数据工具类
1. 背景 偶尔会在公司的项目里看到这样的代码 List<Info> infoList = new ArrayList<Info>(); if (infoidList.size ...
- 彻底弄懂Javascript模块导入导出
笔者开始学习Javascript的时候,对模块不太懂,不知道怎么导入模块,导出模块,就胡乱一通试 比如 import xx from 'test.js' 不起作用,就加个括号 import {xx} ...
- Spark详解(08) - Spark(3.0)内核解析和源码欣赏
Spark详解(08) - Spark(3.0)内核解析和源码欣赏 源码全流程 Spark提交流程(YarnCluster) Spark通讯架构 Spark任务划分 Task任务调度 Shuffle原 ...