STM32 DMA使用
2017-10-27 10:01
190 查看
一、串口接收 DMA
串口接收使用DMA,如果设置的是单次模式,接收缓冲器的大小至少和接收个数一样大,如果缓冲器小于接收个数,缓冲器的内容有可能被覆盖,如果一次接收到的数据大于设置的接收个数,超过接收个数的数据将会被清零。
二、串口发送DMA
今天发送串口数据的时候想使用双缓冲区交替使用然后尽量避免数据还没发出去又被新到的数据冲掉,调试的时候发现一个问题,第一个字节会被发送两遍。程序是这样的: DMA_Cmd(DMA1_Channel7,DISABLE);
DMA_DeInit(DMA1_Channel7);
Init_UART2DMA(DMA1_Channel7,(u32)(&(USART2->DR)),(u32)(uart2var.ShootSig),Shootedlength);
UART2DMA_Once(DMA1_Channel7,Shootedlength);
USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);
关闭DMA,重新初始化切换发送缓冲区地址设置缓冲区大小,设置发送个数,打开DMA。这样设置会出现第一个字节发送两遍的情况。后来修改了下程序,因为在初始中打开了DMA,设置发送次数的时候关闭DMA、设置次数、打开DMA,我想是不是返回打开关闭造成的,最后修改成直接在初始化中设置要发送的个数,不再后边在用函数修改,切换缓冲区的过程只关闭一次打开一次,这样就好了。
串口接收使用DMA,如果设置的是单次模式,接收缓冲器的大小至少和接收个数一样大,如果缓冲器小于接收个数,缓冲器的内容有可能被覆盖,如果一次接收到的数据大于设置的接收个数,超过接收个数的数据将会被清零。
二、串口发送DMA
今天发送串口数据的时候想使用双缓冲区交替使用然后尽量避免数据还没发出去又被新到的数据冲掉,调试的时候发现一个问题,第一个字节会被发送两遍。程序是这样的: DMA_Cmd(DMA1_Channel7,DISABLE);
DMA_DeInit(DMA1_Channel7);
Init_UART2DMA(DMA1_Channel7,(u32)(&(USART2->DR)),(u32)(uart2var.ShootSig),Shootedlength);
UART2DMA_Once(DMA1_Channel7,Shootedlength);
USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);
关闭DMA,重新初始化切换发送缓冲区地址设置缓冲区大小,设置发送个数,打开DMA。这样设置会出现第一个字节发送两遍的情况。后来修改了下程序,因为在初始中打开了DMA,设置发送次数的时候关闭DMA、设置次数、打开DMA,我想是不是返回打开关闭造成的,最后修改成直接在初始化中设置要发送的个数,不再后边在用函数修改,切换缓冲区的过程只关闭一次打开一次,这样就好了。
相关文章推荐
- 浅谈STM32的DMA模块的使用
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
- 浅谈STM32的DMA模块的使用
- STM32DMA使用详解
- STM32的使用之SPI通信DMA模式
- 11、STM32 的 DMA 使用 - ADC 采用 DMA 模式
- 关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题
- Stm32作为主设备使用DMA接收SPI数据
- STM32使用串口1配合DMA接收不定长数据,大大减轻CPU载荷。
- STM32L1XX使用HAL_UART_Transmit_DMA发送串口数据
- STM32 SPI DMA 的使用
- STM32串口使用心得(一)——DMA+空闲中断接收
- 浅谈STM32的DMA模块的使用
- 浅谈STM32的DMA模块的使用
- STM32—无需中断来实现使用DMA接收串口数据
- STM32采用HAL库使用usart_DMA问题
- STM32 DMA使用详解
- STM32 串口+DMA的使用
- 浅谈STM32的DMA模块的使用
- STM32 SPI DMA 的使用