怎么办?
1没有找到__HAL_UART_CLEAR_IT那么蹩脚的用__HAL_UART_DISABLE_IT吧
2每次写的时候 也就是生产者的时候 启动它!
3每次回调函数过来的时候 就DISABLE_IT关闭它!
开始:
第一步:init的时候可以不要了!!
uint8_t GK_usart_init(GK_USARTBASE_TYPE *myuart,uint8_t usartid)
{
switch(usartid)//绑定关系
{
case 1:myuart->huart=&huart1;break;
case 2:myuart->huart=&huart2;break;
default :return 0;
}
HAL_UART_Receive_IT(myuart->huart, &myuart->one, 1);//开启中断接收 1个1个的接收
__HAL_UART_ENABLE_IT(myuart->huart,UART_IT_IDLE);//开启空闲中断
//__HAL_UART_ENABLE_IT(myuart->huart,UART_IT_TXE);//没有必要了!
return 1;
}
第二部:写入
int fputc(int ch, FILE *f)//FILE 需要头文件 #include <stdio.h> 放在main.h去吧
{
rbWrite(&pRbU1, (uint8_t *)&ch, 1);
//HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_TXE); //=============开启
return ch;
}
第三步:读出
void GK_UART_TxIdleCallback(GK_USARTBASE_TYPE *myuart)
{
uint8_t tmpLen = 0,tmpData=0;
int32_t ret = 0;
if(__HAL_UART_GET_IT(myuart->huart,UART_IT_TXE))
{
__HAL_UART_DISABLE_IT(myuart->huart,UART_IT_TXE);//============关闭
tmpLen = rbCanRead(&pRbU1);
if(0 == tmpLen)
{
return;
}
for(uint8_t i=0; i<tmpLen; i++)
{
ret = rbRead(&pRbU1, &tmpData, 1);
if(0 != ret)
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&tmpData, 1 , 0xffff);
while (huart1.gState != HAL_UART_STATE_READY);
}
}
}
}
调用:
void USART1_IRQHandler(void)
{
GK_UART_TxIdleCallback(&GKU1);
}
#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");
}
}
注意:在初始化之前 不要printf!!!!!
成功完成了 异步printf 用到了FIFO 没有用OS的任务!
$ git remote -v
origin git@gitee.com:GKoSon/STM32USARTMODE.git (fetch)
origin git@gitee.com:GKoSon/STM32USARTMODE.git (push)