首页 > 其他分享 >usart+dma+idel 大量数据传输

usart+dma+idel 大量数据传输

时间:2024-12-24 21:30:44浏览次数:5  
标签:idel dma CODE HAL usart UART huart1 USER USART1

当串口需要接收到大量的数据,我们可以采用usart+dma+idel中断的方式来处理数据

因为要使用串口中断需要先在串口初始化中使能中断

  /* USER CODE BEGIN USART1_Init 2 */
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  /* USER CODE END USART1_Init 2 */

定义接收缓冲区

/* USER CODE BEGIN 0 */
uint8_t Rxbuff[Rbuffsize]={0};
uint16_t Rxnum ;

/* USER CODE END 0 */
/* USER CODE BEGIN Private defines */
#define Rbuffsize 256
extern uint8_t Rxbuff[Rbuffsize];
extern uint16_t Rxnum;
/* USER CODE END Private defines */

操作中断服务函数

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)==SET)
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		HAL_UART_DMAStop(&huart1);
		Rxnum=Rbuffsize-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
		HAL_UART_Transmit_DMA(&huart1,Rxbuff,Rxnum);

	}
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

判断是否是空闲中断

清楚标志位

停止dma

计算传输字节数

传输剩余字节

因为没有设置临时缓冲区,所以要在中断完成回调函数中重新使能Dma

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
   if(huart->Instance==USART1)
	 {
			Rxnum=0;
		 memset(Rxbuff,0,Rbuffsize);
			HAL_UART_Receive_DMA(&huart1,Rxbuff,Rbuffsize);
	 
	 }



}
	

另外要清空数组和传输字节数。

编译完成。

传输正常。刚开始调试的时候有错误,一直不停的收到数据,查bug发现是DMA模式都设成循环了,在这里usart_tx应该是normal模式,不然就会一直收到消息。

思考:如何设置临时缓冲区处理

能否用循环队列处理

能否在dma传输完成callback函数重新使能dma传输

只是在中断服务函数中设置标志位, 在callback函数中操作数据是否可以。

学习笔记,有歧义的地方,感谢指出

标签:idel,dma,CODE,HAL,usart,UART,huart1,USER,USART1
From: https://blog.csdn.net/qq_61556106/article/details/144634031

相关文章

  • 关于stm32f407 cherryusb初始化失败“This dwc2 version does not support dma mode,
    初学cherryusb,照着论坛帖子操作,将cherryusb软件包加入到407工程,编译完成后,下载,出现如下问题:[I/USB]dwc2has1channelsanddfifodepth(32-bitwords)is0[E/USB]Thisdwc2versiondoesnotsupportdmamode,sostopworking通过反复确认,各种定位尝试,最终发现是usb模......
  • DMA与串口
    所写都是已知,未知并未包含,也并未去试1.串口有两种接收方式:定长与变长。每一种又分三类:普通,中断,DMA方式。定长:HAL_UART_Receive()  ,callback函数:voidHAL_UART_RxCpltCallback不定长:HAL_UARTEx_ReceiveToIdl,callback函数:voidHAL_UARTEx_RxEventCallback注意:......
  • 股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDM
    ​本文中所有接口均可直接在浏览器打开获取数据,为了便于大家验证有效性,已经做好了超链接,直接点击即可!沪深两市股票列表API接口链接(可点击验证):https://api.mairui.club/hslt/list/b997d4403688d5e66a【实时数据接口】沪深两市实时交易数据接口API接口链接(可点击验证):htt......
  • 串口空闲中断+DMA收发不定长数据
    编写代码时遇到了两个问题在串口使用DMA传输数据并且需要每传输一帧数据后产生空闲中断时出现问题问题原因:误认为hal库串口的空闲中断和接收中断使用的是同一个接收回调函数HAL_UART_Receive_IT(该函数会开启接收中断:标志位UART_IT_RXNE),经过查找发现接收中断回调函数只是在置......
  • 【I2C与USART及USB通讯方式对比】
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、电平区别二、读写操作对比总结前言常见的通讯方式I2C、USART、USB对比记忆一、电平区别SDA和SCL如何表示逻辑状态的SCL在高电平期间,SDA也为高电平时,表示逻辑1。SCL在高电平期......
  • k8s-rdma-shared-dev-plugin
    文章目录前言一、创建k8s集群二、启用primarynetwork三、启用secondarynetworkk8s-rdma-shared-dev-pluginMultusCNISecondaryCNIMulti-NetworkCRD四、启用pod五、在pod中启动RoCE流量总结前言写给自己的入门篇。后续会在原理方面持续更新一、创建k8s集群k8s集......
  • Extension Can't Connect to NeatDownloadManager Application,You Can :
    ExtensionCan'tConnecttoNeatDownloadManagerApplication,YouCan:1-ChecklfNeatDownloadManagerisRunning.2-orHolddownDelete-KeyandclickontheDownloadlink.3-orDisableNeatDownloadManagerExtensiontemporarily.  NeatDownloadManager应用程......
  • python、JAVA等多种语言演示免费获取股票数据(实时数据、历史数据、CDMA、KDJ等指标数
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • STM32之ADC采集和DMA传输(八)
    STM32F407系列文章-内部ADC采集和DMA传输(八)目录前言一、ADC特性二、DMA特性三、ADC采集1.单通道ADC采集1.头文件定义2.函数adc_init()3.函数HAL_ADC_MspInit()4.函数adc_channel_set()5.函数adc_get_result()6.函数adc_get_result_average()2.多通道ADC采集四......
  • 科普文:软件架构网络系列之【RDMA技术梳理】
    概叙RDMA(RemoteDirectMemoryAccess,远程直接数据存取)是一种允许网络中的计算机直接从内存中读写数据的技术,而无需本地系统的CPU参与。这种机制可以显著减少网络传输的延迟和提高数据吞吐量,同时降低了CPU的使用率,使得高性能计算、大规模数据处理和云计算等场景下的网络通信更......