stm32_DMA采集一个AD数据_并通过DMA向串口发送

这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影。关于dma网上有许多的资料,关于dma采集ad网上也有很多。亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但是自己本身打字就慢,还有好多事情要做!代码是我亲自都在板子上测试过的,,当然粘贴/复制过去可能也不会尽如人意,知识这东西总是有许多道不清说不明的东西在里头,往往总是不经一番彻骨寒,哪得梅花扑鼻香。推荐一本书吧!这是野火出的。

这本书自从在图书馆借来就从来没有再放回去,总是在续借。像是在打广告了

#include <stm32f10x.h>
#include "ADC1.h"
#include "DMA1.h"
#include "USART1.h"
#include "time.h"
#include "stdio.h"extern uint32_t SendBuff;
float ADC_Received;
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)); 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_Config();USART1_Config();while(1){//      ADC_Received = (float)ADC_GetConversionValue(ADC1)*3.3/4069;
//      ADC_Received1 = ADC_Received * 1000000000;
     ADC_Received = (float)SendBuff*3.3/4069;ADC_Received1 = ADC_Received * 1000000000;ADC_Received2[0]=(ADC_Received1/1000000000 + 0x30);//usart_putchar(0x2e); ADC_Received2[1]=(ADC_Received1%1000000000/100000000 + 0x30);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);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[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); 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);
//      delay_ms(1000);
//     ADC_Received = (float) SendBuff/4069*3.3;//      ADC_Received = (u16)ADC1 -> DR;
//      ADC_Received = (float)ADC_Received/4069*3.3;
//      printf("\r\n v = %f V \r\n",ADC_Received);
//        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);ADC1_Gpio_Config();ADC_DeInit(ADC1); //复位 ADC1,将外设 ADC1 的全部寄存器重设为缺省值// ADC1 配置ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在独立模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;//使能扫描ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;;//ADC转换工作在连续模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为通道1ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC //ADC1选择信道0,顺续等级1,采样时间239.5个周期ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5);    //打开ADC1
  ADC_Cmd(ADC1, ENABLE);//重置ADC1校准寄存器 
  ADC_ResetCalibration(ADC1); //等待ADC1校准重置完成while(ADC_GetResetCalibrationStatus(ADC1));  //开始ADC1校准
  ADC_StartCalibration(ADC1); //等待ADC1校准完成while(ADC_GetCalibrationStatus(ADC1)); //使能ADC1软件开始转换
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);//配置ADC时钟=PCLK2 1/6    12MHz
  RCC_ADCCLKConfig(RCC_PCLK2_Div6); //使能ADC1模块DMA
  ADC_DMACmd(ADC1, ENABLE); 
}static void ADC1_Gpio_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);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);     */
uint32_t  SendBuff;
extern float ADC_Received;
extern uint8_t ADC_Received2[11];
//描述  :DMA 串口的初始化配置void DMA_Config(void)
{//初始化结构体
    DMA_InitTypeDef DMA_InitStructure;//开启DMA时钟
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);    //配置DMA中断
      NVIC_Config();                   //设置DMA源:地址
     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1 -> DR;      //*内存地址(要传输的变量的指针)DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&SendBuff;//外设作为数据传输的来源DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;    //指定 DMA 通道的 DMA 缓存的大小,单位为数据单位。DMA_InitStructure.DMA_BufferSize = 1;//*外设地址不增        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //*内存地址不增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;    //*外设数据单位数据宽度为 16 位DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//*内存数据单位数据宽度为 16 位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;     //*DMA模式:一次传输/循环
//         DMA_Mode_Circular 工作在循环缓存模式
//    DMA_Mode_Normal 工作在正常缓存模式
//     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        //*优先级:高DMA_InitStructure.DMA_Priority = DMA_Priority_High;  //*禁止内存到内存的传输    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//*配置DMA1的1通道           DMA_Init(DMA1_Channel1, &DMA_InitStructure); //使能DMA
      DMA_Cmd (DMA1_Channel1,ENABLE);//配置DMA发送完成后产生中断        
//       DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //****************************************************///
//****************************************************///
//****************************************************/////设置DMA源:地址DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1 -> DR;      //*内存地址(要传输的变量的指针)DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_Received2;//外设作为数据传输的目的地DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;    //指定 DMA 通道的 DMA 缓存的大小,单位为数据单位。DMA_InitStructure.DMA_BufferSize = 11;//*外设地址不增        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //*内存地址不增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    //*外设数据单位数据宽度为 16 位DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//*内存数据单位数据宽度为 16 位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;     //*DMA模式:一次传输/循环
//         DMA_Mode_Circular 工作在循环缓存模式
//    DMA_Mode_Normal 工作在正常缓存模式
//     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        //*优先级:中DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  //*禁止内存到内存的传输    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//*配置DMA1的4通道           DMA_Init(DMA1_Channel4, &DMA_InitStructure); //使能DMA
      DMA_Cmd (DMA1_Channel4,ENABLE);//配置DMA发送完成后产生中断        
