OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3423|回复: 4

利用DMA使串口发信息

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-7-3
在线时间
0 小时
发表于 2015-7-3 10:15:18 | 显示全部楼层 |阅读模式
5金钱
main程序如下,我只有注释了printf语句,程序才能正常运行,否则串口没输出,LED也不亮;
#include "led.h"
#include "usart.h"
//#include "delay.h"
extern uint8_t SendBuff[SENDBUFF_SIZE];
static void Delay(__IO u32 nCount);
int main(void)
{
LED_Init();
//delay_init();
usart_init(9600);
    usart_dma_init();
   //printf("\r\n usart DMA TX 测试 \r\n");
    {
     uint16_t i;
     for(i=0;i<SENDBUFF_SIZE;i++)
        {
             SendBuff='A';
        }
     }
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
for(;;)
    {
        LED0=0;
        LED1=1;
        Delay(0xFFFFF);
        LED0=1;
        LED1=0;
        Delay(0xFFFFF);;
}
}
static void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}

DMA初始化程序是这样的,这里有意思的地方还有一个,我第一次使用前面的注释前面的程序时,串口一直输出“|||||||||”,于是我把一段源程序复制进去,也就是注释的部分(我看过两个程序一模一样),结果串口能输出“AAAAAAA”,但我再次使用前面的程序,串口又输出“PPPPPP”,于是我又用源程序时,串口也输出“||||||”了,我不知道这到底是个什么情况,为什么同样的程序会有不同的结果,到底哪里出了问题,谁能帮个忙看看,感激不尽(实验截图在附件里):
void usart_dma_init(void)
{
 DMA_InitTypeDef DMA_InitStructure;                                              //DMA_InitTypeDef DMA_InitStructure;
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);         //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 
 DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_DR_Base;  //DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
 DMA_InitStructure.DMA_MemoryBaseAddr=(u32)SendBuff;          //DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
 DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;               //DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
 DMA_InitStructure.DMA_BufferSize=SENDBUFF_SIZE;                  //DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
 DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;   //DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
 DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;    //DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
 DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;   //DMA_InitStructure.DMA_PeripheralDataSize =  DMA_PeripheralDataSize_Byte;
 DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;    //DMA_InitStructure.DMA_MemoryDataSize =  DMA_MemoryDataSize_Byte;  
 DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;                  //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  
 DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;              //DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  
 DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;                   //DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 
 DMA_Init(DMA1_Channel4, &DMA_InitStructure);                     //DMA_Init(DMA1_Channel4, &DMA_InitStructure);   

 DMA_Cmd(DMA1_Channel4, ENABLE);                                        //DMA_Cmd (DMA1_Channel4,ENABLE);
 }




Q)TD6LRBZ69Q~%]_IO`CPW1.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-7-3
在线时间
0 小时
 楼主| 发表于 2015-7-3 10:46:43 | 显示全部楼层
我明白了,我按下复位就能正常显示了,可是为什么会有PPPP跟||||出现呢,这是什么原理。此外,使用printf时必须使用Micro LIB吗?
回复

使用道具 举报

6

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-12-14
在线时间
4 小时
发表于 2015-7-3 12:49:34 | 显示全部楼层
回复【2楼】Kevin320:
---------------------------------
你把DMA初始化放串口前面试试
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2015-7-3 17:37:09 | 显示全部楼层
原子哥那个蓝牙模块的代码就是用DMA进行串口发送的,感觉用DMA进行串口发送就不能直接用printf了吧,原子哥那个蓝牙的也是相当于重写了一个专门用于DMA串口发送的printf,我用着挺好的
我是菜鸟
回复

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
发表于 2015-7-3 21:12:09 | 显示全部楼层
参考原子哥的程序多思考就清楚咯
避免犯错本是错误所在,我错故我在……
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 22:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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