历史上的今天
今天是: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资源了。
下一篇:STM32一个定时器输出不同频率
史海拾趣
|
高分求助:把单片机P0,P1,P2口的状态通过串口通讯以2进制发送给计算机,急急急! 下面是我试验成功的按键一次发送P1口给计算机的程序,但是实际上我需要每隔十秒钟,由单片机自动将P0,P1,P2一起发给计算机,请各位大侠指点,由于本人水平较菜,希望得到详细的汇编代码,先谢啦 org 0000h mov scon,#40h ;选择串口工作于方式1 m ...… 查看全部问答> |
|
现在有如下一个功能要实现: 把用作Console口的那个串口暂时用作他用(即当作一个纯的串口用来传送数据,例如下载程序),然后再恢复成console。 如下是我的实现方案: 首先通过IO重映射来取消console终端: ioGlobalStdSet(STD_IN, 0); ioGlo ...… 查看全部问答> |
|
交换机上怎么防御ddos攻击和机器狗病毒啊?在网上搜索过很多资料,都没有什么好的办法。刚进公司就被分配了这个任务,再不做出来就要被开了。有没有哪位大虾帮一下啊?在下万分感谢啊。… 查看全部问答> |
|
写了MFC程序,ShowWindow(SW_HIDE);ShowWindow(hWnd,SW_HIDE);窗体没有反应.有什么办法能隐藏窗体应用程序呢?谢谢!… 查看全部问答> |
|
刚刚在网上买的这个下载线,用了觉得还不错和大家分享一下~!http://item.taobao.com/item.htm?spm=1103BWwE.1-3Y7rP.000000032100076132&id=10863150624&… 查看全部问答> |




