历史上的今天
返回首页

历史上的今天

今天是: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;

推荐阅读

史海拾趣

GCi Technologies公司的发展小趣事
使用定时器设置所需的充电时间。
AMICC [AMIC TECHNOLOGY]公司的发展小趣事

随着产品线的不断丰富和技术实力的不断提升,AMICC开始积极拓展国内外市场。公司通过与大型电子企业建立战略合作关系,成功打入国际市场。同时,AMICC还积极参加各类行业展会和交流活动,提升品牌知名度和影响力。在市场拓展的过程中,AMICC始终坚持客户至上的原则,为客户提供优质的产品和服务,赢得了客户的信任和好评。

思博科技(Cybermax)公司的发展小趣事

为了确保产品质量和客户满意度,思博科技高度重视质量管理体系建设。公司引进了先进的质量管理理念和工具,建立了完善的质量管理体系。同时,公司还通过了ISO9001质量管理体系认证和多项行业认证。这些认证不仅证明了公司在质量管理方面的实力,还为客户提供了可靠的质量保证。

Habia Cable公司的发展小趣事

为了进一步扩大市场份额,思博科技开始积极拓展国际市场。公司参加了多个国际电子展会,与全球各地的客户建立了联系。同时,思博科技还与国际知名企业展开了合作,共同研发新产品。这些合作不仅提升了公司的技术水平,还为公司带来了更多的商机。在国际市场的拓展过程中,思博科技逐渐成为了全球电子行业的佼佼者。

极海半导体(Geehy)公司的发展小趣事

为了确保产品质量和客户满意度,思博科技高度重视质量管理体系建设。公司引进了先进的质量管理理念和工具,建立了完善的质量管理体系。同时,公司还通过了ISO9001质量管理体系认证和多项行业认证。这些认证不仅证明了公司在质量管理方面的实力,还为客户提供了可靠的质量保证。

American Power Devices Inc公司的发展小趣事

在电子行业的初期,APD公司凭借其卓越的技术研发团队,成功开发出了一款高效能的电源管理芯片。这款芯片以其低能耗、高稳定性等特点迅速获得了市场的认可。随着技术的不断迭代和更新,APD持续投入研发,推出了一系列具有竞争力的产品,逐渐在电源管理领域树立了领先地位。

问答坊 | AI 解惑

第五届全国大学生电子设计竞赛获奖作品选编

本帖最后由 paulhyde 于 2014-9-15 09:03 编辑 文件为pdg格式,用超星阅读器就可以打开了 四个文件要全部下载到同一个文件夹下才能全部解压出来  …

查看全部问答>

低频功率放大器

设计一多媒体放大器  要求失真小 功率大 [ 本帖最后由 315515297 于 2009-5-6 14:00 编辑 ]…

查看全部问答>

新买的示波器,怎么才能知道是不是全新的!

司新买了个普源的DS1052E,但商家送过来的时候已经拆封了 看起来是新的,商家也坚持是新的 怎么样才能知道是新的呢,听说有一个地方可以看开机次数!…

查看全部问答>

首届时代民芯杯电子设计大赛奖项揭晓,24万奖金全部有主

首届“时代民芯”杯电子设计大赛评审专家对参赛作品进行了评审,评审采取设计报告评审和现场答辩及实物演示相结合的方式进行,最终评审出11项大奖。从即日起进入异议期。 评委名单: 中国半导体行业协会 秘书长 陈 贤 《单片机与嵌入式系统应用 ...…

查看全部问答>

哪种SDRAM 是64M BYTE?

S3C2440的开发板,原带32M BYTE * 2 的内存。想扩大到64M BYTE * 2,请问哪家公司提供64M的SDRAM, 什么型号?SAMSUNG的SDRAM不想再用了…

查看全部问答>

#include 出现 C:\KEIL\C51\INC\SYNCMOS\SM8958A.H(11): error C231: 'P0':

我的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 ...…

查看全部问答>

如何提高NAT效率?

系统加了NAT功能后,吞吐率很低。有没有fast NAT之类的方法提高系统性能啊? 给个思路即可…

查看全部问答>

CCS下调试EK-8962时出错得原因?

前几天我在调试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 ...…

查看全部问答>

伤了

#include<reg52.h>#include\"74hc595.h\"#define uchar unsigned char#define uint unsingned intuchar sa[32]={0};uchar sb[32]={0};uchar sx=0,sy=0,num,sf=1,i,sl=1; void main(){        TMOD = 0x11;&nb ...…

查看全部问答>