stm32,DMA采集一个AD数据,并通过DMA向串口发送
STM32CubeMx——串口使用DMA收发数据

STM32CubeMx——串⼝使⽤DMA收发数据⽤到的是DMA发送数据,DMA接收,在中断回调⾥发送出去。
⼀.代码⽣成1.按以前的⽅法设置好时钟和调试⽅式,这⾥就不多说了。
2.设置串⼝1。
3.在DMA Setting⾥点击Add添加USART1_TX,Mode有两种模式,⼀种是普通模式,使⽤⼀次发送语句就发⼀次,另⼀种是循环模式,使⽤⼀次发送会⼀直发送。
这⾥发送我选择普通模式,接收选择循环模式。
4.在中断设置⾥打开串⼝1的中断。
5.时钟和⽂件路径等设置好,然后点⽣成代码。
⼆.代码编写1.先定义发送和接收的数组。
/* USER CODE BEGIN 0 */uint8_t aRxBuffer[1];uint8_t aTxBuffer[]="ok";/* USER CODE END 0 */2.打开串⼝DMA的发送使能,while循环可以放⼀些LED的闪烁。
/* USER CODE BEGIN 2 */HAL_UART_Receive_DMA(&huart1,aRxBuffer,1);HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer));/* USER CODE END 2 */3.最后加上⼀个串⼝接收函数的回调函数,把接收到的数据再发出去。
/* USER CODE BEGIN 4 */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){HAL_UART_Transmit(&huart1,aRxBuffer,1,0);}/* USER CODE END 4 */现象:上电之后,电脑的串⼝会收到“OK”,然后从电脑发送给芯⽚任意字符,芯⽚再发回来。
总结:使⽤DMA做发送处理,接收数据后⽤串⼝发出去。
为什么接收到数据后不⽤HAL_UART_Transmit_DMA发送出去呢?使⽤这个发现丢包情况,因为这⾥只是测试DMA接收数据情况,接收到之后⼀般是作运算处理的,所以⽤⼀般串⼝发送验证接收的数据正确。
stm32f103 dma案例

STM32F103 DMA案例背景STM32F103是意法半导体(STMicroelectronics)推出的一款32位Cortex-M3内核的单片机,具有丰富的外设和强大的性能。
其中,DMA(Direct Memory Access)是STM32F103系列的一个重要特性,它能够实现外设和内存之间的数据传输,大大减轻了CPU的负担,提高了系统的性能。
本文将通过一个具体的案例来介绍STM32F103的DMA功能以及如何使用DMA进行数据传输。
案例描述在某个智能家居系统中,需要读取多个传感器的数据,并将数据通过串口发送给上位机进行处理和显示。
传感器的数据采集频率较高,而且需要实时传输,因此需要一种高效的方式来进行数据传输。
为了减轻CPU的负担,我们决定使用STM32F103的DMA功能来实现数据的传输。
硬件准备•STM32F103开发板•传感器模块•上位机串口调试工具软件准备•Keil MDK开发环境•STM32CubeMX配置工具案例过程步骤1:配置GPIO和串口首先,使用STM32CubeMX配置工具对STM32F103进行初始化配置。
打开STM32CubeMX,选择对应的芯片型号(例如STM32F103C8T6),然后进行以下配置:1.在”Pinout & Configuration”选项卡中,配置GPIO引脚。
将传感器模块的数据引脚连接到STM32F103的GPIO引脚,使其能够读取传感器数据。
2.在”Peripherals”选项卡中,配置串口。
选择一个可用的串口(例如USART1),配置波特率和其他参数,以便与上位机进行通信。
完成配置后,点击”Project”菜单,选择”Generate Code”生成代码。
然后将生成的代码导入到Keil MDK开发环境中。
步骤2:配置DMA传输在Keil MDK中打开生成的工程,找到对应的串口初始化代码。
在初始化代码中加入以下代码,配置DMA传输:// 定义DMA传输缓冲区#define BUFFER_SIZE 100uint8_t buffer[BUFFER_SIZE];// 配置DMA传输DMA_HandleTypeDef hdma_usart1_tx;hdma_usart1_tx.Instance = DMA1_Channel4;hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart1_tx.Init.Mode = DMA_NORMAL;hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;HAL_DMA_Init(&hdma_usart1_tx);// 关联DMA和串口__HAL_LINKDMA(huart, hdmatx, hdma_usart1_tx);以上代码中,首先定义了一个长度为100的缓冲区,用于存储传感器数据。
STM32多通道ADC采集详解(DMA模式和非DMA模式)