//       DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);  
}
#include "time.h"/****************
延时多少个 1/72 us
****************/
void delay_1_72us(uint32_t time)
{SysTick -> LOAD = (u32) time; //定时器赋初值       
    SysTick -> CTRL = 0x00000005; //选择72MHz 并 打开定时器while(!(SysTick -> CTRL & 0x00010000));//等待计数到零
SysTick -> CTRL = 0x00000004;//关闭定时器
    
}void delay_ms(u32 time)
{while(time -- ){delay_1_72us(72000);}}
#include "USART1.h"//描述  :USART1 GPIO 配置,工作模式配置。115200 8-N-1void USART1_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开  USART1 的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// USART1 Tx (PA_9) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);    // USART1 Tx (PA_10) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);/* USART1 mode config */USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); 
}

 

转载于:https://www.cnblogs.com/yangfengwu/p/5297147.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT综合示例:QT串口通信

QT综合示例&#xff1a;QT串口通信0、界面&#xff1a;1、代码&#xff1a;如果用qt写程序作为上位机&#xff0c;然后通过和usb和下位机通信的时候&#xff0c;就需要用到qt中的串口通信了。 0、界面&#xff1a; 1、代码&#xff1a; 1&#xff09;.pro 添加&#xff1a; …

MATLAB GUI如何制作下拉列表

MATLAB在GUI中可以实现下图所示的下拉列表&#xff1a; 方法&#xff1a; 在MATLAB中输入guide打开一个现有的GUI或者新建一个GUI放置一个弹出式菜单&#xff0c;如图所示双击新建的弹出式菜单&#xff0c;打开检查器&#xff0c;点击检查器的“string”菜单栏右侧的按钮&…

如果每个人都是一个粒子…… | 从物理学中寻找社会规律

来源&#xff1a;环球科学人类的许多社会行为似乎是难以捉摸的&#xff0c;包括经济、交通、个人选择。不少科学家尝试从物理的角度解释人类社会&#xff0c;他们将人比作粒子&#xff0c;每个个体之间的行为、选择都会互相影响。就像物理粒子会受到不同类型的力的控制&#xf…

猎豹MFC--文件对话框CFileDialog

如下叫做打开文件对话框&#xff1a;CFileDialog类在对话框上添加文本框&#xff0c;接收回车键设置&#xff0c;多行&#xff0c;编辑修改ID&#xff0c;垂直滚动条 水平滚动条 属性设置。添加菜单资源&#xff1a;这个菜单是给主窗口使用的&#xff0c;所以在主窗口对话框属…

MATLAB的GUI界面不显示XY坐标轴

在GUI中创建一个坐标轴&#xff0c;默认会显示XY坐标&#xff0c;如下图&#xff1a; 如何关闭XY坐标轴呢&#xff1f; 首先在打开GUI界面&#xff0c;双击该坐标轴&#xff0c;在Xcolor和Ycolor中选择白色&#xff0c;将坐标轴设置为白色&#xff1a; 然后在xticklabel和ytic…

机器人工作原理的超详细解析,生动、形象!

来源&#xff1a;笑看国际风云很多人一听到“机器人”这三个字脑中就会浮现“外形酷炫”、“功能强大”、“高端”等这些词&#xff0c;认为机器人就和科幻电影里的“终结者”一样高端炫酷。其实不然&#xff0c;在本文中&#xff0c;我们将探讨机器人学的基本概念&#xff0c;…

数字图像处理:图像变换的基本模型

数字图像处理&#xff1a;图像变换的基本模型 一、常用图象的变换模型 变换模型是指根据待匹配图像与背景图像之间几何畸变的情况&#xff0c;所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视变换和非线形变换等&am…

Nginx 的线程池与性能剖析【转载】

正如我们所知&#xff0c;NGINX采用了异步、事件驱动的方法来处理连接。这种处理方式无需&#xff08;像使用传统架构的服务器一样&#xff09;为每个请求创建额外的专用进程或者线程&#xff0c;而是在一个工作进程中处理多个连接和请求。为此&#xff0c;NGINX工作在非阻塞的…

Halcon算子学习:XLD几种边缘连接函数

Halcon算子学习&#xff1a;XLD几种边缘连接函数 1.union_cotangential_contours_xld (Contours : UnionContours : FitClippingLength, FitLength, MaxTangAngle, MaxDist, MaxDistPerp, MaxOverlap, Mode : ) 根据输入的轮廓的端点处的局部曲率&#xff0c;连接曲率满足一定…

交换机与路由器大战已结束,超大规模计算公司胜出

来源&#xff1a;云头条作者&#xff1a;Timothy Prickett Morgan是The Next Platform的联合创始人兼合作编辑。很难说会先发生什么&#xff1a;交换和路由将合并&#xff0c;还是说会出现两种功能兼具的独立网络操作系统。Arrcus去年7月推出了一种可在商用芯片上同时提供交换功…

MATLAB的GUI中给坐标轴四周加上边框

在MATLAB的GUI中如何为坐标轴四边加上方框&#xff0c;效果如下图&#xff1a; 首先打开一个GUI文件&#xff0c;建立一个坐标轴&#xff0c;如下图所示&#xff1a; 双击该坐标轴&#xff0c;在弹出的检查器中&#xff0c;在Box那一栏后面勾上&#xff0c;如下图所示&#xff…

Halcon学习笔记:Halcon标定步骤-3d_coordinates.hdev示例

Halcon标定步骤 1.设置相机内部参数的初始值 StartCamPar : [0.016,0,0.0000074,0.0000074,326,247,652,494] set_calib_data_cam_param (CalibDataID, 0, ‘area_scan_division’, StartCamPar) 1.1 相机型号 &#xff08;1&#xff09;面阵&#xff08;2&#xff09;线阵…

马斯克的脑机接口能如愿以偿吗?

来源&#xff1a;都世民科学网博客摘要&#xff1a;本文主要讨论马斯克的脑机接口设备更新的要点&#xff0c;他发布的计划真能如愿以偿吗&#xff1f;可能会出现什么问题&#xff0c;将如何应对&#xff1f;是能治病&#xff0c;还是导致新的疾病&#xff1f;关键词&#xff1…

MATLAB的GUI如何清空坐标轴的图像

下面这两句即可实现清空GUI中的坐标轴 axes(handles.axes1); %指定需要清空的坐标轴 cla reset; 但假如你之前的坐标轴四周是有边框的&#xff0c;而且是没有坐标刻度和坐标值的&#xff0c;如下图所示&#xff0c;你会发现通过上面这两句代码虽然清空了坐标轴的内容&#xf…

Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例

Halcon学习笔记&#xff1a;1D Measuring一维测量_fuse.hdev灯丝测量示例 一.基本概念 基本流程为&#xff1a; 获取图像对图像进行灰度值标定 &#xff08;针对相机获取的图像灰度和输入能量之间的非线性关系&#xff0c;获得相机对输入能量的线性函数&#xff09;排列感兴趣…

尘埃落定!苹果 10 亿美元入局 5G,Intel 挥别 9 年基带业务

来源&#xff1a; 雷锋网 雷锋网消息&#xff0c;2019 年 7 月 25 日&#xff0c;苹果公司和 Intel 共同宣布&#xff0c;双方已经正式达成收购协议&#xff0c;Apple 将收购 Intel 智能手机调节解调器业务的绝大部分&#xff0c;收购价格正是此前《华尔街日报》爆料出的 10 亿…

[原创]android使用代码生成LayerDrawable的方法和注意事项

为了有更好的UI体验&#xff0c;一般我们会把button、textview等控件的背景设置上阴影。传统的做法是美工提供一张具有阴影效果的nine patch图&#xff0c;然后将其在xml文件中添加到background属性。这种做法没有问题&#xff0c;不过缺乏灵活性。 图1.使用代码生成的具有“阴…

数字图像处理:四连通域与八连通域

四连通域与八连通域 1、所谓四连通区域或四邻域&#xff0c;是指对应像素位置的上、下、左、右&#xff0c;是紧邻的位置。共4个方向&#xff0c;所以称之为四连通区域&#xff0c;又叫四邻域。 2、所谓八连通区域或八邻域&#xff0c;是指对应位置的上、下、左、右、左上、右…

深度学习奠基人特伦斯:美国学界已经找到了解释人工智能“黑盒子”的方法...

&#xff08;图片来源&#xff1a;壹图网&#xff09;来源&#xff1a;今日头条经济观察网 记者 宋笛 “是的&#xff0c;目前美国数学家已经找到了解释深度学习黑盒子的方法&#xff0c;但是还没有发表&#xff0c;所以我不能透露更多。”7月25日 &#xff0c;美国“四院院士”…

vs2013配置opencv2.4.9后出现找不到opencv_core249d.dll和opencv_highgui249d.dll问题

问题&#xff1a;vs2013配置opencv2.4.9后&#xff0c;运行程序&#xff0c;出现找不到opencv_core249d.dll和opencv_highgui249d.dll问题 解决办法&#xff1a;首先将opencv_core249d.dll&#xff1b;opencv_highgui249d.dll;opencv_imgproc249d.dll三个文件从“OpenCV的安装…