news 2026/7/7 20:29:07

雅特力单片机用串口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/7/6 18:02:32

wangEditor处理政府公文修订记录保留功能

&#x1f4dd; Word一键转存CMS升级手记 &#x1f680; 项目背景 大家好&#xff0c;我是江西某高校计算机专业大三的"代码狂魔"&#xff0c;正在给我的CMS新闻管理系统做一次"整容手术"——添加Word一键转存功能&#xff01;每次看到编辑部的妹子们手动…

作者头像 李华
网站建设 2026/7/7 9:31:52

SCI论文精读:YOLO:一种适应明亮和黑暗环境的鸭群日常行为识别模型

前言&#xff1a; **SCI精读是一项高投入、高回报的科研投资。 它初期看似缓慢&#xff0c;但从长远看&#xff0c;它是构建深厚学术功底、敏锐科研嗅觉和强大创新能力的唯一捷径。将精读养成习惯&#xff0c;它最终会从一项“任务”变成一种能带给你巨大成就感和乐趣的“能力…

作者头像 李华
网站建设 2026/7/7 20:24:41

wangEditor支持信创系统excel数据导入功能

教育政府网站信创环境富文本编辑器重构记&#xff1a;从UEditor困境到自主适配方案的突破 一、项目启动&#xff1a;双重挑战下的紧急需求 2024年6月&#xff0c;某省级教育厅下属的继续教育平台发起紧急需求&#xff1a;需在1个月内完成富文本编辑器升级&#xff0c;核心要求…

作者头像 李华
网站建设 2026/7/7 8:18:54

LobeChat开发者必读:最佳实践与常见问题解决方案汇总

LobeChat开发者必读&#xff1a;最佳实践与常见问题解决方案汇总 在大语言模型&#xff08;LLM&#xff09;快速普及的今天&#xff0c;越来越多开发者不再满足于“调用API 简单前端”的粗糙交互方式。如何构建一个既美观又灵活、既能对接多种模型又能保障数据安全的AI助手界面…

作者头像 李华
网站建设 2026/7/7 6:57:02

用电安全管理系统的三大系统架构

当我们谈论能源危机和碳中和时&#xff0c;有一个被忽略的真相正潜伏在每个开关背后——超过三分之一的工业火灾与重大安全事故&#xff0c;都始于那些看似温顺的电流。传统用电安全如同在黑暗中摸索&#xff0c;而智能用电安全管理系统&#xff0c;正在为这张无形的能量网络点…

作者头像 李华
网站建设 2026/7/7 1:51:32

SPSS——非参数检验-“单样本K-S检验”

单样本K-S检验 概念 单样本K-S检验是以两位苏联数学家柯尔莫哥和斯米诺夫的名字命名的,是一种拟合优度检验,用于探索连续型随机变量的分布。 卡方检验和K-S检验都可以用于检验所在样本的总体分布和理论分布的拟合优度。 二者的不同在于: 卡方检验主要是用于分类数据的,K…

作者头像 李华