中级会员
 
- 积分
- 257
- 金钱
- 257
- 注册时间
- 2017-8-2
- 在线时间
- 46 小时
|

楼主 |
发表于 2017-10-10 14:57:59
|
显示全部楼层
本帖最后由 Bunny17 于 2017-10-12 11:56 编辑
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_TypeDef *DMAx;
u8 streamx;
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
DMAx=DMA2;
RCC->AHB1ENR|=1<<22;//DMA2时钟使能
}else
{
DMAx=DMA1;
RCC->AHB1ENR|=1<<21;//DMA1时钟使能
}
while(DMA_Streamx->CR&0X01);//等待DMA可配置 开发指南寄存器版本P226
streamx=(((u32)DMA_Streamx-(u32)DMAx)-0X10)/0X18; //得到stream通道号
if(streamx>=6)DMAx->HIFCR|=0X3D<<(6*(streamx-6)+16); //清空之前该stream上的所有中断标志
else if(streamx>=4)DMAx->HIFCR|=0X3D<<6*(streamx-4); //清空之前该stream上的所有中断标志
else if(streamx>=2)DMAx->LIFCR|=0X3D<<(6*(streamx-2)+16);//清空之前该stream上的所有中断标志
else DMAx->LIFCR|=0X3D<<6*streamx; //清空之前该stream上的所有中断标志
DMA_Streamx->PAR=par; //DMA外设地址
DMA_Streamx->M0AR=mar; //DMA 存储器0地址
DMA_Streamx->NDTR=ndtr; //数据传输量
DMA_Streamx->CR=0; //先全部复位CR寄存器值
DMA_Streamx->CR|=0<<6; //存储器到外设模式 改为外设到存储器
DMA_Streamx->CR|=1<<8; //非循环模式(即使用普通模式) 改为使能循环模式
DMA_Streamx->CR|=0<<9; //外设非增量模式
DMA_Streamx->CR|=1<<10; //存储器增量模式
DMA_Streamx->CR|=1<<11; //外设数据长度:8位 改为16位,因为ADC为12位
DMA_Streamx->CR|=0<<13; //存储器数据长度:8位 改为16位2017.08.03 又改回去改为8位2017.09.06
DMA_Streamx->CR|=1<<16; //中等优先级
DMA_Streamx->CR|=0<<21; //外设突发单次传输 ???
DMA_Streamx->CR|=0<<23; //存储器突发单次传输
DMA_Streamx->CR|=(u32)chx<<25;//通道选择
//DMA_Streamx->FCR=0X21; //FIFO控制寄存器
DMA_Streamx->CR&=~(1<<0); //关闭DMA传输
while(DMA_Streamx->CR&0X1); //确保DMA可以被设置
DMA_Streamx->CR|=1<<0; //开启DMA传输
}
//初始化ADC
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<8; //使能ADC1时钟 中文参考手册P144
RCC->AHB1ENR|=1<<1; //使能PORTB时钟
RCC->AHB1ENR|=1<<2; //使能PORTC时钟
GPIO_Set(GPIOB,PIN0|PIN1,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PB0 PB1,模拟输入,下拉
GPIO_Set(GPIOC,PIN0|PIN1|PIN2|PIN3|PIN4|PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PC0-PC5,模拟输入,下拉
RCC->APB2RSTR|=1<<8; //ADCs复位
RCC->APB2RSTR&=~(1<<8); //复位结束
ADC->CCR=3<<16; //ADCCLK=PCLK2/8=96/8=12Mhz,ADC时钟最好不要超过36Mhz
ADC1->CR1=0; //CR1设置清零
ADC1->CR2=0; //CR2设置清零
ADC1->CR1|=0<<24; //12位模式
ADC1->CR1|=1<<8; //使能扫描模式
ADC1->CR2|=1<<1; //连续转换模式
ADC1->CR2&=~(1<<11); //右对齐
ADC1->CR2|=0<<28; //软件触发
ADC1->CR2|=1<<8; //使能DMA
ADC1->SQR1&=~(0XF<<20); //位 23:20 L[3:0]:规则通道序列长度
ADC1->SQR1|=7<<20;
//设置通道8的采样时间
ADC1->SMPR2&=~(7<<(3*8));//通道8采样时间清空 PB0 ADC12_IN8
ADC1->SMPR2|=7<<(3*8); ..............................
ADC1->SQR3&=0XC0000000;//规则序列1 通道
ADC1->SQR2&=0XFFFFFC00;//规则序列1 通道
ADC1->SQR3|=10<<0;
..................
//ADC->CCR=2<<14; //使能DMA模式2 ???
ADC1->CR2|=1<<0; //开启AD转换器 使能ADC
ADC1->CR2|=1<<30; //启动规则转换通道
|
|