你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

請教有關於USART DMA的buffer size問題?

[复制链接]
sappppp 提问时间:2016-4-15 12:47 /
想要請問,當我利用DMA做USART傳輸時,當我定義BufferSize大小為DataLen時,當我從PC端寫入一串數據如"123456",但是傳送出來的數據一定是"0123456012"剛好填滿我設定的buffer 大小。請問是哪裡出問題呢?謝謝我的程式如下:


#define DataLen 10
u8 SendBuff[DataLen];
u8 RecviceBuff[DataLen];


void USART_DMA_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    DMA_DeInit(DMA1_Channel4);  
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize = DataLen;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);
    DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
    DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
    DMA_Cmd(DMA1_Channel4, DISABLE);   
    DMA_DeInit(DMA1_Channel5);
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DT_Base;
    DMA_InitStructure.DMA_MemoryBaseAddr =  (uint32_t) RecviceBuff;  
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = DataLen;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);
    DMA_Cmd(DMA1_Channel5, ENABLE);  

/*****************************************************************/
**************主流程  PC端寫入資料並由SMT32F1輸出至PC端
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        DMA_Cmd(DMA1_Channel5, DISABLE);
        DATA_LEN=DataLen - DMA_GetCurrDataCounter(DMA1_Channel5);
        if(DATA_LEN > 0)
        {   
            for(i=0;i<DATA_LEN;i++)  
            {
               SendBuff[i]= RecviceBuff[i];      // Let Memory receive data copy to Send memory
            }
            DMA_Cmd(DMA1_Channel4, DISABLE);
            DMA1_Channel4->CNDTR=DATA_LEN;
            USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
            DMA_Cmd(DMA1_Channel4, ENABLE);   
        }


收藏 评论2 发布时间:2016-4-15 12:47

举报

2个回答
power568 回答时间:2016-4-15 13:42:32
你的"0123456012"数据是不是你转换的,因为PC发送"123456"的话,应该手册hex的 31 32 33 34 35 36,即使转换也不应该有‘0,’,另外使用了DMA的话,如果能已知接收到的数据长度,建议使用DMA接收中断,高效且不易出错...
sappppp 回答时间:2016-4-22 08:06:25
謝謝您的建議!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版