历史上的今天
今天是:2024年12月03日(星期二)
2018年12月03日 | STM32串行通讯采用中断方式发送,接收
2018-12-03 来源:eefocus
近期发现很多人都不愿意用中断方式,来使用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(按键中断)
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:03 编辑 文件为pdg格式,用超星阅读器就可以打开了 四个文件要全部下载到同一个文件夹下才能全部解压出来 … 查看全部问答> |
|
司新买了个普源的DS1052E,但商家送过来的时候已经拆封了 看起来是新的,商家也坚持是新的 怎么样才能知道是新的呢,听说有一个地方可以看开机次数!… 查看全部问答> |
|
首届“时代民芯”杯电子设计大赛评审专家对参赛作品进行了评审,评审采取设计报告评审和现场答辩及实物演示相结合的方式进行,最终评审出11项大奖。从即日起进入异议期。 评委名单: 中国半导体行业协会 秘书长 陈 贤 《单片机与嵌入式系统应用 ...… 查看全部问答> |
|
S3C2440的开发板,原带32M BYTE * 2 的内存。想扩大到64M BYTE * 2,请问哪家公司提供64M的SDRAM, 什么型号?SAMSUNG的SDRAM不想再用了… 查看全部问答> |
|
#include 我的project 里24C16.C、24C16.h、CS5532.C、cs5532.h、main.c五个文件,使用的是syncmos 的sm8958a 。其中在24C16.H里有#include ,在cs5532.h里也有#include ,现在我在main.c里有#include \"24c16.h\" 和 #include \"cs5532.h\",当我build main ...… 查看全部问答> |
|
前几天我在调试EKK-8962时,IDE为CCS4.2.4,在debug时出现如下的错误:CORTEX_M3_0: Error connecting to the target: The target board you are attempting to connect to does not appear to be a Stellaris IDK and is not supported with thi ...… 查看全部问答> |




