历史上的今天
返回首页

历史上的今天

今天是:2024年09月25日(星期三)

正在发生

2019年09月25日 | stm32使用DMA传输9路ADC使用中断处理数据

2019-09-25 来源:eefocus

使用中断方式的好处就是在其它地方不会调用到DMA传输BUF。如果不小心调用或修改,可能会死机。具体原因没有深究。


注意中断函数是否和.s文件里面一致,否则也会死机。


根据需求去修改中断函数内容。


dma_adc.h


#ifndef _DMA_ADC_

#define _DMA_ADC_

 

#include "sys.h"

 

#define ADC1_DR_Address ((u32)0x40012400+0X4C)

 

extern u16  ADC_buf[10]; //DMA传输BUF

extern u32  ADC_BUF[10]; //滤波后保存BUF

 

extern u8  ADC_BUF_flag; //滤波后完成标志

 

 void ADC1_DMA_init(void);

 

#endif

dma_adc.c


#include "dma_adc.h"

#include "serial.h"

#include "nrf_info.h"

u16  ADC_buf[10];

u32  ADC_BUF[10];

u8  ADC_BUF_flag=0;

 void ADC1_DMA_init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //通道引脚

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;

GPIO_Init(GPIOA,&GPIO_InitStructure);

 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //通道引脚

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;

GPIO_Init(GPIOB,&GPIO_InitStructure);

DMA_InitTypeDef DMA_InitStructure;

ADC_InitTypeDef ADC_InitStructure;

 

DMA_DeInit(DMA1_Channel1);

NVIC_InitTypeDef NVIC_InitStructure;

  

  /* Configure one bit for preemption priority */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  

  /* 配置DMA中断源*/

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

 

DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address; //ADC数据寄存器地址

DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADC_buf; //将ADC1_DR_Address数据转移到ADC_buf

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //数据传输方向,外设作为数据源

DMA_InitStructure.DMA_BufferSize=9; //传输个数据

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址固定

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; //表示每个传输的的数据大小

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;

DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; //循环传输

DMA_InitStructure.DMA_Priority=DMA_Priority_High; //DMA通道优先级

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; //禁止内存到内存传输

DMA_Init(DMA1_Channel1,&DMA_InitStructure);

DMA_Cmd(DMA1_Channel1,ENABLE); //使能

DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);  //配置DMA发送完成后产生中断

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //独立模式

ADC_InitStructure.ADC_ScanConvMode=ENABLE; //扫描模式,用于多通道采集

ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //开启连续转换

ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//b不使用外部触发转换

ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//采集数据右对齐

ADC_InitStructure.ADC_NbrOfChannel=9; //要转换的个数

ADC_Init(ADC1,&ADC_InitStructure);

RCC_ADCCLKConfig(RCC_PCLK2_Div6); //6分频,12HZ

//扫描顺序,55.5每个周期

ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_4,5,ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_5,6,ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_6,7,ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_7,8,ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_8,9,ADC_SampleTime_55Cycles5);

ADC_DMACmd(ADC1,ENABLE); //向DMA发出请求

ADC_Cmd(ADC1,ENABLE);

ADC_ResetCalibration(ADC1); //复位矫正寄存器

while(ADC_GetResetCalibrationStatus(ADC1)); //等待矫正完成

ADC_StartCalibration(ADC1); //ADC矫正

 

while(ADC_GetCalibrationStatus(ADC1)); //等待矫正完毕

ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件触发ADC转换

 

}

 

static u8 count=0;

 

 

extern "C" void DMA1_Channel1_IRQHandler(void) //DMA中断传输,并且处理数据。

{         

if(ADC_BUF_flag==0)

{

              if(count==0)

{

//AD清零

for(int i=0;i<9;i++)

{

ADC_BUF[i]=0;

}

}

for(int j=0;j<9;j++)

{

ADC_BUF[j]+=ADC_buf[j];

}

count++;

 

if(count==30)

{

//取平均滤波

for(int i=0;i<9;i++)

{

ADC_BUF[i]/=count;

}

//---------------------------------------拿到滤波值后------------

nrf_info.ch1=((ADC_BUF[0]*256)/4096);

nrf_info.ch2=((ADC_BUF[1]*256)/4096);

nrf_info.ch3=((ADC_BUF[2]*256)/4096);

nrf_info.ch4=((ADC_BUF[3]*256)/4096);

nrf_info.ch5=((ADC_BUF[4]*256)/4096);

nrf_info.ch6=((ADC_BUF[5]*256)/4096);

nrf_info.ch7=((ADC_BUF[6]*256)/4096);

nrf_info.ch8=((ADC_BUF[7]*256)/4096);

//---------------------------------------发送数据-----------------

if(nrf_info.send_mes())

{

//printf("send OKrn");

PCout(13)=~ PCout(13);

}

else

{

PCout(13)=1;

//printf("send ERRORrn");

}

count=0;

  ADC_BUF_flag=1;

}

}

// printf("我进中断了rn");

              DMA_ClearITPendingBit(DMA1_IT_TC1);              

}



推荐阅读

史海拾趣

ddm hopt + schuler GmbH & Co KG公司的发展小趣事

