OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5587|回复: 4

给大家分享ADC+DMA采集/STM32H743IIT6

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-20
在线时间
11 小时
发表于 2020-12-7 21:54:55 | 显示全部楼层 |阅读模式
主要有一个问题大家一定要注意,如果你要是使用Cache的时候一定要注意数据位对齐
当然在这个上面也是有相关的程序设计的,如果你要是想要的话可以回复你的邮箱地址我给你相关的代码设置
因为上面的是没有的如果你没有用Cache的时候是完美的
给大家填一下相关的代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-20
在线时间
11 小时
 楼主| 发表于 2020-12-7 22:00:28 | 显示全部楼层
#include "adc.h"
#include "delay.h"
#include "dma.h"
DMA_HandleTypeDef hdma_adc1;//¶¨ÒåDMA¾ä±ú
ADC_HandleTypeDef ADC1_Handle;
u16 ADC_ConvertedValue[2];
//DMAxµÄ¸÷ͨµÀÅäÖÃ
//ÕâÀïµÄ´«ÊäÐÎʽÊǹ̶¨µÄ,ÕâµãÒª¸ù¾Ý²»Í¬µÄÇé¿öÀ´ÐÞ¸Ä
//´Ó´æ´¢Æ÷->ÍâÉèģʽ/8λÊý¾Ý¿í¶È/´æ´¢Æ÷ÔöÁ¿Ä£Ê½
//DMA_StreamxMAÊý¾ÝÁ÷,DMA1_Stream0~7/DMA2_Stream0~7
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx)
{

        if((u32)DMA_Streamx>(u32)DMA2)//µÃµ½µ±Ç°streamÊÇÊôÓÚDMA2»¹ÊÇDMA1
        {
        __HAL_RCC_DMA2_CLK_ENABLE();//DMA2ʱÖÓʹÄÜ       
        }else
        {
        __HAL_RCC_DMA1_CLK_ENABLE();//DMA1ʱÖÓʹÄÜ
        }  
                if(HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    {}
    __HAL_LINKDMA(&ADC1_Handle,DMA_Handle,hdma_adc1); //j½«DMAÓëADCÁ¬½ÓÆðÀ´
    hdma_adc1.Instance = DMA1_Stream1; /* ʹÓõÄDMA1 Stream1 */
    hdma_adc1.Init.Request = DMA_REQUEST_ADC1;/* ÇëÇóÀàÐͲÉÓÃDMA_REQUEST_ADC1 */  
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; /* ´«Êä·½ÏòÊÇ´Ó´æ´¢Æ÷µ½ÍâÉè */  
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; /* ÍâÉèµØÖ·×ÔÔö½ûÖ¹ */
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; /* ´æ´¢Æ÷µØÖ·×ÔÔöʹÄÜ */  
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc1.Init.Mode = DMA_CIRCULAR;/* Ñ­»·Ä£Ê½ */   
    hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; /* ÓÅÏȼ¶µÍ */  
    hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* ½ûÖ¹FIFO*/
   
        if(HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    {}
    __HAL_LINKDMA(&ADC1_Handle,DMA_Handle,hdma_adc1); //j½«DMAÓëADCÁ¬½ÓÆðÀ´
}
void MY_ADC1_Init(void)
{
         ADC_ChannelConfTypeDef ADC_Config;
                MYDMA_Config(DMA1_Stream1);
         ADC1_Handle.Instance = ADC1;
         ADC1_Handle.Init.Resolution            = ADC_RESOLUTION_16B;        /* 16λ·Ö±æÂÊ */
         ADC1_Handle.Init.ScanConvMode          = ADC_SCAN_ENABLE;           /* ½ûֹɨÃ裬ÒòΪ½ö¿ªÁËÒ»¸öͨµÀ */
         ADC1_Handle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;       /* EOCת»»½áÊø±êÖ¾ */
         ADC1_Handle.Init.LowPowerAutoWait      = DISABLE;                   /* ½ûÖ¹µÍ¹¦ºÄ×Ô¶¯ÑÓ³ÙÌØÐÔ */
   ADC1_Handle.Init.ContinuousConvMode    = ENABLE;                    /* ½ûÖ¹×Ô¶¯×ª»»£¬²ÉÓõÄÈí¼þ´¥·¢ */
         ADC1_Handle.Init.NbrOfConversion       = 2;                         /* ʹÓÃÁË4¸öת»»Í¨µÀ */
         ADC1_Handle.Init.DiscontinuousConvMode = DISABLE;                   /* ½ûÖ¹²»Á¬Ðøģʽ */
         ADC1_Handle.Init.NbrOfDiscConversion   = 1;                         /* ½ûÖ¹²»Á¬Ðøģʽºó£¬´Ë²ÎÊýºöÂÔ£¬´ËλÊÇÓÃÀ´ÅäÖò»Á¬Ðø×Ó×éÖÐͨµÀÊý */
         ADC1_Handle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;        /* ²ÉÓÃÈí¼þ´¥·¢ */
         ADC1_Handle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_RISING;    /* ²ÉÓÃÈí¼þ´¥·¢µÄ»°£¬´ËλºöÂÔ */
         ADC1_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; /* DMAÑ­»·Ä£Ê½½ÓÊÕADCת»»µÄÊý¾Ý */
         ADC1_Handle.Init.BoostMode             = ENABLE;                            /* ADCʱÖÓµÍÓÚ20MHzµÄ»°£¬¿ÉÒÔ½ûÖ¹boost */
         ADC1_Handle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;                /* ADCת»»Òç³öµÄ»°£¬¸²¸ÇADCµÄÊý¾Ý¼Ä´æÆ÷ */
         ADC1_Handle.Init.OversamplingMode      = DISABLE;                            /* ½ûÖ¹¹ý²ÉÑù */
    HAL_ADC_Init(&ADC1_Handle);                                                                                //??? ADC1            
        /*PA6¶Ë¿ÚµÄADC*/
                HAL_ADCEx_Calibration_Start(&ADC1_Handle,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADCУ׼
    ADC_Config.Channel = ADC_CHANNEL_3;                         /* ÅäÖÃʹÓõÄADCͨµÀ */
    ADC_Config.Rank = ADC_REGULAR_RANK_1; /* ²ÉÑùÐòÁÐÀïµÄµÚ1¸ö */
    ADC_Config.SamplingTime = ADC_SAMPLETIME_64CYCLES_5; /* ²ÉÑùÖÜÆÚ */
    ADC_Config.SingleDiff = ADC_SINGLE_ENDED ;   /* µ¥¶ËÊäÈë */     
    ADC_Config.Offset=0; /* ÎÞÆ«ÒƵÄÇé¿öÏ£¬´Ë²ÎÊýºöÂÔ */
                ADC_Config.OffsetRightShift       = DISABLE;           /* ½ûÖ¹ÓÒÒÆ */
    ADC_Config.OffsetSignedSaturation = DISABLE;           /* ½ûÖ¹ÓзûºÅ±¥ºÍ */
    HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);  /*ʹÄÜADC */
                /*PA4¶Ë¿ÚµÄADC*/
                 ADC_Config.Channel = ADC_CHANNEL_7;                         /* ÅäÖÃʹÓõÄADCͨµÀ */
    ADC_Config.Rank = ADC_REGULAR_RANK_2; /* ²ÉÑùÐòÁÐÀïµÄµÚ1¸ö */
    ADC_Config.SamplingTime = ADC_SAMPLETIME_64CYCLES_5; /* ²ÉÑùÖÜÆÚ */
    ADC_Config.SingleDiff = ADC_SINGLE_ENDED ;   /* µ¥¶ËÊäÈë */     
    ADC_Config.Offset=0; /* ÎÞÆ«ÒƵÄÇé¿öÏ£¬´Ë²ÎÊýºöÂÔ */
                ADC_Config.OffsetRightShift       = DISABLE;           /* ½ûÖ¹ÓÒÒÆ */
    ADC_Config.OffsetSignedSaturation = DISABLE;           /* ½ûÖ¹ÓзûºÅ±¥ºÍ */
    HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);  /*ʹÄÜADC */

    ADC_Enable(&ADC1_Handle);
    HAL_ADC_Start_DMA(&ADC1_Handle, (uint32_t *)ADC_ConvertedValue, 2);
   
}
//ADCµ×²ãÇý¶¯£¬Òý½ÅÅäÖã¬Ê±ÖÓʹÄÜ
//´Ëº¯Êý»á±»HAL_ADC_Init()µ÷ÓÃ
//hadc:ADC¾ä±ú
void  HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
         GPIO_InitTypeDef GPIO_Initure;
        __HAL_RCC_ADC12_CLK_ENABLE();                        //¿ªÆôADC12ʱÖÓ   
        __HAL_RCC_GPIOA_CLK_ENABLE();           //¿ªÆôGPIOAʱÖÓ
        __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP); //ADCÍâÉèʱÖÓÑ¡Ôñ

       GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7;    //PA6,PA4,PA7
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;      //????
    GPIO_Initure.Pull=GPIO_NOPULL;        //????
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;     //??
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
              
        HAL_ADCEx_Calibration_Start(&ADC1_Handle,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC ??
        
        HAL_NVIC_EnableIRQ( ADC_IRQn );                                //??ADC_IRQn????
        HAL_NVIC_SetPriority( ADC_IRQn ,0,0);                        //?????0,????0
}
void my_GetAdcValues(void)
{
    float AdcValues[2];
    /*
       ʹÓô˺¯ÊýÒªÌرð×¢Ò⣬µÚ1¸ö²ÎÊýµØÖ·Òª32×Ö½Ú¶ÔÆ룬µÚ2¸ö²ÎÊýÒªÊÇ32×Ö½ÚµÄÕûÊý±¶
    */
    SCB_InvalidateDCache_by_Addr((uint32_t *)ADC_ConvertedValue,  sizeof(ADC_ConvertedValue));
    AdcValues[0] =ADC_ConvertedValue[0] * 3.3 / 65536;
    AdcValues[1] = ADC_ConvertedValue[1] * 3.3 / 65536;   
   
    printf("AdcValues[0]  = %5.3fV, AdcValues[0]  = %5.3fV\r\n",  AdcValues[0],  AdcValues[1]);

}

回复 支持 0 反对 1

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-20
在线时间
11 小时
 楼主| 发表于 2020-12-7 21:55:25 | 显示全部楼层
想要相关代码的可以回复我
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2021-6-9
在线时间
18 小时
发表于 2021-7-16 21:36:29 | 显示全部楼层
嗒嗒娃娃 发表于 2020-12-7 21:55
想要相关代码的可以回复我

问一下,关于stm32h743的ADC+DMA采集可以分享给我吗?我的邮箱是3469632460@qq.com
谢谢
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-20
在线时间
11 小时
 楼主| 发表于 2021-8-5 09:50:17 | 显示全部楼层
zhangfuming 发表于 2021-7-16 21:36
问一下,关于stm32h743的ADC+DMA采集可以分享给我吗?我的邮箱是3469632460@qq.com
谢 ...

上面就是他的代码吧
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 05:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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