STM32通过DMA采集多通道AD

发布者:灵感狂舞最新更新时间:2016-12-19 来源: eefocus关键字:STM32  DMA采集  多通道AD 手机看文章 扫描二维码
随时随地手机看文章

环境:

主机:XP

开发环境:MDK4.23

MCU:STM32F103CBT6


说明:

通过脚PA1,PA2采集AD。每路AD采集10次。


源代码:



  1. #include "ad_driver.h"  

  2.   

  3. //全局变量  

  4. //AD采样存放空间  

  5. __IO uint16_t ADCConvertedValue[20];  

  6.   

  7. //函数  

  8. //初始化AD  

  9. void init_ad(void)  

  10. {  

  11.     ADC_InitTypeDef ADC_InitStructure;  

  12.     DMA_InitTypeDef DMA_InitStructure;  

  13.     GPIO_InitTypeDef GPIO_InitStructure;  

  14.   

  15.     //---------------------充电AD初始化--------------------  

  16.     //启动DMA时钟  

  17.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  

  18.   

  19.     //启动ADC1时钟  

  20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  

  21.   

  22.     //采样脚设置  

  23.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  

  24.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;  

  25.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  

  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);  

  27.   

  28.     //DMA1通道1配置  

  29.     DMA_DeInit(DMA1_Channel1);  

  30.     //外设地址  

  31.     DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;  

  32.     //内存地址  

  33.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;  

  34.     //dma传输方向单向  

  35.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  

  36.     //设置DMA在传输时缓冲区的长度  

  37.     DMA_InitStructure.DMA_BufferSize = 20;  

  38.     //设置DMA的外设递增模式,一个外设  

  39.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  

  40.     //设置DMA的内存递增模式  

  41.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

  42.     //外设数据字长  

  43.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  

  44.     //内存数据字长  

  45.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  

  46.     //设置DMA的传输模式:连续不断的循环模式  

  47.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  

  48.     //设置DMA的优先级别  

  49.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;  

  50.     //设置DMA的2个memory中的变量互相访问  

  51.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

  52.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);  

  53.       

  54.     //使能通道1  

  55.     DMA_Cmd(DMA1_Channel1, ENABLE);  

  56.   

  57.     //ADC1配置  

  58.     //独立工作模式  

  59.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  

  60.     //扫描方式  

  61.     ADC_InitStructure.ADC_ScanConvMode = ENABLE;  

  62.     //连续转换  

  63.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  

  64.     //外部触发禁止  

  65.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  

  66.     //数据右对齐  

  67.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  

  68.     //用于转换的通道数  

  69.     ADC_InitStructure.ADC_NbrOfChannel = 2;  

  70.     ADC_Init(ADC1, &ADC_InitStructure);  

  71.       

  72.     //规则模式通道配置  

  73.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5);  

  74.     ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 2, ADC_SampleTime_239Cycles5);  

  75.       

  76.     //使能ADC1的DMA  

  77.     ADC_DMACmd(ADC1, ENABLE);  

  78.       

  79.     //使能ADC1  

  80.     ADC_Cmd(ADC1, ENABLE);  

  81.       

  82.     //使能ADC1复位校准寄存器    

  83.     ADC_ResetCalibration(ADC1);  

  84.     //检查校准寄存器是否复位完毕  

  85.     while(ADC_GetResetCalibrationStatus(ADC1));  

  86.       

  87.     //开始校准  

  88.     ADC_StartCalibration(ADC1);  

  89.     //检测是否校准完毕  

  90.     while(ADC_GetCalibrationStatus(ADC1));  

  91.        

  92.     //开启ADC1的软件转换  

  93.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);  

  94. }  

  95.   

  96. //获得充电电压  

  97. float voltage_charge(void)  

  98. {  

  99.     uint8_t i = 0;  

  100.     uint16_t sum = 0;  

  101.     float v = 0;  

  102.   

  103.     //取得10次充电电压平均值  

  104.     for (i = 0;i < 10;i++)  

  105.     {  

  106.         sum += ADCConvertedValue[i * 2];   

  107.     }  

  108.     sum /= 10;  

  109.     //变换成电压值  

  110.     v = 0.002991 * sum;  

  111.   

  112.     return v;  

  113. }  

  114.   

  115. //获得放电电压  

  116. float voltage_discharge(void)  

  117. {  

  118.     uint8_t i = 0;  

  119.     uint16_t sum = 0;  

  120.     float v = 0;  

  121.   

  122.     //取得10次充电电压平均值  

  123.     for (i = 0;i < 10;i++)  

  124.     {  

  125.         sum += ADCConvertedValue[i * 2 + 1];   

  126.     }  

  127.     sum /= 10;  

  128.     //变换成电压值  

  129.     v = 0.002991 * sum;  

  130.   

  131.     return v;  

  132. }  



