野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14659|回复: 5

DMA _ USART1

[复制链接]
发表于 2015-6-18 22:00:56 | 显示全部楼层 |阅读模式
亲们 ,求解惑,感激不尽 。

昨天就被一个师弟问的问题给难住了  ,本来感觉一个简单的DMA问题 ,以为很快就能搞定的  ,结果... 好吧 ,学艺不精!

要实现的功能: 通过串口usart1 中断接受数据,保存在sendBUFF数组中;再通过DMA将数组发送到USart1 的发送端(即: 在串口助手中打印,相当于printf函数)。

以下是我配置的函数:

DMA函数:
#include "bsp_dma.h"

uint8_t SendBuff[SENDBUFF_SIZE];

DMA_InitTypeDef DMA_InitStructure;


void DMA_Config(void)
{
       
               
       
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
                NVIC_Config();
       
                DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;       
                DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;       
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;       
                DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;       
                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_Byte;
                DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;               
                DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;       
                DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
               
                DMA_Init(DMA1_Channel4, &DMA_InitStructure);
               
                DMA_Cmd (DMA1_Channel4,ENABLE);
               
                DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
               
        //        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);
}

static void NVIC_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       
        NVIC_Init(&NVIC_InitStructure);
}


串口函数,直接搬野火教程里的中断函数 。以测试 ,直接用printf函数是可以打印的 。

中断部分:

void USART1_IRQHandler(void)
{
         uint16_t i = 0;

                while(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                {
                 SendBuff=USART_ReceiveData(USART1);
        //                printf("%c",SendBuff);
                        i++;
               
                }
                USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);

}

可是,实验结果是这样的 :

实验结果

实验结果


回复

使用道具 举报

发表于 2015-6-19 09:09:36 | 显示全部楼层
参考我们的dma串口例程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-19 09:16:00 | 显示全部楼层
flyleaf 发表于 2015-6-19 09:09
参考我们的dma串口例程

是PDF里面那个?     那个我都实现了  。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-19 09:16:13 | 显示全部楼层
是PDF里面那个?     那个我都实现了  。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-19 09:16:44 | 显示全部楼层
是PDF里面那个?     那个我都实现了  。
回复 支持 反对

使用道具 举报

发表于 2015-11-17 17:13:36 | 显示全部楼层
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    这一句的问题吧!
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//你看这句是一个字节的单位,上一句确实半个字节
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 10:48 , Processed in 0.030294 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表