STM32多通道ADC采集详解(DMA模式和非DMA模式)在非DMA模式下,ADC采集的数据是通过CPU直接读取的,采集效率相对较低,但是编程相对简单。
首先,需要初始化ADC模块的工作模式(单通道、多通道等)和采样时间。
然后,使能ADC模块,并配置所需的通道和采样时间。
接着,设置采样序列,指定要采集的通道和相应的排列顺序。
在采集数据时,首先需要设置ADC转换模式和采样时间,然后开始转换,并等待转换完成。
转换完成后,通过读取ADC_DR寄存器可以获取转换结果。
如果需要采集多个通道的数据,可以通过设置ADCSQR中的SQx位来启动下一次转换。
在DMA模式下,ADC采集的数据是通过DMA控制器传输到指定的内存区域,采集效率较高,适合数据量较大的应用场景。
与非DMA模式相比,DMA模式下的配置需要额外设置DMA控制器的工作模式(单次传输、循环传输等)和传输数据的目的地地址。
在采集数据前,需要设置DMA传输的目的地地址,并使能DMA传输。
在开启ADC转换后,DMA控制器会根据设置的目的地地址来自动传输数据,无需CPU干预。
采集完成后,CPU可以通过检查DMA传输完成标志位来判断数据是否已传输完毕。
总结:
使用非DMA模式的ADC采集相对简单而容易上手,适用于数据量较小且对实时性要求不高的应用场景。
DMA模式下的ADC采集效率更高,适用于数据量较大且对实时性要求较高的应用场景。
无论是DMA模式还是非DMA模式,都需要根据具体的应用需求来选择合适的模式。
在使用DMA模式时,还需要注意合理设置DMA传输的目的地地址和传输模式,以充分发挥DMA的优势。
STM32串口采用DMA方式收发

STM32串⼝采⽤DMA⽅式收发FROM:什么是DMA —- Directional Memory Access, 直接存储器存取⽤来提供在外设和存储器之间或者存储器和存储器之间的⾼速数据传输。
⽆须CPU⼲预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作我们通过以下⼏⽅⾯学习串⼝DMA:⼀、如何理解DMA对于DMA,打个⽐⽅就很好理解:⾓⾊预设:淘宝店主 —- STM32 MCU快递员 —- 外设(如UART,SPI)发货室 —- DMA1、⾸先你是⼀个淘宝店主,如果每次发货收货都要跟快递沟通交涉会很浪费时间和精⼒。
2、然后你就⾃⼰建了⼀个发货室,发货室⾥有好多个货柜箱⼦,每个箱⼦上都写着快递名字(如果申通快递,顺丰快递等)。
3、每次发什么快递,你就找到对应的货柜箱⼦,把货物放进去即可,然后跟快递通知⼀声。
4、快递取⾛快件。
5、如果是收货,快递直接把快件放到对应的柜⼦,然后通知你⼀下。
6、你过来提取货物。
通过上⾯的⽅式,你可以不需要直接跟快递打交道,就可以轻松发货成功,DMA处理⽅式跟上⾯例⼦是⼀样的。
如果下图:⼆、STM32 DMA 配置那么DMA在STM32上是具体怎么实现的呢?我们先了解⼀下STM32关于DMA的相关配置。
1、两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道)ps:对应我们例⼦,就是有两个⼤的发货室,⼀个有7个货柜,另个有5个货柜。
2、在同⼀个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很⾼、⾼、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)ps: 店主可以跟每个快递公司签订协议,可以在货柜前贴上加急(很⾼),很急(⾼),急(中),⼀般(低),如果同时有⼏个快递员过来取货,优先根据上⾯的优先级先取件。
3、独⽴数据源和⽬标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。
源和⽬标地址必须按数据传输宽度对齐。
stm32f103 dma案例

