近期发现很多人都不愿意用中断方式,来使用STM32的串口。说是问题多。但自己测试了,中断没有任何问题。无论接收和发送。
我贴出源程序。
注意一点是:USART_ITConfig(USART3, USART_IT_TXE, ENABLE); 这个函数一旦执行,就会启动一次中断,正是这个原因,许多人想尽方法去避免空发送,但实际上这是设计者的智慧所在。用空中断启动发送!无需在执行:SART_SendData(USART3, UART3_Buf.SendBuf[UART3_Buf.sPoint++]); //启动发送!
一旦启动了中断,就在中断程序里继续发送。
发送初始化程序:将要发送的数据准备好,放在一个BUF里:
COM3_EN(SEND_EN);//485的EN脚
UART3_Buf.sPoint=0;
UART3_Buf.sOK=SEND_NOW; //状态机
UART3_Buf.sLong=Long; //数据长度
memcpy(UART3_Buf.SendBuf,p,Long); //数据转移!
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
中断程序:
void Uart3_Do(void){
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){
//*********************************************************
UART3_Buf.rOK=RECE_NOW; //接收....
//*********************************************************
UART3_Buf.RsDelay=3; //RS_DELAYK; //复位计时器!
//*********************************************************
UART3_Buf.ReceBuf[UART3_Buf.rPoint++]=(unsigned char)USART_ReceiveData(USART3);
//*********************************************************
if(UART3_Buf.rPoint >= sizeof(UART3_Buf.ReceBuf)){
UART3_Buf.rPoint=0;
UART3_Buf.rOK=RECE_OVER; //接收完毕
//USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
}
}
//*******************************************************************
if ( USART_GetITStatus(USART3, USART_IT_TXE ) != RESET){
if (UART3_Buf.sPoint >= UART3_Buf.sLong){ //采用1个字节一个页发送!
USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
UART3_Buf.sOK=SEND_OVER; //发送完毕
UART_ReceStart(COM3_PC,sizeof(UART3_Buf.ReceBuf)); //停止发送,允许接收中断!
}else{
USART_SendData(USART3, UART3_Buf.SendBuf[UART3_Buf.sPoint++]); //启动发送!
}
}
}
。。。。
数据结构:
typedef struct{
volatile unsigned short rPoint; //接收指针个数
volatile unsigned short sPoint; //发送指针个数
volatile unsigned short rLong; //接收长度
volatile unsigned short sLong; //发送长度
volatile unsigned short RsDelay; //通讯采用延时接收!
unsigned char SendBuf[250];
unsigned char ReceBuf[250];
volatile unsigned char rOK; //接收标志!
volatile unsigned char sOK; //发送标志!
}UART_DATA;
上一篇:STM32 PVD中断问题
下一篇:STM32基础实验4(按键中断)
推荐阅读最新更新时间:2024-03-16 16:19