雅特力单片机用串口USART_INT_TDE中断比用USART_INT_TRAC的 发送效率要高

雅特力单片机用串口USART_INT_TDE中断(发送缓冲区空闲时中断)比用USART_INT_TRAC(发送全部完成时中断)的 发送效率要高:

请自行验证代码的正确性,不对此负责!!

void UART0_SendData(volatile Uint8 *buf, Uint8 len)

{

union

{

Uint8 crc2;

Uint16 crc16;

} my_crc;

UART0_PointerSend = buf;

UART0_SendCount = len + 2;

my_crc.crc16 = Uart_GenerateCRC(buf, len);

UART0_SendBufferlen = my_crc.crc0;

UART0_SendBufferlen + 1 = my_crc.crc1;

//UART0_Enable(B_FALSE, B_TRUE);

UART0_Enable(B_FALSE, B_TRUE);

}

#define RS485_DIR_PORT GPIOF

#define RS485_DIR_PIN GPIO_Pins_7

#define UART0_SEND_ENABLE() GPIO_SetBits(RS485_DIR_PORT, RS485_DIR_PIN)

#define UART0_RECEIVE_ENABLE() GPIO_ResetBits(RS485_DIR_PORT, RS485_DIR_PIN)

void UART0_Enable( Uint8 xRxEnable, Uint8 xTxEnable)

{

if( xRxEnable )

{

UART0_RECEIVE_ENABLE();

USART_INTConfig(USART1, USART_INT_RDNE, ENABLE);

USART_INTConfig(USART1, USART_INT_TDE, DISABLE);

}

if( xTxEnable )

{

UART0_SEND_ENABLE();

USART_INTConfig(USART1, USART_INT_RDNE, DISABLE);

USART_INTConfig(USART1, USART_INT_TDE, ENABLE);

}

}

u32 V2_1_left_times_for_writeOut=0;

u8 started_writeOut=0;

void TMR4_for_when_UART0_Enable_falt(void)//20us 一次

{

if(V2_1_left_times_for_writeOut>0){

V2_1_left_times_for_writeOut--;

}

if(UART0_SendCount==0&&V2_1_left_times_for_writeOut==0){

if(started_writeOut==1){

UART0_Enable(B_TRUE, B_FALSE);//这个用于保证不发生:如果丢了一次UART0_Enable(B_TRUE, B_FALSE),则再也不能进入接收模式,导致通讯卡死

started_writeOut=0;

}

}

}

//20us中断一次的定时器中断:

void TMR4_GLOBAL_IRQHandler(){ //100khz RCLK

if (TMR_GetINTStatus(TMR4, TMR_INT_Overflow) != RESET)

{

TMR_ClearITPendingBit(TMR4, TMR_INT_Overflow);

TMR4_for_when_UART0_Enable_falt();

}

}

void USART1_IRQHandler(void)

{

volatile Uint8 dummy = 0;

volatile Uint8 temp = 0;

if(USART_GetITStatus(USART1, USART_INT_ERR) != RESET)

{

USART_ClearITPendingBit(USART1, USART_INT_ERR);

}

if(USART_GetITStatus(USART1, USART_INT_ORERR) != RESET)

{

USART_ClearITPendingBit(USART1, USART_INT_ORERR);

}

if(USART_GetITStatus(USART1, USART_INT_NERR) != RESET)

{

USART_ClearITPendingBit(USART1, USART_INT_NERR);

}

if(USART_GetITStatus(USART1, USART_INT_FERR) != RESET)

{

USART_ClearITPendingBit(USART1, USART_INT_FERR);

}

if(USART_GetITStatus(USART1, USART_INT_TDE) != RESET)

{

USART_ClearITPendingBit(USART1, USART_INT_TDE);

if(0 != UART0_SendCount)

{

UART0_SendOneByte((Uint8)(*UART0_PointerSend));

UART0_SendCount--;

UART0_PointerSend++;

started_writeOut=1;

V2_1_left_times_for_writeOut=400;//200的话2400波特率下不行,400在2400波特率下可以(在2400波特率下传输1个字节的时间大约 4.17毫秒,所以超时时间必须大于4.2ms),200*20us=4ms,考虑 UART0_Enable(B_TRUE, B_FALSE); 丢了一次后,TMR4_GLOBAL_IRQHandler里强制设置UART0_Enable(B_TRUE, B_FALSE)还能来得及,比如6ms内回码时可以

}

else

{

USART_INTConfig(USART1, USART_INT_TDE, DISABLE);

USART_INTConfig(USART1, USART_INT_TRAC, ENABLE);

}

}

else

if(USART_GetITStatus(USART1, USART_INT_TRAC) != RESET)

{

USART_ClearITPendingBit(USART1, USART_INT_TRAC);

USART_INTConfig(USART1, USART_INT_TRAC, DISABLE);

UART0_Enable(B_TRUE, B_FALSE); //如果丢了一次UART0_Enable(B_TRUE, B_FALSE),则再也不能进入接收模式,导致通讯卡死

started_writeOut=0;

}

if(USART_GetITStatus(USART1, USART_INT_RDNE) != RESET ) //接收中断使能

{

Flag.ModbusFrameStart = B_TRUE;

Flag.ModbusFrameOver = B_FALSE;

Flag.UartDelay35ms = 0;

USART_ClearITPendingBit(USART1, USART_INT_RDNE);

if(UART0_ReceiveCount < 39)

{

UART0_ReceiveBufferUART0_ReceiveCount = (USART_ReceiveData(USART1));

UART0_ReceiveCount++;

}

else

{

temp = (USART_ReceiveData(USART1));

}

}

}

相关推荐
未若君雅裁4 分钟前
JVM 垃圾回收算法与分代回收机制
java·jvm·算法
智者知已应修善业10 分钟前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机
skywalk816313 分钟前
记录段言的开发过程
开发语言·学习·编程
摇滚侠21 分钟前
SpringMVC 入门到实战 简介和入门案例 01-13
java·后端·spring·intellij-idea
未若君雅裁21 分钟前
JVM 垃圾回收器全景与G1深度解析
java·开发语言·jvm
霸道流氓气质21 分钟前
Java 大数据量异步处理方案:线程池 vs 消息队列
java·开发语言
devilnumber21 分钟前
想真正吃透 + 灵活运用 Java 代理模式
java·开发语言·代理模式
蝎子莱莱爱打怪22 分钟前
自用推荐|XTerminal:我心中 SSH 客户端的终极形态
java·后端·程序员
AIGS00126 分钟前
向量空间JBoltAI:重塑工业智能的四大支柱
java·人工智能·ai大模型应用
AC赳赳老秦26 分钟前
OpenClaw 助力技术面试:自动生成面试题、模拟面试、整理面试知识点
开发语言·python·面试·职场和发展·自动化·deepseek·openclaw