STM32的USART的DMA不定长度收发代码
/*
* 函数名:USART1_DMA_Config
* 描述 :串口1的DMA 的初始化配置
* 输入 :无
* 输出 : 无
* 调用 :在USART1_INIT()中被调用
*/
void USART1_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA时钟 //配置串口1发送DMA
DMA_DeInit(DMA1_Channel4);
/*设置DMA源:内存地址&串口数据寄存器地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /*内存地址(要传输的变量的指针)*/
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Txd1Buffer; //发送的内存地址任意,请参考发送函数
/*方向:从内存到外设*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
/*传输大小DMA_BufferSize=0*/
DMA_InitStructure.DMA_BufferSize = 0; //发送的数据个数任意,请参考发送函数
/*外设地址不增*/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
/*内存地址自增*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
/*外设数据单位*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
/*内存数据单位 8bit*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
/*DMA模式:一次传输,循环*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
/*优先级:中*/
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA_Priority_VeryHigh;
/*禁止内存到内存的传输 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &DMA_InitStructure);
/*配置DMA1的4通道*/
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); //配置DMA发送完成后产生中断
DMA_Cmd (DMA1_Channel4,DISABLE); //配置串口1接收DMA /*设置DMA源:内存地址&串口数据寄存器地址*/
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /*内存地址(要传输的变量的指针)*/
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Rcv1Buffer; //接收缓存是固定不变的
/*方向:从内存到外设*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
/*传输大小DMA_BufferSize=BUFFSIZE*/
DMA_InitStructure.DMA_BufferSize = Rcv1_BUFFSIZE; //必须这样设置
/*外设地址不增*/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
/*内存地址自增*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
/*外设数据单位*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
/*内存数据单位 8bit*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
/*DMA模式:一次传输,循环*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; /*优先级:中*/
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; // DMA_Priority_VeryHigh;
/*禁止内存到内存的传输 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/*配置DMA1的5通道*/
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,DISABLE); //DMA接收不产生中断
DMA_Cmd (DMA1_Channel5,ENABLE); }
/*
* 函数名:USART1_Send
* 描述 :串口1发送数据函数
* 输入 :要发送数据的首地址,发送数据的个数。发送数据的地址任意,并不用固定为Txd1Buffer
* 输出 : 无
* 举例 :Usart1_Send("Hello word!",11); Usart1_Send(Txd1Buffer,11);
*/ void USART1_Send(uint8_t *pbuffer, uint32_t size)
{
DMA_Cmd (DMA1_Channel4,DISABLE);
DMA1_Channel4->CMAR = (u32)pbuffer;
DMA1_Channel4->CNDTR = size;
DMA_Cmd (DMA1_Channel4,ENABLE); //使能DMA,开始发送
Txd1_Flag=1; //数据发送中
// LED1(ON); //灯亮
}
/*
* 函数名:USART1_SendOK_IQ
* 描述 :串口1发送数据完毕后,会调用的中断函数,将发送标志置0
* 输入 :无
* 输出 : 无
* 调用 :此函数需在stm32f10x_it.c 的 DMA1_Channel4_IRQHandler()中被调用
*/
void USART1_SendOK_IQ(void)
{
//判断是否为DMA发送完成中断
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
{
DMA_ClearITPendingBit(DMA1_IT_GL4);
DMA_ClearFlag(DMA1_FLAG_TC4);
DMA_Cmd (DMA1_Channel4,DISABLE);
Txd1_Flag = 0; //数据发送完毕
//LED关闭
// LED1(OFF); }
}
/*
* 函数名:USART1_INIT
* 描述 :串口1初始化函数,包括引脚配置,串口配置,DMA配置及中断优先级配置
* 输入 :无
* 输出 : 无
*/
void USART1_INIT(void)
{
USART1_Config();
USART1_DMA_Config();
USART1_NVIC_Config(); Rcv1Counter = 0;
Rcv1_Flag = 0;
Txd1_Flag = 0;
}
STM32的USART的DMA不定长度收发代码的更多相关文章
- STM32基础分析——USART的DMA模式
有关USART的DMA传输模式,其基本的概念和配置,网上有很多博客和教程都有,这里不再赘述,只是记录一下比较容易忽视而造成调试不通的问题. 1. 串口发送和接收分属两个DMA通道 一般方式操作串口时, ...
- STM32CubeMX HAL库串口: 使用DMA数据发送、使用DMA不定长度数据接收
转载自 https://blog.csdn.net/euxnijuoh/article/details/81638676
- STM32的USART DMA传输(转)
源:STM32的USART DMA传输 问题描述: 我有一个需求,AD采得一定数目的数据之后,由串口DMA发出,由于AD使用双缓冲,所以每次开始DMA的时候都需要重新设置开始的内存地址以及传输的数目( ...
- Java 不定长度参数
在调用某个方法时,若是方法的参数个数事先无法确定该如何处理?例如System.out.printf()方法中并没有办法事先决定要给的参数个数,像是: ? 1 2 3 System.out.printf ...
- STM32串行通信USART解说笔记
STM32串行通信USART程序例举链接:http://blog.csdn.net/dragon12345666/article/details/24883111 1.STM32串行通信USART的相 ...
- 关于STM32的I2C硬件DMA实现
关于STM32的I2C硬件DMA实现 网上看到很多说STM32的I2C很难用,但我觉得还是理解上的问题,STM32的I2C确实很复杂,但只要基础牢靠,并没有想象中的那么困难. 那么就先从基础说起,只说 ...
- STM32 HAL库利用DMA实现串口不定长度接收方法
参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...
- STM32 串口USART DMA方式发送接收数据
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 头文件 USART3_DR的地址 DMA的通道 DMA的中断 USART接收回调函数 头 ...
- STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收
参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...
- stm32的dma缓冲区长度,,存放数据数组会不会冲掉
随机推荐
- 基础篇之DOS命令
对于编程的小朋友来说,在DOS中输入一些命令也是常有的事情. 今天就来学习一些常见的命令.[该篇是在B站学习Siki学院的课程时做的笔记] DOS命令目录操作 常用DOS命令(输入命令后按下回车) d ...
- Carthage 使用介绍
1.安装 Carthage 安装 brew install carthage 检测当前版本 carthage version 升级至最新版本 brew upgrade carthage 2.如果更新出 ...
- glibc被卸载恢复过程
问题描述:升级软件包时,rpm -e glibc --nodeps 卸载了glibc软件,glibc是系统命令库,之后一些命令不能使用,系统几近奔溃恢复步骤: 1). 挂载装系统光盘,设置从光盘启动, ...
- Java向MySQL写入中文乱码问题解决
Java向MySQL写入中文乱码问题解决 以下仅为本人工作.学习过程中所接触到的内容,不足之处欢迎指出. 问题现象: 使用Java代码向MySQL数据库写入数据,中文字符出现乱码. 解决步骤: 1.查 ...
- 可视化 之D3 与echarts 对比以及应用场景
可视化:我们想要看出一组数据的大小关系,单看数据显然不够直观.那么我们可以将它转换为一种简单易懂的图表的形式,就可以更加直观的获取数据所传递给我们的信息.这个过程就叫做数据可视化.可视化常用2个前端库 ...
- cam对象类型
//此函数的功能是打印当前坐标系试图的所有坐标系名称 static void geom_list_name(tag_t group_tag) { //ask_member_list int count ...
- 网页制作02--banner制作
样本: 第一步:先做一个超大的通栏banner盒子. 第二步:在通栏盒子里面做一个版心的盒子 第三部:版心盒子里面在分左边盒子和右边盒子 1号盒子是通栏的大盒子banner,不给宽度,给高度.给一个蓝 ...
- lua 添加的时候去重
result = {} ids = {1,9,6,7}affs = {3,2,4,5,6}count =0for s in *ids result[s]=sfor p, v in pairs resu ...
- C++入门之unordered_map
1.介绍 unordered_map是c++语言STL库中一个比较重要的容器,不能自动排序,这一容器是根据哈希表这一数据结构设计而成的,能够极大地提升数据搜索.插入和删除操作的时间效率. 2.头文 ...
- OPENSSL 生成RSA公钥、私钥和证书
在命令窗口执行下列操作. 1)生成RSA私钥: openssl genrsa -out rsa_private_key.pem 2048 生成内容: -----BEGIN RSA PRIVATE KE ...