2.14 STM32 串口传输最佳处理方式 FreeRTOS+队列+DMA+IDLE (二)

紧接着上一篇文章,如何合理处理多个串口接收大量数据。此种方法,很厉害,很NB,首先,利用DMA 可节省大量CUP资源。其次,利用IDLE空闲中断来接收位置个数的数据。最后利用串口DMA环形数据的偏移量、长度,入队,出队处理数据。保证了任务的流畅处理。
串口接收数据:
中心思想
1、开启DMA 环形接收数据模式。
2、触发接收数据中断。
3、假如数据有进来,将上面环形数据的偏移量与长度 入队。
4、出队函数,处理数据。

直接上代码
两个任务完成

#define MAX_FRAME_DISP_LEN       125       
#define MAX_FRAME_DISP_ITEM      5         
#define MaxSize_FRAME_DISP    (MAX_FRAME_DISP_LEN*MAX_FRAME_DISP_ITEM) 

static void RecUart1Temp_Task(void* parameter)
{	
	uint16_t len;
	uint16_t ndtr_last;//上次剩余个数
	BufferLoopData_Typedef buffer_loop;
	BaseType_t xReturn = pdPASS;	

	buffer_loop.start_addr = 0;
	buffer_loop.len = 0;
	ndtr_last = MaxSize_FRAME_DISP;
  while (1)
  {
    //等待有数据消息
		xReturn = xSemaphoreTake(BinarySem_Handle,  portMAX_DELAY); 
			len = Reg_Usart1_CHANNEL_CNDTR;//DMA剩余个数
			//环形数组
			if (ndtr_last != len)//上次与这
  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值