news 2026/5/23 18:30:52

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
雅特力单片机用串口USART_INT_TDE中断比用USART_INT_TRAC的 发送效率要高

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

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


void UART0_SendData(volatile Uint8 *buf, Uint8 len)
{
union
{
Uint8 crc[2];
Uint16 crc16;
} my_crc;
UART0_PointerSend = buf;
UART0_SendCount = len + 2;
my_crc.crc16 = Uart_GenerateCRC(buf, len);
UART0_SendBuffer[len] = my_crc.crc[0];
UART0_SendBuffer[len + 1] = my_crc.crc[1];
//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_ReceiveBuffer[UART0_ReceiveCount] = (USART_ReceiveData(USART1));

UART0_ReceiveCount++;
}
else
{
temp = (USART_ReceiveData(USART1));
}

}
}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 1:12:45

wangEditor粘贴MathType公式转图片格式处理

从迷茫到突破&#xff1a;我在集团信创Word导入系统项目中的成长记 一、初遇难题&#xff1a;在技术迷宫中迷失方向&#xff08;2024年3月&#xff09; "小张&#xff0c;这个政府采购项目的标书必须在今天下班前完成格式调整&#xff01;"主管的催促声还在耳边回响…

作者头像 李华
网站建设 2026/5/22 8:16:08

搜索算法详解:从基础到高级

一、引言 搜索算法是计算机科学中最基本、最重要的算法类别之一。它们用于在数据集合中查找特定元素、寻找最优解或探索可能的路径。搜索算法的效率直接影响程序的性能,因此在各种应用场景中都有广泛的应用,包括数据库查询、路径规划、人工智能、游戏开发等。 本文将从最简单…

作者头像 李华
网站建设 2026/4/30 23:53:28

Java 读取 Excel 文件

Java 读取 Excel 文件一、前置准备&#xff1a;引入依赖方案 1&#xff1a;Apache POI&#xff08;功能全&#xff0c;兼容所有Excel版本&#xff09;方案 2&#xff1a;EasyExcel&#xff08;阿里开源&#xff0c;低内存&#xff0c;推荐大数据量&#xff09;二、方案 1&#…

作者头像 李华
网站建设 2026/5/22 11:46:57

棕榈酰三肽-38:一种“重建肌底”的智能淡纹成分

棕榈酰三肽-38&#xff1a;一种“重建肌底”的智能淡纹成分 棕榈酰三肽-38 Palmitoyl Tripeptide-38与常见的乙酰基六肽-8&#xff08;又称阿基瑞林&#xff09;作用机理完全不同&#xff0c;代表了抗老淡纹的另一种前沿思路。 核心机理对比&#xff1a; 乙酰基六肽-8&#xff…

作者头像 李华
网站建设 2026/5/23 16:14:49

高并发系统卡顿排查:全链路压测平台对比与瓶颈定位指南

核心观点摘要 1. 高并发系统卡顿问题普遍存在于电商、金融等行业&#xff0c;全链路压测是定位性能瓶颈的主流方案&#xff0c;可有效识别接口、数据库、缓存等环节异常。 2. 当前主流全链路压测平台分为SaaS化服务与私有化部署两类&#xff0c;分别在易用性、弹性成本和定…

作者头像 李华
网站建设 2026/5/16 8:34:12

12、使用WRT54G保障无线网络安全

使用WRT54G保障无线网络安全 1. 引言 无线网络安全多年来一直是计算机安全领域的热门话题。未受保护的无线网络很容易被攻破,这可能会泄露个人信息和计算机文件,还可能被用于攻击他人或进行其他不当活动。通过使用多层安全措施,特别是Wi-Fi受保护访问(WPA)或WPA2,可以降…

作者头像 李华