stm32f103 dma案例STM32F103 DMA(Direct Memory Access)是一种用于高效数据传输的技术,通过在外设和内存之间设置数据传输通道,可以减轻CPU 的负担,提高系统的效率。
在这里,我们将介绍一个使用STM32F103的DMA功能的案例,具体来说是使用DMA传输数据到USART串口。
首先,我们需要在STM32F103上配置USART串口和DMA通道。
我们将USART串口配置为发送模式,并且使能DMA功能。
然后,我们设置DMA通道的传输方向为从内存到外设(USART),并设置传输的数据长度以及数据传输的起始地址。
接下来,我们需要准备要发送的数据,可以是一个字符串、一个数组或者其他形式的数据。
在本例中,我们将准备一个字符串,用于发送到USART串口。
然后,我们需要编写一个函数来启动DMA传输。
在这个函数中,我们首先需要初始化并配置DMA通道。
然后,我们将准备好的数据作为源地址传递给DMA,并设置传输的长度。
最后,我们启动DMA传输。
在主函数中,我们调用启动DMA传输的函数,并通过USART串口发送了一段文本。
在运行程序时,DMA将负责将数据从内存传输到USART串口,而不需要CPU的干预。
这样,我们可以节省CPU的处理时间,并提高系统的效率。
下面是一个使用STM32F103的DMA功能的示例代码:```c#include "stm32f10x.h"#define USART1_DMA_CHANNEL DMA1_Channel4#define USART1_DMA_STREAM DMA1_Stream4#define USART1_DR_ADDRESS ((uint32_t)0x40013804)void DMA_USART_Send(char* data, uint16_t length) {DMA_InitTypeDef dmaInitStruct;/*开启DMA和USART时钟*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);/*初始化DMA通道*/DMA_DeInit(USART1_DMA_CHANNEL);DMA_StructInit(&dmaInitStruct);dmaInitStruct.DMA_PeripheralBaseAddr = USART1_DR_ADDRESS;dmaInitStruct.DMA_MemoryBaseAddr = (uint32_t)data;dmaInitStruct.DMA_DIR = DMA_DIR_PeripheralDST;dmaInitStruct.DMA_BufferSize = length;dmaInitStruct.DMA_PeripheralInc =DMA_PeripheralInc_Disable;dmaInitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;dmaInitStruct.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte;dmaInitStruct.DMA_MemoryDataSize =DMA_MemoryDataSize_Byte;dmaInitStruct.DMA_Mode = DMA_Mode_Normal;dmaInitStruct.DMA_Priority = DMA_Priority_High; dmaInitStruct.DMA_M2M = DMA_M2M_Disable;DMA_Init(USART1_DMA_CHANNEL, &dmaInitStruct); /*配置USART串口*/USART_InitTypeDef usartInitStruct;USART_StructInit(&usartInitStruct); ART_BaudRate = 9600;USART_Init(USART1, &usartInitStruct);/*启动DMA传输*/DMA_Cmd(USART1_DMA_CHANNEL, ENABLE);USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); }int main(void) {/*初始化串口*/USART_InitTypeDef usartInitStruct;USART_StructInit(&usartInitStruct);ART_BaudRate = 9600;USART_Init(USART1, &usartInitStruct);/*启动DMA传输*/char data[] = "Hello, DMA!";DMA_USART_Send(data, sizeof(data));while(1);return 0;}```以上代码中,我们使用了STM32F103的库函数来进行配置和操作,使得编程更加方便快捷。
ADC结合DMA例子

