OpenEdv-开源电子网

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

stm32 f427 串口dma接收数据出错求助

[复制链接]

3

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-6-6
在线时间
5 小时
发表于 2018-12-9 16:43:16 | 显示全部楼层 |阅读模式
10金钱
我用LL库和hal库分别配置了一遍串口接收,可是接收的数据都一样,和正确的差几位,困扰了很长时间,求助!
这是错误的数据



这是应该接收到的数据

这是配置函数和中断函数  用的是不定长中断
uint8_t USART1_DMA_RX_BUF[BSP_USART1_DMA_RX_BUF_LEN];//定义一个数组用于存放从DMA接收到的遥控器数据

void USART1_Init(void)
{
  LL_USART_InitTypeDef USART_InitStruct;

  LL_GPIO_InitTypeDef GPIO_InitStruct;
  /* Peripheral clock enable */
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA2);
       
  /**USART1 GPIO Configuration  
  PB7   ------> USART1_RX
  PB6   ------> USART1_TX
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_7|LL_GPIO_PIN_6;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
       
        /* USART1_RX Init */
  USART_InitStruct.BaudRate = 100000;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_EVEN;   //偶校验
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(USART1, &USART_InitStruct);

  LL_USART_ConfigAsyncMode(USART1);

  LL_USART_Enable(USART1);

  /* USART1 DMA Init */
  LL_DMA_SetChannelSelection(DMA2, LL_DMA_STREAM_2, LL_DMA_CHANNEL_4);

  LL_DMA_SetDataTransferDirection(DMA2, LL_DMA_STREAM_2, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

  LL_DMA_SetStreamPriorityLevel(DMA2, LL_DMA_STREAM_2, LL_DMA_PRIORITY_HIGH);

  LL_DMA_SetMode(DMA2, LL_DMA_STREAM_2, LL_DMA_MODE_NORMAL);

  LL_DMA_SetPeriphIncMode(DMA2, LL_DMA_STREAM_2, LL_DMA_PERIPH_NOINCREMENT);

  LL_DMA_SetMemoryIncMode(DMA2, LL_DMA_STREAM_2, LL_DMA_MEMORY_INCREMENT);

  LL_DMA_SetPeriphSize(DMA2, LL_DMA_STREAM_2, LL_DMA_PDATAALIGN_BYTE);

  LL_DMA_SetMemorySize(DMA2, LL_DMA_STREAM_2, LL_DMA_MDATAALIGN_BYTE);

  LL_DMA_DisableFifoMode(DMA2, LL_DMA_STREAM_2);

  LL_DMA_SetPeriphAddress(DMA2, LL_DMA_STREAM_2, (u32)&USART1->DR); //配置外设地址
  LL_DMA_SetMemoryAddress(DMA2, LL_DMA_STREAM_2, (u32)USART1_DMA_RX_BUF);  //配置memory的地址
  LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_2, BSP_USART1_DMA_RX_BUF_LEN);  //大小要配合定义的数组类型


  LL_USART_EnableDMAReq_RX(USART1);  //发送DMA请求 通过控制usart_cr3寄存器使用dma传送

  LL_USART_EnableIT_IDLE(USART1);  //使能空闲中断

  LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_2);  //失能数据流
  while(LL_DMA_IsEnabledStream(DMA2, LL_DMA_STREAM_2) != 0); //等待是否清空
  LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_2);  //使能数据流
}

void USART1_IRQHandler(void)
{
        if(LL_USART_IsActiveFlag_IDLE(USART1) != 0)
        {
                uint32_t this_time_rx_len = 0;//本次接收长度 = 0;
               
                LL_USART_ClearFlag_IDLE(USART1);//清空SR寄存器  先清SR才能//清空DR寄存器
                LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_2);  //失能数据流
                LL_DMA_ClearFlag_TC2(DMA2);//清除DMA相关标志位
                LL_DMA_ClearFlag_HT2(DMA2);
               
                LL_USART_DisableDMAReq_RX(USART1); //
               
                this_time_rx_len = BSP_USART1_DMA_RX_BUF_LEN - LL_DMA_GetDataLength(DMA2, LL_DMA_STREAM_2); //获取这一次数据量大小(总长度-保留的长度)
       
                LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_2, BSP_USART1_DMA_RX_BUF_LEN);
               
                LL_DMA_SetMemoryAddress(DMA2, LL_DMA_STREAM_2, (u32)USART1_DMA_RX_BUF);  //配置memory的地址
               
                while(LL_DMA_IsEnabledStream(DMA2, LL_DMA_STREAM_2) != 0); //等待是否清空
                LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_2);  //使能数据流
               
                LL_USART_EnableDMAReq_RX(USART1); //               
        }

}


QQ图片20181209163731.jpg
QQ图片20181209163846.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-6-6
在线时间
5 小时
 楼主| 发表于 2018-12-9 16:43:51 | 显示全部楼层
回复

使用道具 举报

6

主题

108

帖子

1

精华

高级会员

Rank: 4

积分
716
金钱
716
注册时间
2017-4-25
在线时间
203 小时
发表于 2018-12-9 20:15:32 | 显示全部楼层
LL库的没用过 只用过HAL和标准库的。。
http://www.openedv.com/forum.php ... d=284146&extra=
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 04:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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