为了保持技术领先地位和市场竞争力,ddm hopt + schuler公司积极开展跨界合作和创新发展。公司与多所知名高校和研究机构建立了产学研合作关系,共同研发新技术、新产品。此外,公司还积极参与国际交流与合作,引进国际先进技术和管理经验。这些合作不仅为公司带来了更多的创新资源,也提升了公司的国际影响力和竞争力。

GCi Technologies公司的发展小趣事
3.5V至12V(具体范围可能因型号而异)。
爱浦电子(AIPULNION)公司的发展小趣事

爱浦电子自成立以来,一直致力于模块电源技术的研发与创新。在成立初期,公司便凭借其专业的研发团队和先进的生产设备,成功研发出多款具有竞争力的模块电源产品。随着技术的不断进步,爱浦电子不断对产品进行升级和优化,以满足市场日益增长的需求。公司不仅通过了ISO9001质量管理体系认证,还成功获得了CE、RoHS等国际认证,进一步提升了产品的品质和竞争力。

AD Semiconductor公司的发展小趣事

随着公司业务的不断扩展,爱浦电子于XXXX年成立了广州优联电气科技有限公司作为其分支机构。这一举措不仅进一步扩大了公司的业务范围和市场影响力,还为公司提供了更多的发展机遇和合作伙伴。广州优联电气科技有限公司在爱浦电子的业务开拓、经营及配套服务方面发挥了重要作用,推动了公司整体业务的快速发展。

这五个故事只是爱浦电子发展起来的一部分缩影,它们展现了公司在技术创新、市场拓展、服务升级、创新引领以及分支机构成立等方面的努力和成就。正是这些不懈的努力和持续的进步,使得爱浦电子在电子行业中脱颖而出,成为一家备受瞩目的高新技术企业。

ELANTEC (Renesas )公司的发展小趣事

作为一家半导体公司,技术突破和创新是ELANTEC发展的核心动力。在移动通信领域,ELANTEC不断推出具有创新性的产品和技术,如低功耗、高性能的移动通信芯片等。此外,在汽车电子、工业控制等领域,ELANTEC也取得了多项技术突破,为客户提供了更加优质的产品和服务。

Beck IPC GmbH公司的发展小趣事

Beck IPC GmbH,一家在嵌入式通讯市场享有盛誉的公司,以其创新的IPC@CHIP技术为核心,为工业OEM提供了强大的支持。在某一时期,公司研发团队经过长时间的努力,成功开发出一款具有划时代意义的嵌入式控制模块。这款模块不仅性能卓越,而且稳定性极高,迅速获得了市场的广泛认可。多家知名工业设备制造商纷纷与Beck IPC建立合作关系,将其产品应用于各种高端设备中,从而推动了公司的快速发展。

问答坊 | AI 解惑

移动流媒体技术及在3G移动通信中的应用

 随着第三代移动通信网络技术的发展,移动终端功能的增强和移动业务应用内容的丰富,各种无线应用将极大地丰富人们的日常工作和生活。 近年来,从短信到彩信、彩e、彩铃、手机游戏等,移动增值业务的种类日益丰富。但总体来看,当前移动通信网络提 ...…

查看全部问答>

DDS介绍(自己整理)

DDS 概要 1971年,美国学者J.Tierney等人撰写的“A DIGITAL Frequency Synthesizer”-文首次提出了以全数字技术,从相位概念出发直接合成所需波形的一种新给 成原理。限于当时的技术和器件产,它的性牟指标尚不能与已有的技术盯比,故未受到重视。 ...…

查看全部问答>

INtime实时操作系统(RTOS)

INtime实时操作系统(RTOS) For Microsoft Windows XP Microsoft Windows XP Embedded Microsoft Windows XP Embedded with Service Pack 1 引言 人们正在越来越多地选择 Microsoft Windows XP 和 Windows XP Embedded 操作系统来运行需要 ...…

查看全部问答>

codewarrior是否支持win7?

飞思卡尔的网站下载到的好像还不支持win7。…

查看全部问答>

DSP系统设计100问 希望对大家有用

replyreload += \',\' + 284811;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

高性能放大器设计的考量因素

放大器被用于许多不同的应用中,它们可以被用做高速模数转换器的输入缓冲器、多个视频负载的驱动器和测试仪器应用中的高速脉冲信号放大器等。目前,市场上的大多数高速(>50MHz)放大器的使用都非常方便,但是在适当的情况下,它们会变成非常稳定的振 ...…

查看全部问答>

招聘嵌入式应用开发工程师

职位类别:嵌入式应用开发工程师 工作地点:北京 朝阳区 职位月薪:面议 工作性质:全职 招聘人数:4人,限男性 邮箱:topzeal2008@sina.com 职位描述: 1、应用开发、测试及文档编写 2、相关工具的开发及维护 应聘要求: 1、学历不限 ...…

查看全部问答>

怎么学习Wince设备驱动及BSP的开发?

Wince系统的裁剪与定制等操作是掌握的,设备驱动及BSP的开发,感觉始终 不入门,特请教高人指点!…

查看全部问答>

求MMC卡的specification

哪位大侠有,发我邮箱,谢谢! coca-cola-007@163.com…

查看全部问答>