我按原子的DMA配置函数的框架写了个DMA配置函数:
void DMA_config(DMA_Channel_TypeDef *DMA_CHx, unsigned long cpar, unsigned long cmar, unsigned short len)
{
unsigned long BASE;
BASE = cpar;
RCC->AHBENR |= 1 << 1; //DMA2通道时钟使能
DMA_CHx->CPAR = (unsigned long)&SPI3->DR; //外设地址
DMA_CHx->CMAR = cmar; //存储地址
snd_len = len;
DMA_CHx->CNDTR = len;
DMA_CHx->CCR |= 3 << 12; //DMA通道优先级最高
DMA_CHx->CCR |= 1 << 10; //存储数据宽度为16BIT
DMA_CHx->CCR |= 1 << 8; //外设数据宽度为16BIT
DMA_CHx->CCR |= 1 << 7; //存储器增量模式
DMA_CHx->CCR |= 1 << 5; //执行循环操作
DMA_CHx->CCR |= 1 << 4; //由存储器到外设
}
调用:
DMA_config(DMA2_Channel2, (unsigned long)&SPI3->DR, (unsigned long)buff, 65530);
在DMA_config函数中:
把 DMA_CHx->CPAR = (unsigned long)&SPI3->DR; 就能传输数据
把 DMA_CHx->CPAR = BASE 或 DMA_CHx->CPAR = cpar 就不能传输数据了。
调用时传进来的外设地址也是 (unsigned long)&SPI3->DR 呀, 经过了个形参怎么就不行了?
求指点。。。
|