STM32 ADC结合DMA数据采样与软件滤波处理2012-03-17 23:53:05| 分类:STM32 | 标签:adc结合dma |举报|字号订阅本文原创于观海听涛,原作者版权所有,转载请注明出处。
作为一个偏向工控的芯片,ADC采样是一个十分重要的外设。
STM32集成三个12位精度18通道的内部ADC,最高速度1微秒,结合DMA可以解放CPU进行更好的处理。
ADC接口上的其它逻辑功能包括:●同步的采样和保持●交叉的采样和保持●单次采样模拟看门狗功能允许非常精准地监视一路、多路或所有选中的通道,当被监视的信号超出预置的阀值时,将产生中断。
由标准定时器(TIMx)和高级控制定时器(TIM1和TIM8)产生的事件,可以分别内部级联到ADC的开始触发和注入触发,应用程序能使AD转换与时钟同步。
12位ADC是一种逐次逼近型模拟数字数字转换器。
它有多达18个通道,可测量16个外部和2个内部信号源。
ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。
如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。
关于ADC采样与DMA关系,引用网上一段解释:STM32 的优点在哪里?除去宣传环节,细细分析。
STM32 时钟不算快,72MHZ,也不能扩展大容量的RAM FLASH,同样没有DSP 那样强大的指令集。
它的优势在哪里呢?---就在快速采集数据,快速处理上。
ARM 的特点就是方便。
这个快速采集,高性能的ADC 就是一个很好的体现,12 位精度,最快1uS 的转换速度,通常具备2 个以上独立的ADC 控制器,这意味着,STM32 可以同时对多个模拟量进行快速采集,这个特性不是一般的MCU具有的。
以上高性能的ADC,配合相对比较块的指令集和一些特色的算法支持,就构成了STM32 在电机控制上的强大特性。
好了,正题,怎末做一个简单的ADC,注意是简单的,ADC 是个复杂的问题,涉及硬件设计,电源质量,参考电压,信号预处理等等问题。
STM32-ADC结合DMA数据采样与软件滤波处理

STM32 ADC结合DMA数据采样与软件滤波处理2012-03-17 23:53:05| 分类:STM32 | 标签:adc结合dma |字号大中小订阅本文原创于观海听涛,原作者所有,请注明出处。
作为一个偏向工控的芯片,ADC采样是一个十分重要的外设。
STM32集成三个12位精度18通道的部ADC,最高速度1微秒,结合DMA可以解放CPU进行更好的处理。
ADC接口上的其它逻辑功能包括:●同步的采样和保持●交叉的采样和保持●单次采样模拟看门狗功能允许非常精准地监视一路、多路或所有选中的通道,当被监视的信号超出预置的阀值时,将产生中断。
由标准定时器(TIMx)和高级控制定时器(TIM1和TIM8)产生的事件,可以分别部级联到ADC 的开始触发和注入触发,应用程序能使AD转换与时钟同步。
12位ADC是一种逐次逼近型模拟数字数字转换器。
它有多达18个通道,可测量16个外部和2个部信号源。
ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。
如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。
关于ADC采样与DMA关系,引用网上一段解释:STM32 的优点在哪里?除去宣传环节,细细分析。
STM32 时钟不算快,72MHZ,也不能扩展大容量的RAM FLASH,同样没有DSP 那样强大的指令集。
它的优势在哪里呢?---就在快速采集数据,快速处理上。
ARM 的特点就是方便。
这个快速采集,高性能的ADC 就是一个很好的体现,12 位精度,最快1uS 的转换速度,通常具备2 个以上独立的ADC 控制器,这意味着,STM32 可以同时对多个模拟量进行快速采集,这个特性不是一般的MCU具有的。
以上高性能的ADC,配合相对比较块的指令集和一些特色的算法支持,就构成了STM32 在电机控制上的强大特性。
好了,正题,怎末做一个简单的ADC,注意是简单的,ADC 是个复杂的问题,涉及硬件设计,电源质量,参考电压,信号预处理等等问题。
一文带你看懂Stm32定时器+ADC+DMA进行AD采样的实现

