Image
Image

等你下课

+ 关注

粉丝 0     |     主题 43     |     回帖 527

stm32f4 串口空闲中断+DMA遇到的奇怪错位问题
2023-10-29 02:05
  • ST MCU
  • 23
  • 1917
  删除USART3_Init()函数最后一句DMA_Transfer_Enable(DMA1_Stream1,USART3_RX_BUFFER_SIZE)即可从根本上解决 ...  
  解决方案 如果不改程序想恢复正常,只要发送长度少于8字节的数据即可,这也是为什么以前缓冲buf较大时程序 ...  
  此后每次发送8字节数据的情况都和上面一样了,如果不单步debug观察,宏观上看起来数据总是错位的。 ...  
  第二次点击发送时,由于NDTR值为7,还可以发送“1234567”,它们被DMA转移到buf[1]~buf[7],然后DMA传输完 ...  
  这样一来就真相大白了!就是因为串口初始化后进行了多余的重新设置数据传输量长度的操作,导致数据流失能, ...  
  为什么会出现这个置位呢,进一步查看数据手册,有如下内容:  
  ......  
  ......  
  按手册查看DMA1->LISR和DMA->HISR,发现在DMA_Transfer_Enable函数中DMA_Cmd(DMA_Streamx, DISABLE)一句执 ...  
  ......  
  进入DMA_Transfer_Enable函数单步调试,发现失能、重设两步都正常,但是最后使能流失败,看了看使能函数, ...  
  在USART3_Init()函数最后一句DMA_Transfer_Enable(DMA1_Stream1,USART3_RX_BUFFER_SIZE);处设置断点,发现 ...  
  debug单步调试,发现进刚进空闲中断的时候缓冲buf其实没收到值,此时USART3->DR中已经是‘1’了,buf[0]处 ...  
  进一步查看USART3->DR寄存器,其值为‘1’,说明第一个数据正常DMA正常传送,奇怪的是为何只发了一个数就进 ...  
  打开debug查看,第一次发送数据“12345678”后,DMA1_Stream1的EN位为1,表明数据流处于使能状态;NDTR值为 ...  
  调试过程 注意,DMA是不受cpu控制的,一旦设置好后就会自动搬运数据,在debug过程中它导致的赋值操作不会在 ...  
  数据缓冲错位问题 (1)问题描述: 发送数据部分没什么问题,之前我设置的接收缓冲buf比传输数据长度多一点 ...  
  //全局变量 #define USART3_RX_BUFFER_SIZE 8 #define USART3_TX_BUFFER_SIZE 5 uint8_t USART3_Rx_Buffer ...  
  DMA接受数据错位问题 1、程序设置 帧长8字节 DMA普通模式 不使用FIFO进行节拍发送 从USART3->DR寄存器向一 ...  
  DMA_Mode_Circular:在循环模式下,最后一次传输结束时, DMA_SxNDTR寄存器的内容会自动地被重新加载为其初 ...  
2
3
近期访客