OpenEdv-开源电子网

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

我的adc采样数据进不了adc

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-10-22
在线时间
6 小时
发表于 2017-11-4 15:21:43 | 显示全部楼层 |阅读模式
1金钱
#include "delay.h"
#include "timer.h"
#include "adc.h"
#include "dma.h"
#include "usart.h"



extern u8 ADC_Ok;
u32 a[512];

int main(void)
{
       
        int i,j=0;
        u32 Range,Range_i,temp;
        delay_init();//延时初始化
        Adc_Init();//adc初始化
        uart_init(115200);         //串口初始化为115200       
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        MYDMA_Config(DMA1_Channel1,(u32)Get_Adc(ADC_Channel_1), (u32)a[0],512);//DMA1通道1,取地址为 adc ,存储器为 数组a ,长度512.
        DMA_Cmd(DMA1_Channel4, ENABLE);        
        while(1)
        {               
               
                        i=DMA1_Channel1->CNDTR;
                        j=        Get_Adc(ADC_Channel_1);
                        printf("RANGE=:%d  %d  \r\n",i,j);//打印总的高点平时间                                                //显示       
                delay_ms(50);
               
               
                if(ADC_Ok==1)    //当DMA传送结束时,开始进行数据处理及显示
                {               
                        FFT_transform(); //FFT变换        
                        for(i=0;i<512;i++)//求得频率和幅度
                       
                        {
                                if(Range<s[i].real)
                                {
                                Range=s[i].real;
                                Range_i        =i;
                                }               
                        }
                        temp=         47619*Range_i/512;                                                                //求出频域上的点对应的频率
                printf("RANGE=:%d    \r\n",temp);//打印总的高点平时间                                                //显示
                       
                        DMA_Cmd(DMA1_Channel4, ENABLE); //重新打开DMA,将标志位清零
                        ADC_Ok=0;
                }                               
        }

       
               
               
               
               

       
       

         
}





我这样配置dma的语句有问题吗,我每次测的时候都发现我的adc数据没有进入dma中


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

使用道具 举报

2

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-10-22
在线时间
6 小时
 楼主| 发表于 2017-11-4 15:25:14 | 显示全部楼层
#include "dma.h"
#include "delay.h"       
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK精英STM32开发板
//DMA 代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/8
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
u8 ADC_Ok;
DMA_InitTypeDef DMA_InitStructure;
u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度             
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHxMA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量

void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
       
  DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
       
       
        DMA1_MEM_LEN=cndtr;
        DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,从外设读取发送到内存
        DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //数据宽度为16位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
        DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
        DMA_CHx->CCR|=1<<1;                  //开启传输完成中断       
       
       
                NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;  //DMA1_Channel1_IRQn中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器       
}
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
        DMA_Cmd(DMA_CHx, DISABLE );  //关闭USART1 TX DMA1 所指示的通道      
        DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小
        DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道
}          



void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC1))
  {
  DMA_ClearITPendingBit(DMA1_IT_GL1); //清除全部中断标志
  ADC_Ok=1;
}
}
























这是我的dma配置
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-6 01:09:35 | 显示全部楼层
论坛搜索,参考别人的ADC+DMA代码
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 12:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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