一文带你看懂Stm32定时器+ADC+DMA进行AD采样的实现一文带你看懂Stm32定时器+ADC+DMA进行AD采样的实现此STM32单片机为STM32F103系列的STM32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法:1、使用定时器中断每隔一定时间进行ADC转换,这样每次都必须读ADC的数据寄存器,非常浪费时间!2、把ADC设置成连续转换模式,同时对应的DMA通道开启循环模式,这样ADC就一直在进行数据采集然后通过DMA把数据搬运至内存。
但是这样做的话还得加一个定时中断,用来定时读取内存中的数据!3、使用ADC的定时器触发ADC转换的功能,然后使用DMA进行数据的搬运!这样只要设置好定时器的触发间隔,就能实现ADC定时采样转换的功能,然后可以在程序的死循环中一直检测DMA转换完成标志,然后进行数据的读取,或者使能DMA转换完成中断,这样每次转换完成就会产生中断,我是采用第二种方法。
下面上代码:我这里使用的单通道//定时器初始化voidTIM2_ConfiguraTIon(void){TIM_TImeBaseInitTypeDefTIM_TimeBaseStructure;TIM_OCInitTypeDefTIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_TimeBaseStructure.TIM_Period=1999;//设置2ms一次TIM2比较的周期TIM_TimeBaseStructure.TIM_Prescaler=71;//系统主频72M,这里分频71,相当于1000K 的定时器2时钟TIM_TimeBaseStructure.TIM_ClockDivision=0x0;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(ADC_GetCalibrationStatus(ADC1));
//使能ADC1软件开始转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//配置ADC时钟=PCLK2 1/6 12MHz
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//开启DMA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//配置DMA中断
NVIC_Config();
//设置DMA源:地址
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1 -> DR;
uint32_t SendBuff;
extern float ADC_Received;
extern uint8_t ADC_Received2[11];
//描述:DMA串口的初始化配置
void DMA_Config(void)
{
//初始化结构体
DMA_InitTypeDef DMA_InitStructure;
ADC_Received1 = ADC_Received * 1000000000;
ADC_Received2[0]=(ADC_Received1/1000000000 + 0x30);
//usart_putchar(0x2e);
ADC_Received2[1]=(ADC_Received1%1000000000/100000000 + 0x30);
uint32_t ADC_Received1;
uint8_t ADC_Received2[11];
//printf函数重新定向,方便在程序中使用
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (unsigned char) ch);
while (!(USART1->SR & USART_FLAG_TXE));
ADC_Received2[5]=(ADC_Received1%1000000000%100000000%10000000%1000000%100000/10000 + 0x30);
ADC_Received2[6]=(ADC_Received1%1000000000%100000000%10000000%1000000%100000%10000/1000 + 0x30);
ADC_Received2[9]=(ADC_Received1%10 + 0x30);
ADC_Received2[10]=0x0d;
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
//delay_ms(1000);
//USART_DMACmd(USART1, USART_DMAReq_Tx, DISABLE);
//while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
//usart_putchar('\r');
//usart_putchar('\n');
//usart_putchar(0x0d);
//usart_putchar(0x0a);
//printf("\r");
//printf("\n");
//printf("\r\n V = %fv\r\n",ADC_Received);
}
}
#include "ADC1.h"
void ADC1_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_Received2[7]=(ADC_Received1%1000000000%100000000%10000000%1000000%100000%10000%1000/100 + 0x30);
ADC_Received2[8]=(ADC_Received1%1000000000%100000000%10000000%1000000%100000%10000%1000%100/10 + 0x30);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA , &GPIO_InitStructure);
}
#include "DMA1.h"
/*其他函数里USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);*/
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;;//ADC转换工作在连续模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
//*内存地址(要传输的变量的指针)
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_Received2;
ADC_Received2[2]=(ADC_Received1%1000000000%100000000/10000000 + 0x30);
ADC_Received2[3]=(ADC_Received1%1000000000%100000000%10000000/1000000 + 0x30);
ADC_Received2[4]=(ADC_Received1%1000000000%100000000%10000000%1000000/100000 + 0x30);
//*DMA模式:一次传输/循环
//DMA_Mode_Circular工作在循环缓存模式
// DMA_Mode_Normal工作在正常缓存模式
// DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为通道1
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
//ADC1选择信道0,顺续等级1,采样时间239.5个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5);
//*内存地址(要传输的变量的指针)
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&SendBuff;
//外设作为数据传输的来源
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//指定DMA通道的DMA缓存的大小,单位为数据单位。
ADC1_Gpio_Config();
ADC_DeInit(ADC1); //复位ADC1,将外设ADC1的全部寄存器重设为缺省值
// ADC1配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//使能扫描
return (ch);
}
void usart_putchar(uint8_t ch)
{
USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
int main()
{
ADC1_Config();
//****************************************************///
//****************************************************///
//设置DMA源:地址
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1 -> DR;
DMA_InitStructure.DMA_BufferSize = 1;
//*外设地址不增
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//*内存地址不增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_Config();
USART1_Config();
while(1)
{
//ADC_Received = (float)ADC_GetConversionValue(ADC1)*3.3/4069;
//ADC_Received1 = ADC_Received * 1000000000;