2021-04-21 STM32串口DMA接收

//接收完成中断
void DMA2_Stream5_IRQHandler(void)

//空闲中断
void USART1_IRQHandler(void)

接收完成DMA中断与串口空闲中断配置不同的中断优先级,会影响这两个中断函数进入。

空闲中断的优先级高于DMA中断,则DMA中断不会进入该中断函数,空闲中断中后读SR,然后读DR寄存器才能清除本次中断,之后则不能进入DMA中断。

如果DMA中断的优先级高于空闲中断,则先进入DMA中断函数,

		DMA_Cmd(DMA2_Stream5, DISABLE); //关闭DMA,防止处理其间有数据
		UART1_ReceiveSize =RECEIVE_BUF_SIZE - DMA_GetCurrDataCounter(DMA2_Stream5);
		DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);//清除DMA2_Steam7传输完成标志
		DMA_SetCurrDataCounter(DMA2_Stream5, RECEIVE_BUF_SIZE);
		DMA_Cmd(DMA2_Stream5, ENABLE);     //打开DMA,防止处理其间有数据

该语句为接收的字节数,DMA_GetCurrDataCounter(DMA2_Stream5)为缓存剩余字节数,RECEIVE_BUF_SIZE 为缓存总数。
清除传输完成标志后也会进入空闲中断函数,但是DMA_SetCurrDataCounter(DMA2_Stream5, RECEIVE_BUF_SIZE);重新设置了缓存大小,则下次进入空闲中断时DMA_SetCurrDataCounter(DMA2_Stream5的缓存大小为RECEIVE_BUF_SIZE大小。

DMA串口发送数据会被其它优先级高的程序打断,造成发送只能发送一半。

while(DMA1_Channel2->CNDTR!=0); 等待发送完成必须要加上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32串口DMA接收是指使用DMA(Direct Memory Access,直接存储器访问)来处理串口接收数据的过程。在这个过程中,外设UART接收到数据后,相应的DMA通道会被激活并启动接收DMA会将接收的每一个字节数据放入DMA接收缓存区,直到接收完所有字节。接收完所有字节后,串口会产生空闲中断,用于判断数据接收完毕。在串口空闲中断中,可以处理接收到的数据,而无需CPU的干预。这样可以提高CPU的效率,同时让CPU可以处理其他更重要的任务。使用DMA进行串口接收可以实现无需CPU中断即可接收串口数据,适用于需要同时进行其他任务的应用场景,如四轴飞行器获取姿态控制方向时需要接收串口数据。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [STM32串口+DMA](https://blog.csdn.net/zn2016/article/details/79049687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32—无需中断来实现使用DMA接收串口数据](https://blog.csdn.net/weixin_34407348/article/details/85940391)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值