OpenEdv-开源电子网

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

求助 DMA 串口接收 乒乓缓冲问题

[复制链接]

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-9-23
在线时间
1 小时
发表于 2012-11-15 21:20:08 | 显示全部楼层 |阅读模式
void DMA1_Channel5_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA1_IT_TC5))                                                                   //通道5传输完成中断TC 还有传输 过半中断HT 错误中断TE 全局中断GL
     {
       //DataCounter = DMA_GetCurrDataCounter(DMA1_Channel5);                         //获取剩余长度,一般都为0,调试用
       DMA_ClearITPendingBit(DMA1_IT_GL5);                                                           //清除全部中断标志 
        
       //转换可操作BUF
        if(Free_Buf_No==BUF_NO1)
        {    
            DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_DMA_Buf1;
            DMA_Init(DMA1_Channel5, &DMA_InitStructure);
            
printf("%s",USART1_DMA_Buf2);
   printf("b");
Free_Buf_No=BUF_NO2;
        }
        else
        {
            DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_DMA_Buf2;
            DMA_Init(DMA1_Channel5, &DMA_InitStructure);
            
printf("%s",USART1_DMA_Buf1);
printf("a");
Free_Buf_No=BUF_NO1;

        }
printf("c");
    
     }
如上是我的接收中断函数,里面是轮流向两个缓冲区写数据,并打印出来。 我设置的两个缓冲区大小都为5,DMA的缓冲也为5, 我用串口调试工具发送 每次都发送12345时,发现 前两次正常输出,后面的每一次输出 USART1_DMA_Buf1(也就是缓冲区1)输出的结果是 1234512345,缓冲区2是正常输出的12345。  下面是我DMA的配置,请问大家是怎么回事啊?

void USART_DMA_Configuration(uint32_t USART1_DR_Address,uint8_t* USART1_DMA_Buf1)
{
extern DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel5);//将DMA1的通道5寄存器设置为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Address;//该参数用以定义外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_DMA_Buf1;//该参数用以定义内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//设置外设作为数据传输的来源
DMA_InitStructure.DMA_BufferSize = 5;//定义DMA通道一的DMA缓存大小,单位为单个数据大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//定义外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//定义内存地址寄存器不变
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//设定外设数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//设定内存数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//指定DMA工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//指定通DMA通道一拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//将DMA通道一不设置成内存到内存模式
DMA_Init(DMA1_Channel5, &DMA_InitStructure);//根据DMA_InitStructure中的参数初始化DMA1的通道5寄存器
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);                                //DMA5传输完成中断  

/* Enable DMA1 channel5 */
DMA_Cmd(DMA1_Channel5, ENABLE);//使能DMA1通道5
}

两个缓冲区的定义
uint8_t USART1_DMA_Buf1[buf_size]={NULL};
uint8_t USART1_DMA_Buf2[buf_size]={NULL};
主函数内是
int main(void)
{
    SystemInit();//系统时钟初始化
USART_RCC_Configuration();
USART_GPIO_Configuration();
USART_Configuration();//串口1初始化
NVIC_Configuration();
USART_DMA_Configuration(USART1_DR_Address,USART1_DMA_Buf1);//DMA通道5初始化
Free_Buf_No=BUF_NO2;        //空闲的BUF号 typedef enum {BUF_NO1=0,BUF_NO2=1}BUF_NO;

printf("\r\n*******************************************************************************");
printf("\r\n************************ Copyright 2009-2012, ViewTool ************************");
printf("\r\n*************************** http://www.viewtool.com ***************************");
printf("\r\n***************************** All Rights Reserved *****************************");
printf("\r\n*******************************************************************************");
printf("\r\n");
while(1);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-15 23:46:36 | 显示全部楼层
回复【楼主位】yzmvv:
---------------------------------
应该是没加入结束符的缘故
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-9-23
在线时间
1 小时
 楼主| 发表于 2012-11-16 09:17:01 | 显示全部楼层
嗯,昨天晚上睡觉的时候我也想到可能是printf输出字符串时 格式符的问题,可是我用串口调试助手向电脑怎么才能发送结束符呢?  原子大哥
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-9-23
在线时间
1 小时
 楼主| 发表于 2012-11-17 09:45:57 | 显示全部楼层
木有高人回答一下,多谢了啊。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 22:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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