找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3369|回复: 5
打印 上一主题 下一主题
收起左侧

STM32 ADC+DMA 读取供电电压值与内部温度传感器值.两路连续转换模式

[复制链接]
跳转到指定楼层
楼主
ID:326783 发表于 2019-9-24 22:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC读取供电电压值与内部温度传感器值.两路连续转换模式.

vc_adc.c
  1. #include "vc_adc.h"
  2. //__IO u16 ADC_ConvertedValue[4][2];
  3. u16 ADC_ConvertedValue[4][2];
  4. /* 这里的ADC是暂时用来试验两路AD转换,一路是测量电压,另一路是读取内部温度值
  5. ** 暂时是用来测试的,以后测量电流一路.*/
  6. void Vc_AdcInit(void){
  7.   GPIO_InitTypeDef  GPIO_InitStructure;
  8.   ADC_InitTypeDef   ADC_InitStructure;
  9.   RCC_APB2PeriphClockCmd (RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA ,ENABLE );
  10.   RCC_ADCCLKConfig (RCC_PCLK2_Div6 ); /* 72M/6=12M */
  11.   
  12.   GPIO_InitStructure .GPIO_Mode = GPIO_Mode_AIN ;
  13.   GPIO_InitStructure .GPIO_Pin = VADC_PIN; // | CADC_PIN 这里暂时先检测电压这一路;
  14.   /* 因为是输入,所以不需要设置速度 */
  15.   GPIO_Init (ADC_PORT ,&GPIO_InitStructure );
  16.   ADC_DeInit (ADC1 );
  17.   ADC_InitStructure .ADC_Mode = ADC_Mode_Independent ;  /* ADC独立模式 */
  18.   //ADC_InitStructure .ADC_ScanConvMode = DISABLE ; /* 单通道模式*/
  19.   ADC_InitStructure .ADC_ScanConvMode = ENABLE ;    /* 多通道模式*/
  20.   //ADC_InitStructure .ADC_ContinuousConvMode = DISABLE ; /* 单次模式*/
  21.   ADC_InitStructure .ADC_ContinuousConvMode = ENABLE ;  /* 连续模式*/
  22.   ADC_InitStructure .ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
  23.   ADC_InitStructure .ADC_DataAlign = ADC_DataAlign_Right ;
  24.   ADC_InitStructure .ADC_NbrOfChannel = 2;  /* 设置ADC路数为2路*/
  25.   ADC_Init (ADC1, &ADC_InitStructure );
  26.   ADC_TempSensorVrefintCmd (ENABLE );
  27.   ADC_RegularChannelConfig (ADC1 ,ADC_Channel_4 , 1, ADC_SampleTime_239Cycles5);  /* 规则通道1*/
  28.   ADC_RegularChannelConfig (ADC1 ,ADC_Channel_16 ,2, ADC_SampleTime_239Cycles5);  /* 规则通道2*/
  29.   ADC_DMACmd (ADC1 ,ENABLE );
  30.   ADC_Cmd (ADC1 ,ENABLE );
  31.   ADC_ResetCalibration (ADC1 );
  32.   while(ADC_GetResetCalibrationStatus (ADC1));
  33.   ADC_StartCalibration (ADC1 );
  34.   while(ADC_GetCalibrationStatus (ADC1 ));
  35.   ADC_SoftwareStartConvCmd (ADC1 ,ENABLE );
  36. }
  37. void DMA_Config(void){
  38.   
  39.   DMA_InitTypeDef DMA_InitStructure;
  40.   RCC_AHBPeriphClockCmd (RCC_AHBPeriph_DMA1 ,ENABLE );
  41.   DMA_DeInit (DMA1_Channel1);
  42.   DMA_InitStructure .DMA_PeripheralBaseAddr = (u32)&(ADC1 ->DR);
  43.   DMA_InitStructure .DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue ;
  44.   DMA_InitStructure .DMA_DIR = DMA_DIR_PeripheralSRC ; /* 外设作为数据来源*/
  45.   DMA_InitStructure .DMA_BufferSize =
  46.   DMA_InitStructure .DMA_PeripheralInc = DMA_PeripheralInc_Disable ;  /* 外设地址固定*/
  47.   DMA_InitStructure .DMA_MemoryInc = DMA_MemoryInc_Enable ; /* 内存地址增加*/
  48.   DMA_InitStructure .DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ; /* 16bit*/
  49.   DMA_InitStructure .DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;
  50.   DMA_InitStructure .DMA_Mode = DMA_Mode_Circular ;
  51.   DMA_InitStructure .DMA_Priority = DMA_Priority_High ;
  52.   DMA_InitStructure .DMA_M2M = DMA_M2M_Disable ;
  53.   DMA_Init (DMA1_Channel1 ,&DMA_InitStructure );
  54.   
  55.   DMA_Cmd (DMA1_Channel1 ,ENABLE );
  56. }

复制代码

vc_adc.h
  1. #ifndef _vc_adc_H
  2. #define _vc_adc_H
  3. #include "stm32f10x.h"
  4. /*电压ADC--PA4(ADC12-IN$)
  5. **电流ADC--PA3(ADC12-IN3)
  6. */
  7. #define VADC_PIN  GPIO_Pin_4
  8. #define CADC_PIN  GPIO_Pin_3
  9. #define ADC_PORT  GPIOA
  10. extern void Vc_AdcInit(void);
  11. extern void DMA_Config(void);


  12. #endif
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
ID:379993 发表于 2020-11-23 08:35 | 只看该作者
那个dma传输数据长度需要,填二维数组的长度吗?
回复

使用道具 举报

板凳
ID:195666 发表于 2023-6-16 11:36 | 只看该作者
2个文件,不是工程
回复

使用道具 举报

地板
ID:101305 发表于 2023-6-17 11:59 | 只看该作者
这代码能用?配置环境是怎样的?
回复

使用道具 举报

5#
ID:101305 发表于 2023-6-17 12:00 | 只看该作者
这代码能用,能不能详细把配置环境也贴出来
回复

使用道具 举报

6#
ID:1102070 发表于 2024-2-7 23:24 来自手机 | 只看该作者
这里有
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表