关键字:STM32  DMA采集  多通道AD 引用地址:STM32通过DMA采集多通道AD

上一篇:STM32单片机用FSMC接口控制SRAM
下一篇:STM32单片机PWM输出测试

推荐阅读最新更新时间:2024-03-16 15:26

stm32: 向flash写入数据
1、向flash写入数据,首先根据写入地址、数据字节数,对数据分页,再调用页写入函数,写入flash。 2、数据分页函数代码: 2.1 函数参数: pbuff:写入flash的数据指针 addr:写入flash的地址 num:写入flash的数据字节数 2.2函数代码: void spi_flash_write(uint8_t* pbuff,uint32_t addr,uint16_t num) { uint8_t temp; // 定义分页参数 uint8_t numofpage,numofsingle; //定义页地址参数 uint8_t pageaddr
[单片机]
stm32的时钟设定
时钟图 // RCC_HSEConfig(RCC_HSE_OFF); // 关闭外部时钟 // RCC_HSEConfig(RCC_HSE_ON); // 开启外部时钟 // RCC_HSICmd(ENABLE); // 开启内部时钟 // RCC_HSICmd(DISABLE); // 开启内部时钟 // 双高级外设总线结构:高速APB(APB2)速度达到72MHz、低速APB(APB1)速度达到36MHz。 // 允许用户优化外设的使用(18MHz的SPI、4.5Mbps的USART、72MHz的PWM定时器、18MHz触发I/O口)。 // RCC_PLLCo
[单片机]
STM32学习之CAN控制器简介
1、STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下: 支持CAN协议2.0A和2.0B主动模式 波特率最高达1Mbps 支持时间触发通信 具有3个发送邮箱 具有3级深度的2个接收FIFO 可变的筛选器组(也称过滤器组,最多28个) 2、STM32 CAN控制器简介-模式 ①初始化模式(INRQ=1,SLEEP=0) ②正常模式(INRQ=0,SLEEP=0) ③睡眠模式(SLEEP=1) 测试模式 ①静默模式( LBKM=0,SILM=1 ) ②环回模式( LBKM=1,SILM=0 ) ③环回静默模式(LBKM=1,SILM=1
[单片机]
STM32 F7如何满足嵌入式系统更高处理性能需求
  意法半导体(ST)日前宣布推出业界首款基于ARM最新Cortex-M7内核的STM32 F7系列微控制器,其性能远超ST之前的32位STM32F4微控制器,通过无缝升级路径可将处理性能和DSP性能提高一倍。   “作为STM32微控制器产品家族的高端产品,STM32 F7使内存和外存的性能达到一个新的水平,给开发人员带来新的创新机会,保证他们不需要再根据存储器性能调整代码。”ST微控制器市场总监Daniel Colonna表示,“而之所以能够在业内率先推出基于Cortex-M7的产品,首先得益于ST与ARM密切的合作关系。其次,ST也与第三方客户保持着广泛的合作,确保他们能够及时得到ARM最新的技术支持并推出新产品。强大的
[电源管理]
<font color='red'>STM32</font> F7如何满足嵌入式系统更高处理性能需求
解决低功耗之后无法下载程序
问题背景: 在调试低功耗的时候,错误的将单片机一上电就进入低功耗,通过外部复位引脚让其复位,虽然可以成功,但是立马又进入了低功耗,唤醒的时间太短,毫无卵用。 解决办法: 因为单片机烧写的SWD口一直接的都是 VCC SWCLK SWDIO GND,想起来JLINK上面是有复位引脚的,所以找出来把它接到了单片机的外部复位引脚上即可解决。 结果:
[单片机]
解决低功耗之后无法下载程序
关于STM32中的assert_param()
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义; 在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。 所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。 这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。 它确实在程序的运行上牺牲了效率(但
[单片机]
STM32常见的串行通信接口
通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。 串行通信的分类 1、按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。 2、按照通信方式,分为: 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。 异步通信:不带时钟同步信号。比
[单片机]
<font color='red'>STM32</font>常见的串行通信接口
STM32的硬件I2C设计有BUG
坊间一直流传着一个传说~STM32的硬件I2C设计有BUG,最好不要用,用软件I2C比较靠谱。长久以来,为了不必要的麻烦,我也一直没有用过硬件I2C,主要是软件I2C也比较方便,基本上任意端口都可以用。 最近画了块板子,正好用到了I2C,就顺便来测试一下硬件I2C是不是真的像有些人说的不好用。 测试硬件:STM32F407VET6+AT24C64测试软件:STM32CubeMX v6.1.1HAL库:STM32CubeF4 Firmware Package V1.25.2 STM32CubeMX配置 使用STM32CubeMX配置很方便,时钟等基础配置不再详细介绍,直接看I2C配置如下: 这里的速度模式选择为标准模式,
[单片机]
<font color='red'>STM32</font>的硬件I2C设计有BUG
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved