我们换一个思路,我要串口发送寄存器为空的时候就来一个中断!
#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);
}
}
}
}
看到中断里面 没有清的函数?怎么办?办法看下文