USART1的DMA发送比较简单,在要发送之前,重新设置好DMA_BufferSize的大小,然后启动DMA就行了。不过在设置这一值时,得先关闭DMA通道。代码如下:
DMA_ClearFlag(DMA1_FLAG_TC4); //清DMA发送完成标志
DMA_Cmd(DMA1_Channel4, DISABLE); //停止DMA
DMA1_Channel4->CNDTR = sizeof(TxBuffer1) / sizeof(TxBuffer1[0]);//重设传输长度
DMA_Cmd(DMA1_Channel4, ENABLE); //启动DMA
USART1的DMA接收:如果向USART1发送了数据,则数据会通过DMA传输至初始化DMA接收通道时设置好的内存地址处。据说数据的解析会比较麻烦,因为你不知道什么时候一条完整的指令传输完了,怎么做可以参考这两处: http://bbs.21ic.com/viewthread.php?tid=124248&highlight=USART+DMA
http://bbs.21ic.com/viewthread.php?tid=109346&highlight=USART+DMA
试了一下接收通道DMA1_Channel5的DMA1_IT_TC5中断,有一点和我预料的不一样,初始化该通道时不是也设置过一个DMA_BufferSize值吗,只有接收满了个 DMA_BufferSize大小的数据后,才会产生 DMA1_IT_TC5中断,而 不是接收一个字节的数据就会产生一个 DMA1_IT_TC5中断。
关键字:STM32 USART1 DMA 发送与接收
引用地址:
STM32的 USART1 用 DMA 方式发送与接收
推荐阅读最新更新时间:2024-11-13 05:12
STM32 测量交流电压的方法
关于STM32测量交流电的一种方法. 关于交流电压测量的难点有以下几点:1.电压过大,比如市电220V,2.交流电和直流电区别很大,例如值一直在变不稳定.3.交流电压存在负值,STM32 的AD模块没法测量.4.STM32读取的电压值是瞬时值和交流电的有效值还要转换. 针对以上几点:可以采取合适的硬件设计和算法设计解决.采用电流互感器将电压从高变低,采用直流电压叠加的方式将整体的交流波形抬升,抬升到最低都大于零.至于读取到的数值采用均方根的算法算出交流有效值.另外还要注意一点是采样周期的设置. 电路设计: 这个硬件电路设计很完善.还有一种: 第二种电路结构更简单,但是运放采用的是用于测量交流信号的MCP
[单片机]
STM32学习笔记之以太网的通信+lwip协议移植
STM32F107自带 MAC控制器 而有的芯片把Mac和PHY坐到一起了,像ENC28J60 以太网通信 依据 TCP/IP协议是 LWIP协议,这个LWIP 协议是可以运行在STM32上面的。 STM32F107为以太网外设专门做的库直接下载对应的demo 可能协议版本不一样,下载运行即可。 主要有几个部分说明一下 1、修改 ethernetif.c 包含了与以太网网卡密切相关的初始化、发送、接收等函数的实现。这个文件夹中的函数并不能使用,它们都是一个框架性的结构,移植者需要根据自己使用的网卡特性来完成这些函数。 2、mem管理 使用系统堆内存管理或者使用自定义内存管理(类
[单片机]
STM32学习之路-MDK4.7(JLINk问题)+VIM
主机环境:win7 开发板:STM32F103VE 问题一:MDK4.7a对部分用户的JLINK(当然是山寨版的)存在问题.. 问题描述: 当setting的时候会出现问题,它会叫你升级你的JLINK,这对于我们用山寨版的JLINK用户来说是不可能的,一旦升级就玩完了 所以不能升级。不过有些用户就没有出现这样的问题,不知道是什么回事,连软件都会鄙视人,没法活了.. 解决方案: (1)购买正版的JLINK,然后升级(貌似是废话) (2)下载JLinkARM_V440(我以前的是V410版本的),将改安装目录下的JLinkARM.dll 文件 替换掉keil安装目录下的ARMSegger下的JLin
[单片机]
基于STM32的红外遥控和解码遥控程序解析
文本主要包含两个内容:一、红外遥控协议的的讲解;二、解码程序解析(参考正点原子的代码) 红外的介绍、优点、缺点就不给大家说了,网上书上都有,下面进入正题 一、红外遥控协议的的讲解 红外遥控的编码目前广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 Protocol的PPM(脉冲位置调制) 本文将以NEC协议实现红外遥控。 NEC协议的特征: 1、8位地址和8位指令长度; 2、地址和命令两次传输(确保可靠性); 3、PWM脉冲宽度调制,以发射红外载波的占空比代表 0 和 1 ; 4、载波频率为38KHz; 5、位时间为1.125ms和2.25ms; NEC 码位的定义:一个脉
[单片机]
MSP430 SPI接口DMA模式通信
因为在tinyos系统下,节点写flash的速度过慢,开始怀疑是不是SPI的速度有问题,所以后来就直接在IAR上裸机读写FLASH,看看速度可以去到多少。用到了430的SPI的DMA模式 DMA模式之所以会更快,是因为所要传输的数据省去了要经过CPU处理这一步,直接在内部总线传输到DMA寄存器,然后DMA寄存器在根据情况通过总线传输到目标寄存器。这里的总线,我也还没搞清楚。在DMA传输数据的时候,虽然说CPU可以继续干自己的活,但是如果CPU要使用总线的话,而总线被DMA占用了,这时候该怎么办? void SpiDmaSend(uint8_t cmd,uint8_t *tx_addr, uint8_t *rx_addr,u
[单片机]
详解STM32启动文件
本文对STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此文件的代码在任何一个STM32F10x工程中都可以找到。可以点击文末阅读原文直接下载此文件,提取码stm3。 启动文件使用的ARM汇编指令汇总 Stack——栈 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN= Stack_Mem SPACE Stack_Size __initial_sp 开辟栈的大小为 0X00000400(1KB),名字为 STACK, NOINIT 即不初始化,可读可写, 8(2^3)字节对齐。 栈的作用是用于局部变量,函数调用,函数形
[单片机]
STM32之寄存器开发
首先克服心理作用,不要总是默认寄存器开发难,其实寄存器开发和库函数开发所用的方法和难度是一样的, 并不难,下面用以stm32为例解释。 : 1.明确自己需要的功能(库函数开发也需要) 2.查看手册,找到功能对应的单片机资源 3.找到功能所需寄存器(库函数开发需要找到相应的功能函数) 4.根据地址每位对应的功能赋值(库函数开发需要找到相应的入口函数) 5.调试结束。 而且寄存器开发不难但是麻烦,有很多没接触过的名词(有可能是一些英文缩写),所以需要耐心,慢慢品味。如果这些名词弄清楚了,寄存器开发反而会比库函数开发简单、方便。 注:名词或需要整理的步骤太多可以手动记一下,既有利于理清思路,也方便回看时
[单片机]
基于STM32的智能循迹往返小车设计
智能车辆作为智能交通系统的关键技术之一,是许多高新技术综合集成的载体。它体现了车辆工程、人工智能、自动控制及计算机技术于一体的综合技术,是未来汽车发展的趋势。本文提出了一个基于STM32F103芯片为控制核心,附以红外传感器采集外界信息和检测障碍物的智能小车系统设计方案。充分利用该芯片高速运算、处理能力,来实现小车自动识别路线按迹行走、躲避障碍物,并且通过LCD显示器实时显示小车运动参数,使用芯片自带的PWM输出功能,步进调节占空比来调节电机的转速。通过模糊控制和PWM脉宽调制技术的结合,提高了对车位置控制精度。 1 系统硬件电路设计 根据题目中的设计要求,本系统主要由主控单片机模块、电源模块、电机驱动模块、黑线检测模块、
[单片机]