STM32 DMA直接存储器访问 USART串口DMA发送 F407寄存器

DMA介绍:

    特点:
                DMA:直接存储器访问
                用于外设与存储器间以及存储器与存储器之间       
                提高数据传输的一种工具(片上外设)

                CPU相当于餐厅老板,只需要告诉DMA快递员
                即可让数据从源地址搬运到目标地址

                一个DMA有8个数据流,每个数据流有8个通道

        其DMA外设地址和硬件相连对应的数据流及通道 可以查看 参考手册

   场景:          
             当搬运大量数据的时候,用DMA搬运可以节省CPU的时间,CPU从而去执行其他程序.

  仲裁器:
              DMA总线只能分时复用,因此需要有仲裁器
              仲裁器设置数据流的优先级:非常高   高   中   低
              如果两个数据流的软件优先级相同,数据流的编号越低优先级越高

DMA初始化函数 --- 串口DR寄存器为目标地址

/**********************************************
*函数名            :usart1_dma
*函数功能        :串口1传输数据使用DMA
*函数参数        :u8* buff_addr,u32 ndtr
*函数返回值    :无
*函数描述        :usart1 发送   DMA2的数据流7通道4
**********************************************/
void usart1_dma(u8* buff_addr,u32 ndtr)
{
    //DMA时钟使能
    RCC->AHB1ENR |= (1<<22);
    //数据流关闭
    DMA2_Stream7->CR &= ~(1<<0);
    //等待关闭完成
    while(DMA2_Stream7->CR & (1<<0));
    //DMA_SxCR 
    DMA2_Stream7->CR &= ~(7<<25);
    DMA2_Stream7->CR |= (4<<25);        //选择通道4
    DMA2_Stream7->CR &= ~(3<<16);        //优先级为低
    
    DMA2_Stream7->CR &= ~(3<<11);        //外设数据大小 1字节
    DMA2_Stream7->CR &= ~(1<<9);        //外设地址固定
    DMA2_Stream7->CR &= ~(3<<13);        //存储器数据大小 1字节
    DMA2_Stream7->CR |= (1<<10);        //存储器地址递增 以1字节偏移
    
    DMA2_Stream7->CR &= ~(3<<6);
    DMA2_Stream7->CR |= (1<<6);            //存储器到外设
    
    DMA2_Stream7->CR &= ~(1<<5);        //DMA流控制器模式
    
    //DMA_SxNDTR
    DMA2_Stream7->NDTR = ndtr;            //传输次数
    
    //DMA_SxPAR
    DMA2_Stream7->PAR = (u32)&USART1->DR;        //外设地址
    //DMA_SxM0AR
    DMA2_Stream7->M0AR = (u32)buff_addr;        //存储器地址
    
    //外设DMA使能
    USART1->CR3 |= (1<<7);
    //开启数据流
    DMA2_Stream7->CR |= (1<<0);
}                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值