OpenEdv-开源电子网

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

串口DMA

[复制链接]

33

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2016-5-20
在线时间
45 小时
发表于 2016-11-30 21:06:20 | 显示全部楼层 |阅读模式
5金钱
串口DMA发送数据错误
寄存器0的值=0X0001;
寄存器1的值=0X000F;
寄存器2的值=0X00FF;

串口DMA接收到的数据为  01 03 00 00 00 03 05 CB   //读1号站0开始的连续3个寄存器的值,05 CB为CRC校验码,低字节在前,高字节在后;
串口DMA应发送的数据为  01  03 06 00 01 00 0F FF FF 2D 06

可现在串口返回的数据为  01  03 06 00 01 00 0F FF FF FF   或者  01  03 06 00 01 00 0F FF FF FD

只要不是读连续的3个寄存,无论是读连续的1个、2个、4个、5个等返回来的值都是正确的

我把要发送的数据一个一个赋到要发送的数组里,然后发送还是不对

不知道问题出在那里了


        send_num= 11;  //要发送的数据长度
        send_buffer[0]=0X01;  //站号
        send_buffer[1]=0X03;  //功能码
        send_buffer[2]=0X06;  //要发送寄存器值的字节数
        send_buffer[3]=0X00;  //寄存器0的值高位在前
        send_buffer[4]=0X01;  //寄存器0的值低位在后
        send_buffer[5]=0X00;  //寄存器1的值高位在前
        send_buffer[6]=0X0F;  //寄存器1的值低位在后
        send_buffer[7]=0XFF;  //寄存器2的值高位在前
        send_buffer[8]=0XFF;  //寄存器2的值低位在后
        send_buffer[9]=0X2D;  //CRC低字节在前
        send_buffer[10]=0X06;  //CRC高字节在后
       就这样一个个的把值赋进去,再发送还是不对


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

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-10-8
在线时间
32 小时
发表于 2016-11-30 21:32:34 | 显示全部楼层
DMA发送 设置为 单次发送.   
发送前夕  数组填好数据.  然后

           DMA_ClearFlag(DMA1_FLAG_TC4);
        DMA_Cmd(DMA1_Channel4,DISABLE);
       DMA1_Channel4->CMAR =(uint32)&Str_View.OverviewFIFO[0];//给DMA 发送的基地址
    DMA_SetCurrDataCounter(DMA1_Channel4,Str_View.FIFOCNT);//设置发送的个数
                DMA_Cmd(DMA1_Channel4,ENABLE);        //启动发送
怎么可能会有错
回复

使用道具 举报

33

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2016-5-20
在线时间
45 小时
 楼主| 发表于 2016-11-30 23:20:33 | 显示全部楼层
lavion 发表于 2016-11-30 21:32
DMA发送 设置为 单次发送.   
发送前夕  数组填好数据.  然后

这是我的DMA配置函数,在发送时使能




//DMA1_USART2_TX2ÎêyÅäÖÃoˉêy
void DMA1_USART2_TX_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //¿aÆôDMA1ê±Öó  

DMA_Cmd(DMA1_Channel7, DISABLE);  //1ØDMA1í¨μà7
DMA_DeInit(DMA1_Channel7);  //»Ö¸′Îaè±ê¡Öμ
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR;  //DMAíaéè»ùμØÖ·
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)send_buffer;  //DMAÄú′æ»ùμØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //éèÖÃíaéèÎaÄ¿±ê
DMA_InitStructure.DMA_BufferSize = send_num;   //Dèòa·¢ËíμÄ×Ö½úêy
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //íaéèμØÖ·¼Ä′æÆ÷2»μYÔö
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //Äú′æμØÖ·¼Ä′æÆ÷μYÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //íaéèêy¾Y¿í¶è8룬ò»¸ö×Ö½ú
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  //Äú′æêy¾Y¿í¶è8룬ò»¸ö×Ö½ú
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //μ¥′Î′«êäÄ£ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;  //óÅÏè¼¶éèÖÃ
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //1رÕÄú′æμ½Äú′æμÄDMAÄ£ê½
DMA_Init(DMA1_Channel7, &DMA_InitStructure);   //3õê¼»ˉDMA3éÔ±±äá¿
DMA_ClearFlag(DMA1_FLAG_GL7);  //Çå3yDMAËùóD±êÖ¾       
       
DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);   //¿aÆôDMA1í¨μà7′«êäíê3éÖD¶Ï
       
DMA_Cmd(DMA1_Channel7, DISABLE);  //1رÕDMA1í¨μà7
}
回复

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-10-8
在线时间
32 小时
发表于 2016-12-2 00:57:55 | 显示全部楼层
void Uart_OverView_Init(uint8* DataBase,uint32 Len)
{
        /*ê1Äü¶Ë¿úoííaéèê±Öó */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);
  
//        GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

        GPIO_StructInit(&GPIO_InitStructure);
/* ÅäÖýóêÕòy½Å*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* ÅäÖ÷¢Ëíòy½Å */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
       
  //ÅäÖÃ′®¿ú2Îêy
  USART_StructInit(&USART_InitStructure);
        USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode =  USART_Mode_Tx | USART_Mode_Rx;
  /* Configure USARTy */
  USART_Init(USART1, &USART_InitStructure);
   
        /* Enable the USARTy Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
        NVIC_Init(&NVIC_InitStructure);

  USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//′ò¿a½óêÕÖD¶Ï
  

        // ′ò¿aDMAê±Öó
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        //éèÖÃDMA
        /* USARTy TX DMA1 Channel (triggered by USARTy Tx event) Config */
  DMA_DeInit(DMA1_Channel4);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = ((unsigned int)&USART1->DR);
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DataBase;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 1;
  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_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);
       
       
        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

  USART_Cmd(USART1, ENABLE);

  DMA_Cmd(DMA1_Channel4, ENABLE);
}

初始化代码,  你自己对吧.    我应用过 无数次
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 21:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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