历史上的今天
返回首页

历史上的今天

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

正在发生

2019年09月25日 | stm32 adc的dma传输案例

2019-09-25 来源:eefocus

dma不多说了,原理啥的网上一大推,源码也有注释,理解起来很容易


案例是传输adc的4个通道,需要多个或者其它的,照着修改就行。


#define ADC1_DR_Address ((u32)0x40012400+0X4C) //ADC数据的地址

 

u16  ADC_buf[4]; //DMA传输BUF

 

void adc_dma_init()

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);

 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //通道引脚

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;

GPIO_Init(GPIOA,&GPIO_InitStructure);

 


DMA_InitTypeDef DMA_InitStructure;

ADC_InitTypeDef ADC_InitStructure;

 

DMA_DeInit(DMA1_Channel1);


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=4; //传输个数据

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); //使能


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=4; //要转换的个数

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_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转换


}

 

 

int main(void)


{


adc_dma_init();

 


while(1)


{



delay_ms(200);



}


}


本来想软件仿真过来看的,但不知道怎么修改IO的电压值,只能用硬件仿真测试了。


测试效果如下:数组里的值会不断刷新,也就是adc引脚的数据直接传输到了数组里面。这样就不会占用cpu资源了。

推荐阅读

史海拾趣

Dean Technology公司的发展小趣事

在激烈的市场竞争中,Dean Technology公司始终保持对技术创新的追求。他们不断投入研发资金,引进先进技术和设备,提升产品的技术含量和附加值。同时,公司还注重与高校、科研机构的合作,共同开展科研项目,推动行业技术的进步。这些努力使得Dean Technology的高压二极管产品始终保持在行业的领先地位。

Aimtec公司的发展小趣事

随着业务规模的扩大,Aimtec公司开始将目光投向国际市场。公司先后在欧洲和亚洲设立了办事处,通过本地化的销售策略和技术支持,逐步打开了国际市场的大门。在国际竞争中,Aimtec凭借其优质的产品和服务,赢得了众多客户的信赖和好评。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的技术水平和市场竞争力。

Carlisle Interconnect Technologies公司的发展小趣事

Carlisle Interconnect Technologies(当时名为Tensolite)的创业之路始于1940年,在纽约Tarrytown的一个小工厂里。公司创始人凭借对微型绝缘电线和电缆的深刻理解和前瞻视野,开创了绝缘电线电缆的新纪元。Tensolite这个名称,象征着产品的高拉伸强度和紧凑轻巧的特性,这种创新的设计理念很快在市场上赢得了口碑。公司的第一根绝缘线产品成功应用于电加热,为第二次世界大战期间的空军飞行员提供了温暖的手套和飞行服,这一成就不仅彰显了公司的技术实力,也为后续发展奠定了坚实的基础。

Hittite Microwave(ADI)公司的发展小趣事

随着电子行业的快速发展,Carlisle Interconnect Technologies不断进行技术升级和产品创新。公司不断引进先进的生产设备和技术,提升产品的质量和性能。同时,公司还积极拓展产品线,从最初的绝缘电线电缆扩展到连接器、传感器等多个领域。这种多样化的产品策略使得公司能够更好地满足客户的多样化需求,也在市场上取得了更大的成功。

C.K Magma公司的发展小趣事

C.K Magma公司最初由一群热衷于电子技术的工程师创立。他们通过深入研究,成功开发出一种新型半导体材料,这种材料在性能和稳定性上均优于当时市场上的同类产品。这一技术突破为公司赢得了业界的关注,并吸引了第一批投资。随着资金的注入,C.K Magma公司得以扩大研发团队,进一步巩固了其在半导体领域的技术领先地位。

Bellin公司的发展小趣事

C.K Magma公司最初由一群热衷于电子技术的工程师创立。他们通过深入研究,成功开发出一种新型半导体材料,这种材料在性能和稳定性上均优于当时市场上的同类产品。这一技术突破为公司赢得了业界的关注,并吸引了第一批投资。随着资金的注入,C.K Magma公司得以扩大研发团队,进一步巩固了其在半导体领域的技术领先地位。

问答坊 | AI 解惑

WINCE挂起问题

我的BSP是由4.2升级过来的,启动点击挂起后屏幕慢慢变白,我的目的是让屏幕跟关机一样变黑。点击挂起就是调用OEM层的函数 : OEMPowerOff,因此我在\\KERNEL\\HAL\\power.c的OEMPowerOff函数里面加入串口打印消息,没有任何消息打印出来。后来也像某 ...…

查看全部问答>

高分求助:把单片机P0,P1,P2口的状态通过串口通讯以2进制发送给计算机,急急急!

下面是我试验成功的按键一次发送P1口给计算机的程序,但是实际上我需要每隔十秒钟,由单片机自动将P0,P1,P2一起发给计算机,请各位大侠指点,由于本人水平较菜,希望得到详细的汇编代码,先谢啦 org 0000h mov scon,#40h ;选择串口工作于方式1 m ...…

查看全部问答>

vxworks的IO重映射问题

现在有如下一个功能要实现: 把用作Console口的那个串口暂时用作他用(即当作一个纯的串口用来传送数据,例如下载程序),然后再恢复成console。 如下是我的实现方案: 首先通过IO重映射来取消console终端: ioGlobalStdSet(STD_IN, 0); ioGlo ...…

查看全部问答>

交换机上怎么防御ddos攻击和机器狗病毒啊

交换机上怎么防御ddos攻击和机器狗病毒啊?在网上搜索过很多资料,都没有什么好的办法。刚进公司就被分配了这个任务,再不做出来就要被开了。有没有哪位大虾帮一下啊?在下万分感谢啊。…

查看全部问答>

wince 5.0 MFC 如何实现窗体隐藏?

写了MFC程序,ShowWindow(SW_HIDE);ShowWindow(hWnd,SW_HIDE);窗体没有反应.有什么办法能隐藏窗体应用程序呢?谢谢!…

查看全部问答>

AT24C64A 的读写问题

要做一个VC写的AT24C64A的读写程序,谁有资料,提供一下,网上都是汇编和C的,现在需要VC的。…

查看全部问答>

菜鸟请教,用C-SPY调试用的是*.d43的文件,如果是正式产品是什么后缀名啊?

菜鸟请教,用C-SPY调试用的程序是*.d43的文件,如果是要正式发行的产品应该是什么后缀名啊?…

查看全部问答>

分享宝贝,(*^__^*) 嘻嘻……

刚刚在网上买的这个下载线,用了觉得还不错和大家分享一下~!http://item.taobao.com/item.htm?spm=1103BWwE.1-3Y7rP.000000032100076132&id=10863150624&…

查看全部问答>

求继电器驱动优化方案

求高手优化电路,包括哪些元件是多余的,哪些东西少了,电阻电容值没改过来,求推荐电阻电容值。…

查看全部问答>

四轴飞行器资料大放送

不多说,放资料!哈哈…

查看全部问答>