新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2019-7-28
- 在线时间
- 8 小时
|
发表于 2019-9-3 10:03:31
|
显示全部楼层
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_TypeDef *DMAx;
DMAMUX_Channel_TypeDef *DMAMUXx;
u8 streamx;
DMA_Stream77= DMA_Streamx;
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
DMAx=DMA2;
RCC->AHB1ENR|=1<<1; //DMA2时钟使能
}else
{
DMAx=DMA1;
RCC->AHB1ENR|=1<<0; //DMA1时钟使能
}
while(DMA_Streamx->CR&0X01);//等待DMA可配置
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上的所有中断标志
if((u32)DMA_Streamx>(u32)DMA2)streamx+=8; //如果是DMA2,通道编号+8
DMAMUXx=(DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE+streamx*4); //得到对应的DMAMUX通道控制地址
DMAMUXx->CCR=chx&0XFF; //通道选择
DMA_Streamx->PAR=par; //DMA外设地址
DMA_Streamx->M0AR=mar; //DMA 存储器0地址
DMA_Streamx->NDTR=ndtr; //DMA 存储器0地址
DMA_Streamx->CR=0; //先全部复位CR寄存器值
DMA_Streamx->CR|=1<<6; //存储器到外设模式
DMA_Streamx->CR|=0<<8; //非循环模式(即使用普通模式)
DMA_Streamx->CR|=0<<9; //外设非增量模式
DMA_Streamx->CR|=1<<10; //存储器增量模式
DMA_Streamx->CR|=0<<11; //外设数据长度:8位
DMA_Streamx->CR|=0<<13; //存储器数据长度:8位
DMA_Streamx->CR|=1<<16; //中等优先级
DMA_Streamx->CR|=0<<21; //外设突发单次传输
DMA_Streamx->CR|=0<<23; //存储器突发单次传输
/////////////////////////////////////////////////////////
DMA_Streamx->CR&=~(1<<4); //传输完成后产生中断
DMA_Streamx->CR|=1<<4; //传输完成后产生中断
DMA_Streamx->CR&=~(1<<0); //关闭DMA传输
while(DMA_Streamx->CR&0X1); //确保DMA可以被设置
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn,0x1,0x1); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); //开启DMA2_Stream7中断
//DMA_Streamx->FCR=0X21; //FIFO控制寄存器
}
我这样设置的,也没有进中断???????? |
|