挑战串口发送3--发送空闲中断






我们换一个思路,我要串口发送寄存器为空的时候就来一个中断!
#define UART_IT_TXE   
全局看到(就是看看 你就懂了)

以前写过:
void USART3_IRQHandler(void)
{
	if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE))//保护一下 空闲来了
	{
		UsartReceive_IDLE(&huart3);
	}	
  HAL_UART_IRQHandler(&huart3);
}
现在我们写:
if(__HAL_UART_GET_FLAG(&huart1,UART_IT_TXE))
	{
		XXXXX
	}	

思路:
第一步:init的时候	
__HAL_UART_ENABLE_IT(myuart->huart,UART_IT_TC);
__HAL_UART_ENABLE_IT(myuart->huart,UART_IT_TXE);
--成功!
第二部:it增加函数
void GK_UART_TxIdleCallback(GK_USARTBASE_TYPE *myuart)
{
}
此时发现惊天bug!!!!!以前的空闲中断就是错误的!!!!!
void GK_UART_RxIdleCallback(GK_USARTBASE_TYPE *myuart)
{
	if(__HAL_UART_GET_FLAG(myuart->huart,UART_FLAG_IDLE))---这个函数不行 他是看你有没有设置使能
	{
		__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);
    myuart->received2idle=1;
	}
}

void GK_UART_TxIdleCallback(GK_USARTBASE_TYPE *myuart)
{
	if(__HAL_UART_GET_IT_SOURCE(myuart->huart,UART_IT_TXE))--这个函数才可以 他是看你设定的中断有没有到
	{
      printf("5");
	}
}

现在基本明朗的 编程思路:
开启串口发送空闲中断(也就是TX没事的时候就来IT)
查看我约定的FIFO里面有么有数据 也就是读FIFO 直接读走 它是消费者
任务中的printf是消费者 直接把数据放到FIFO即可!

开始:
1
__HAL_UART_ENABLE_IT(myuart->huart,UART_IT_TXE);	//不能有!有了就死机!它的服务函数不知道写
2
#include "ringBuffer.h"
rb_t pRbU1; 
uint8_t TXBUF[100];
void TXFIFOInit(void)
{    
    pRbU1.rbCapacity = 100;
    pRbU1.rbBuff = TXBUF;
    if(0 == rbCreate(&pRbU1))
	{
		printf("rbCreate Success \n");
	}
	else
	{
		printf("rbCreate Faild \n");
	}
}
3
void GK_UART_TxIdleCallback(GK_USARTBASE_TYPE *myuart)
{
	uint8_t tmpLen = 0,tmpData=0;
	int32_t ret = 0;
	if(__HAL_UART_GET_IT_SOURCE(myuart->huart,UART_IT_TXE))
	{
			printf("1");//会一直输出 死机 因为。。没有找到清除的函数__HAL_UART_CLEAR_IT(myuart->huart,UART_CLEAR_OREF);

		tmpLen = rbCanRead(&pRbU1);
		if(0 == tmpLen)
		{
			return;
		}

		for(uint8_t i=0; i<tmpLen; i++)
		{
			ret = rbRead(&pRbU1, &tmpData, 1);//这里类似中断 每次读一个数据出来tmpData
			if(0 != ret)
			{
						HAL_UART_Transmit(&huart1 , (uint8_t *)&tmpData, 1 , 0xffff); 
						while (huart1.gState != HAL_UART_STATE_READY);
			}
		}
	}
}

看到中断里面 没有清的函数?怎么办?办法看下文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值