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

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

[复制链接]
feixiang20 提问时间:2018-12-9 17:44 /
用LL库和hal库分别配置了一遍串口接收,可是接收的数据都一样,和正确的差几位,困扰了很长时间,求助!
这是错误的数据

1.jpg

这是应该接收到的数据

2.jpg

这是配置函数和中断函数  用的是不定长中断
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); //               
        }

}

评分

参与人数 1 ST金币 +20 收起 理由
STMCU + 20

查看全部评分

收藏 评论1 发布时间:2018-12-9 17:44

举报

1个回答
wenyangzeng 回答时间:2018-12-9 18:42:40
本帖最后由 wenyangzeng 于 2018-12-9 18:46 编辑

楼主那个非标的波特率100000貌似应该改成国际标准值。举例使用115200比100000误码率要低很多的。

评分

参与人数 1ST金币 +3 蝴蝶豆 +2 收起 理由
STMCU + 3 + 2

查看全部评分

所属标签

相似问题

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