OpenEdv-开源电子网

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

stm32H743,(DMA模式)定时器6触发adc采集缓冲区不刷新?

[复制链接]

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-6-4
在线时间
13 小时
发表于 2020-6-4 15:45:42 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 韩同学叫园园 于 2020-6-4 15:54 编辑

下面是我的ADC——dma配置
当dma采用DMA_NORMAL模式时,采集的信号是正确的,但是ad的缓冲区数据不刷新?
当dma采用DMA_CIRCULAR模式时,采集的信号错误,ad缓冲区依旧不刷新?
求大神指点!!!!

/* 方便Cache类的API操作,做32字节对齐 */
#pragma location = 0x38000000     //0011 1000 0000 0000 0000 0000 0000 0000
uint16_t adc0Buffer[adCountX2];
ALIGN_32BYTES(__attribute__((section (".RAM_D3"))) uint16_t adc0Buffer[adCountX2]);

/*ADC1  DMA1_Stream1  配置*/      
void ad_dma_Config(void)
{
        __HAL_RCC_DMA1_CLK_ENABLE();
        DmaHandle.Instance                        = DMA1_Stream1;            /* 使用的DMA1 Stream1 */
        DmaHandle.Init.Request                   = DMA_REQUEST_ADC1;            /* 请求类型采用DMA_REQUEST_ADC1 */  
        DmaHandle.Init.Direction                  = DMA_PERIPH_TO_MEMORY;    /* 传输方向是从外设到存储器 */  
        DmaHandle.Init.PeriphInc                 = DMA_PINC_DISABLE;        /* 外设地址自增禁止 */
        DmaHandle.Init.MemInc                   = DMA_MINC_ENABLE;         /* 存储器地址自增使能 */  
        DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;  /* 外设数据传输位宽选择半字,即16bit */     
        DmaHandle.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;  /* 存储器数据传输位宽选择半字,即16bit */   
        DmaHandle.Init.Mode                        = DMA_CIRCULAR;            /* 循环模式 */   
        DmaHandle.Init.Priority                      = DMA_PRIORITY_HIGH;        /* 优先级高 */  

    /* 初始化DMA */
        
         HAL_DMA_DeInit(&DmaHandle);
        HAL_DMA_Init(&DmaHandle);

    /* 关联ADC句柄和DMA句柄 */
        __HAL_LINKDMA(&ADC1_Handler, DMA_Handle, DmaHandle);

}

//========================================== 初始化ADC1  PA5   ch: ADC_channels 19
void ADC1_Init(void)
{
    ADC1_Handler.Instance =ADC1;
    ADC1_Handler.Init.ClockPrescaler =ADC_CLOCK_SYNC_PCLK_DIV4;        
    ADC1_Handler.Init.Resolution =ADC_RESOLUTION_12B;                   //12位模式
    ADC1_Handler.Init.ScanConvMode =ADC_SCAN_DISABLE;                //非扫描模式
    ADC1_Handler.Init.EOCSelection =ADC_EOC_SINGLE_CONV;             //关闭EOC中断
    ADC1_Handler.Init.LowPowerAutoWait =DISABLE;                            //自动低功耗关闭                                
    ADC1_Handler.Init.ContinuousConvMode =DISABLE;                         //关闭连续转换
    ADC1_Handler.Init.NbrOfConversion = 1;                                        //1个转换在规则序列中 也就是只转换规则序列1
    ADC1_Handler.Init.DiscontinuousConvMode =DISABLE;                    //禁止不连续采样模式
    ADC1_Handler.Init.NbrOfDiscConversion =0;                                   //不连续采样通道数为0
    ADC1_Handler.Init.ExternalTrigConv =ADC_EXTERNALTRIG_T6_TRGO;                          //定时器6触发
    ADC1_Handler.Init.ExternalTrigConvEdge =ADC_EXTERNALTRIGCONVEDGE_RISING;      //上升沿触发
    ADC1_Handler.Init.BoostMode =ENABLE;                                                                    //BOOT模式使能,ADC时钟超过20M的话,使能boost
    ADC1_Handler.Init.Overrun =ADC_OVR_DATA_OVERWRITTEN;                                     //有新的数据的死后直接覆盖掉旧数据
    ADC1_Handler.Init.OversamplingMode =DISABLE;                                                          //过采样关闭
    ADC1_Handler.Init.ConversionDataManagement =ADC_CONVERSIONDATA_DMA_CIRCULAR;  //规则通道的数据仅仅保存在DR寄存器里面
    HAL_ADC_Init(&ADC1_Handler);  //初始化
        
   HAL_ADCEx_Calibration_Start(&ADC1_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC校准
        
ADC1_ChanConf.Channel =  ADC_CHANNEL_19;                          //通道
ADC1_ChanConf.Rank =ADC_REGULAR_RANK_1;                         //采样序列离得第一个
ADC1_ChanConf.SamplingTime =ADC_SAMPLETIME_2CYCLES_5;   //采样周期  1.5+7.5  
ADC1_ChanConf.SingleDiff =ADC_SINGLE_ENDED;                       //单边采集                          
ADC1_ChanConf.OffsetNumber =ADC_OFFSET_NONE;                   //无偏移         
ADC1_ChanConf.Offset =0;   
HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);    //通道配置
        
ad_dma_Config( );//DMA1_Stream1配置
HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t *)&adc0Buffer,adCountX2);
               
}




dma-nomal模式

dma-nomal模式

dma-circular模式

dma-circular模式

最佳答案

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-6-4 15:45:43 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-6-5 01:19:43 | 显示全部楼层
帮顶
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-6-4
在线时间
13 小时
 楼主| 发表于 2020-6-5 14:48:11 | 显示全部楼层
自顶,有没有大神帮我看看?
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-6-4
在线时间
13 小时
 楼主| 发表于 2020-6-8 11:26:58 | 显示全部楼层

嗯呢,关闭了D Cache数据采集正确了,万分感谢原子哥
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-6-12
在线时间
1 小时
发表于 2020-6-12 23:01:26 | 显示全部楼层
F7也遇到过同样的问题,关闭了D Cache就好了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-1 09:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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